![](/img/trans.png)
[英]Dijkstra algorithm to find shortest path between two nodes in big graph?
[英]How to find the shortest path when not all the nodes are connected using A* algorithm?
我试图使用A *算法查找从公交车站A到公交车站B的最短路径/最佳路径,其中包含车站A的公交路线和包含车站B的公交路线可能没有公共巴士站。
(我也想以此方式改变出行费用,以使我尽量少乘坐公交车到达目的地)
我的BusRoute类包含一个公交车站的链接列表,每个车站都有一个名称,纬度和经度
我使用NODE类来表示A *中的状态:
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个站点之间的Havesine距离
hHeuristic
是当前测站与目标之间的Havesine距离
我继续从具有目标站的优先级队列开始扩展具有最低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)
查找包含该站的所有公交路线,并将每个找到的路线中的下一个站添加到数组列表中。
之后,它将“正在行走”节点添加到不包含该站点的所有其他总线路线中,尝试以这种方式将路线连接至gheter。 (它找到从每个路线到当前站点的最近站点)
我将步行到达的节点的成本设置为成本的10倍,因为人的速度比公共汽车慢10倍左右。
运行该程序后,我没有得到期望的结果,它要么更换了太多的公共汽车,要么似乎无缘无故走路。 同样,在检查优先级队列之后,有时它不会轮询具有最低f值的节点。
这是解决这个问题的好方法吗? 我想念什么吗?
大多数编程初学者都低估了实现路径规划算法的难度。 A *不是一项容易完成的任务,尤其是在与其他约束一起使用时。 它必须定义为中型软件项目。 我猜想香草A *算法需要500行代码,而具有优先级队列和启发式的OP的扩展变体需要1000行代码。 在软件工程中,最好使用UML图表来描述不同类的交互。 因此,我的建议是从互联网上下载dia软件,并在图表中绘制约10个类来解决A *算法。 对没有任何UML图表的路径规划器进行编程,并希望以一种较小的方法来完成它是一种盲目的尝试。
这里有两个用于路径规划应用的示例性UML图表: [1] [2]不能开箱即用地使用它们,但是它们显示了项目应该朝哪个方向发展。 它们有大约10-15个与边连接的盒子,这些盒子描述了具有许多类和方法的复杂软件项目。 否则,复杂性将无法处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.