繁体   English   中英

当不是所有节点都使用A *算法连接时,如何找到最短路径?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM