【问题标题】:how to find the best three routes using A* algorithm如何使用 A* 算法找到最佳的三条路线
【发布时间】:2011-03-05 14:37:00
【问题描述】:

在 A* 中,您得到的结果通常只有一条路径。根据 A*,给定的起点和终点是否有可能有 3 条推荐路径?所以返回的第二个是第二好的路径,第三个是第三好的路径..

我正在考虑以某种方式修改启发式以反映第二和第三最佳路径。你们怎么看?

更新: 我的实现是在 PHP 中,我使用的是封闭集。所以如果有办法做到这一点,请告诉我。

【问题讨论】:

  • 如果您不知道 A* 是什么,而我不知道,这是对 Dijkstra 最短路径算法的改进。见Wikipedia's article
  • 我确实知道它是什么 =)

标签: algorithm shortest-path a-star


【解决方案1】:

如果您的语言支持回溯/生成器/迭代器/协程,这可以很容易地完成。

# Python code
def astar(start):
    q = [start]    # priority queue
    while len(q) > 0:
        node = heappop(q)
        if isGoal(node):
            yield node
        for x in successors(node):
            heappush(q, x)

yield 关键字与return 类似,只是在yield 之后可以重新进入该函数以获得下一个解决方案。要获得最好的三个:

solutions = []
i = 0
for sol in astar(start):
    solutions.append(sol)
    if i == 3:
        break
    i += 1

但是,如果您使用闭集(即Russell & Norvig图搜索算法),这将不起作用,因为那么在寻找最优解时,部分非最优解可能会被“截断”。

【讨论】:

  • php 中有这样的方法吗?
  • 如果我已经有使用封闭集的实现,有什么方法吗?
  • @EquinoX:我倾向于远离 PHP,但是这个技巧可以在任何语言中执行,方法是在算法中建立一个解决方案列表并返回它。我认为您也许可以将封闭集集成到节点表示中,但我没有立即看到如何正确执行此操作。
  • 但是同样,如果你使用这种方法,可能第二好的路线与第一好的路线几乎相似..想象它在一条路上..也许唯一的区别是一个左转附近结束,另一个右转。如果我错了,请纠正我
  • @EquinoX,澄清一下:您将从空的解决方案列表/数组开始,然后执行append(或任何 PHP 调用它)而不是 return,直到列表很长足以满足您的目的。这称为 k 最佳搜索。
猜你喜欢
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 2014-05-24
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 1970-01-01
相关资源
最近更新 更多