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

时间:2018-04-09 13:55:31

标签: java algorithm artificial-intelligence path-finding a-star

我试图使用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值的节点。

这是解决此问题的好方法吗?我错过了什么吗?

1 个答案:

答案 0 :(得分:-1)

大多数编程初学者都低估了实现路径规划算法的难度。 A *不是一项简单的任务,特别是如果与其他约束一起使用。它必须定义为中型软件项目。我猜想一个vanilla A *算法需要500行代码,而具有优先级队列和启发式的OP的扩展变体需要1000行代码。在软件工程中使用UML图表来描述不同类的交互是一种很好的做法。所以我的建议是,从互联网上下载dia软件,并在图表中绘制10个类来解决A *算法。在没有任何UML图表的情况下对路径规划器进行编程,并希望以一种小方法进行编程,这是一种盲目的飞行。

路径规划应用程序的两个简短的UML图表在这里:[1] [2]它们不能用于开箱即用,但它们显示项目应该朝哪个方向发展。它们有大约10-15个与边连接的盒子,这些盒子描述了一个包含许多类和方法的复杂软件项目。否则,无法处理复杂程度。