我试图使用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
是两个站点之间的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)
找到包含该站的所有公交路线,并将每个找到的路线中的下一站添加到一个arraylist。
之后,它会将“行走”节点添加到不包含此电台的所有其他公交线路,尝试以这种方式连接路线。 (它找到从每条路线到当前站的最近站点)
我将步行达到的节点的成本设置为成本的10倍,因为人类比公共汽车慢大约10倍。
在运行程序后我没有得到预期的结果,它要么改变太多的公共汽车,要么似乎无缘无故地行走。 在检查优先级队列之后,有时它也不会轮询具有最低f值的节点。
这是解决此问题的好方法吗?我错过了什么吗?
答案 0 :(得分:-1)
大多数编程初学者都低估了实现路径规划算法的难度。 A *不是一项简单的任务,特别是如果与其他约束一起使用。它必须定义为中型软件项目。我猜想一个vanilla A *算法需要500行代码,而具有优先级队列和启发式的OP的扩展变体需要1000行代码。在软件工程中使用UML图表来描述不同类的交互是一种很好的做法。所以我的建议是,从互联网上下载dia软件,并在图表中绘制10个类来解决A *算法。在没有任何UML图表的情况下对路径规划器进行编程,并希望以一种小方法进行编程,这是一种盲目的飞行。
路径规划应用程序的两个简短的UML图表在这里:[1] [2]它们不能用于开箱即用,但它们显示项目应该朝哪个方向发展。它们有大约10-15个与边连接的盒子,这些盒子描述了一个包含许多类和方法的复杂软件项目。否则,无法处理复杂程度。