【发布时间】:2018-04-09 13:55:31
【问题描述】:
我试图使用 A* 算法找到从巴士站 A 到巴士站 B 的最短路径/最佳路径,其中包含站 A 的巴士路线和包含站 B 的巴士路线可能没有共同的巴士站。
(我还想以这种方式更改搬家费用,以便我使用尽可能少的公共汽车到达目的地)
My BusRoute Class 包含一个公交车站的链表,每个车站都有名字、经纬度
我用来表示 A* 中状态的 NODE 类:
public class Node
{
double gCost;
double hHeuristic;
double f;//f=g+h
Node parent;
BusStation station;//contains lat,lng name
String reached;//is either "Bus" or "Walking" , how i reached this node
int busRouteId;//via which route i reached this station
}
gCost 是 2 个站点之间的 Hassine 距离
hHeuristic是当前站点和目标之间的Hasine距离
我不断扩展优先级队列中 f 值最低的节点,因为它有目标站
这是我从当前节点生成所有可能的转换的部分:
ArrayList<Node> posibleMoves=getPosibleMoves(current);
for(Node p:posibleMoves){
if(!visitedNodes.contains(p) ) {
double predictedDistance = calculateHeuristic(p, goal);
double cost;
if (p.getReached().equals("Walking")) {
cost=(10* havesineDistance(current.getLat(), current.getLng(), p.getLat(), p.getLng())) + current.getgCost();
} else { //Reached using a bus
cost=havesineDistance(current.getLat(), current.getLng(), p.getLat(), p.getLng()) + current.getgCost();
}
p.setgCost(cost);
p.sethHeuristic(predictedDistance);
p.setF(cost + predictedDistance);
p.setParent(current);
priorityQueue.add(p);
}
}
}
getPossibleMoves(current) 查找包含该站点的所有公交路线,并将每条找到的路线中的下一个站点添加到数组列表中。
之后,它将“步行”节点添加到不包含该站的所有其他公交路线,并尝试以这种方式将路线连接在一起。 (它会从每条路线中找到离当前车站最近的车站)
我将步行到达节点的成本设置为成本的 10 倍,因为人类比公共汽车慢大约 10 倍。
运行程序后我没有得到想要的结果,它要么改变了太多的公共汽车,要么似乎无缘无故地走路。 此外,在检查优先级队列后,有时它不会轮询 f 值最低的节点。
这是解决这个问题的好方法吗?我错过了什么吗?
【问题讨论】:
-
如果不查看所有代码,就不可能说出问题所在。但那样它就会太宽泛了。而不是为“Walking”做
10*,我宁愿以适当的成本添加“Walking”和“Bus”边缘。 -
我也很惊讶为什么每个人都不断地用图表重新发明轮子。检查JGraphT。
-
@lexicore 我认为neo4j 更受欢迎,但这只是道听途说;我也从来没有真正使用过
-
欢迎来到 StackOverflow。请按照您创建此帐户时的建议阅读并遵循帮助文档中的发布指南。 On topic 和 how to ask 在这里申请。 StackOverflow 不是设计、编码、研究或教程服务。您要求进行设计审查——计算机对此有何看法? Stack Overflow 往往用于修复部分工作代码中的问题。
-
@BlueRaja-DannyPflughoeft 我已经广泛使用JGraphT,可以从第一手经验中推荐它。
标签: java algorithm artificial-intelligence path-finding a-star