【问题标题】:How to find the shortest path when not all the nodes are connected using A* algorithm?当不是所有节点都使用 A* 算法连接时,如何找到最短路径?
【发布时间】: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 topichow to ask 在这里申请。 StackOverflow 不是设计、编码、研究或教程服务。您要求进行设计审查——计算机对此有何看法? Stack Overflow 往往用于修复部分工作代码中的问题。
  • @BlueRaja-DannyPflughoeft 我已经广泛使用JGraphT,可以从第一手经验中推荐它。

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


【解决方案1】:

大多数编程初学者都低估了实现路径规划算法的难度。 A* 不是一项容易完成的任务,尤其是在与附加约束一起使用时。它必须定义为一个中等规模的软件项目。我猜一个普通的 A* 算法需要 500 行代码,而具有优先队列和启发式的 OP 的扩展变体需要 1000 行代码。在软件工程中使用 UML 图表来描述不同类的交互是一种很好的做法。所以我的建议是,从网上下载dia软件,在图表中画出大约10个类来求解A*算法。在没有任何 UML 图表的情况下编写路径规划器并希望用一种小方法来完成它是某种盲目的飞行。

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

【讨论】:

  • OP 询问如何实现 A*,而您的回答基本上是“它很复杂,您需要绘制 UML 图”。我认为这不是一个好的答案。
  • 首先,A* 并不那么复杂,Wikipedia 用大约 30 多行伪代码解释了它。而且你不需要自己实现优先队列。
  • 接下来,我真的不明白 UML 图在这里有什么帮助。您不会有复杂的类层次结构或它们之间的复杂交互。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
相关资源
最近更新 更多