pathfinding:到目的地的多条路径,边缘删除

时间:2015-03-13 14:32:22

标签: algorithm path-finding

我有一个奇怪的寻路问题。在下图中,有两种边 - 红色和蓝色。红色边缘是可靠的,而蓝色边缘则不是 - 它们提供了快捷方式,但在某些情况下可能会消失或无法使用 - 您可以将它们视为冬季下雪的山口,或者不能操作的渡口在周末,或训练仅在通勤时间运行的线路。

我希望我的探路者能够产生一系列可能的路径。用户必须知道到达目的地的最快的不可靠方式,以及如果该路径不可用的可能替代方案。探路者应该产生最短的路线(在图中,使用蓝色边缘' b' 3跳)和最短的可靠路线 - (5个跳跃,仅使用红色边缘)以及所有其他可能的路线比可靠路线短,并利用不可靠的蓝色边缘。

pathfinding diagram

对于图表,这些是可能的排列:

  • 3个跃点,使用edge' b'
  • 3个跃点,使用边缘' a' d'
  • 4个跃点,使用edge' c'
  • 4个跃点,使用edge' a'
  • 4个跃点,使用edge'
  • 5个跃点,仅使用红色边缘

我对此算法的第一次尝试如下:

  1. 查找&保存尽可能短的路径(使用广度优先搜索)
  2. 如果路径中没有蓝色边缘,请停止。
  3. 如果路径中有蓝色边缘,请删除第一个并转到1.
  4. 但是,此算法并不完整,因为它可能会遗漏一些可能的路径。在上面的示例中,路径仅使用edge' a'将被遗漏(包括所有其他路径。)

    我的下一个想法是搜索每个可能的蓝色边缘组合:[a], [b], [c], [d], [a,b], [a,c], ..., [a,b,c,d]。当然,这是非常低效的,并且可能不适用于大量的蓝色边缘。


    您能想到任何可以帮助我的解决方案吗?我需要一个:

    • 计算所有可能路径的有效方法
    • 以最短到最长的顺序返回路径的算法

    前者是最好的解决方案,但后来我可以跑,比方说,10秒,然后返回至少一个很好的短路径到目的地。

    顺便提一下,我对图表的大小非常了解:大约有7000个顶点,30,000个红色边缘和200个蓝色边缘。

    我确定之前已经考虑过这种问题,但我找不到任何关于它的文章。你能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

我可以看到,您可以将问题分成两部分:

  1. 获取最短的可靠路径 - 可以通过从图表中删除所有蓝色边缘并运行任何最短路径算法(例如Dijkstra's Algorithm)来完成。
  2. 获取k个最短的不可靠路径 - 这是未经修改的图表上的K shortest paths problem,您需要选择k。更大k - 生成路径会更加广泛。
  3. 请注意,找到所有可能的路径是非常低效的,因为它们具有阶乘数,并且除了最小的图之外,所有这些数字往往无法计算(对于7,000个节点而言绝对无法实现)