【问题标题】:A* (A Star) Algorithm outputting all possible solutionsA* (A Star) 算法输出所有可能的解
【发布时间】:2013-01-30 18:59:34
【问题描述】:

已知 A 星算法是完整的。但是,我在网上找到的所有实现似乎只返回第一个(最佳)解决方案。

例如,这个实现: A star algoritthm implementation

由于算法总是扩展具有最小 f 值的节点,并且当第一个节点是解决方案时,实现似乎停止,如何调整上述代码以输出所有(或第一个 n ) 通向目标的路径,而不考虑重复的操作(即一遍又一遍地包含相同操作的路径)?

【问题讨论】:

  • 只要找到少于n的解决方案就不要停下来,你会得到n最好的解决方案。
  • 这肯定行不通吗?
  • @flup:为什么?搜索空间是一棵树,A*-算法保证找到一个最优解,如果你从树中切割出这个解,A*-算法将为缩减的树找到一个最优解。您不需要重新开始搜索,因为树的每个节点的计算没有改变。
  • @MrSmith42 就the wikipedia description of astar 而言,封闭集中指向到达它们的最佳方式的came_from 箭头的值将毫无意义。整个内部数据结构与您刚刚找到的最佳解决方案相协调。我真的不明白你怎么能继续或跳过一个解决方案。
  • @flup:正如您在图形示例(维基百科)中看到的那样,当搜索路径导致盲端(或其他路径接缝更便宜)时,下一个有希望的(就成本而言)路径将是搜索。如果您通过切割叶子来声明已经找到的“盲端”最佳解决方案,就好像该解决方案从未存在过一样。

标签: java algorithm a-star


【解决方案1】:

对于所有路径,使用呼吸优先搜索可能更有意义。或者,如果你想找到前 n 条最短路径,你可以试试Dijkstra's algorithm

【讨论】:

    【解决方案2】:

    它是完整的,这意味着如果存在一个解决方案,它将找到一个解决方案,但该算法专门只返回一个路径。广度优先搜索将找到两个节点之间的所有非循环路径,但是:http://en.wikipedia.org/wiki/Breadth-first_search

    更新 - 这是 k 最短路径算法,它将返回 n(或在本例中为 k)最短路径的列表,按从最短到最长的顺序排列。 http://code.google.com/p/k-shortest-paths/

    【讨论】:

    • 这在大多数情况下比 A`search 性能差很多。
    • A* 更快,但它并没有达到他想要的效果。如果你让它做他想做的事,它会变慢,因为它不再寻找单一的路径,而是所有的路径。
    • 搜索所有路径正是广度优先搜索所做的。我不知道您对 A* 的所有可能修改行为的智慧从何而来。但我对此表示怀疑。
    • 发帖者询问“如何调整上述代码以输出通向目标的所有(或前 n 个)路径。”您认为 A* 如何做到这一点?它不会做任何这些事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    相关资源
    最近更新 更多