获得所有可能路径的有效方式+特殊细节

时间:2011-06-16 14:40:46

标签: algorithm path-finding

我正面临一个寻路问题,我必须找到从一个点到另一个点的所有可能路径。如果它就是那么容易 - 我会使用广度优先算法,就像解释here的算法一样。

问题是,在这种情况下,每个边缘都有可以使用的最大次数。让我们看一个例子:

Example graph

在这种情况下,我可以从A到D去15次。前10次,路径是A - > B - > C - > D.剩下的5次,路径将是A - > C - > d。

到目前为止,我已经能够实现一个解决方案(使用python),但对于中等问题(大约30个节点)来说,这是非常缓慢的。我有一个未加权的图(因为我不介意路径的长度)与不同节点之间可能的连接,并且我有一个矩阵,每个边的使用限制

所以,在循环中:

  • 我找到了一条可能的路径。
  • 我更新了使用矩阵。该路径的使用将是边缘使用的最小值(例如,您可以使用路径与具有最小限制的路径部分一样多次)。
  • 对于使用率达到0的每条边,表示无法再使用它,因此我将其从图中删除。
  • 循环直到找到所有路径。

正如我所说,这是有效的,但它很慢。我已经能够通过根据每个节点可以使用的次数对每个节点的边缘列表进行排序来提高整体性能,但它仍然很慢。

任何线索?

1 个答案:

答案 0 :(得分:1)

您可以将问题显示为最大流量问题。你可能会说A到B可以容纳10立方公尺/秒的流量,而不是说你可以将A到B行进10次。您的图表是一个管道网络,可以容纳从A到D的总流量为15立方米/秒。因此,您可以先查看列出的算法here on wikipedia

在您的问题中,我有些观点尚不清楚。根据您的答案,它可能不符合流量问题。

  1. 如果将A到C的容量增加到6,从A到D的最大流量仍为15,但有几种方法可以实现(6个直接连接到C,9个连接到B或5和10)。你对这些答案中的任何一个满意吗?或者你想要它们吗?本着同样的精神,如果有另一条从A到C的路径(比如通过节点E),你会接受它在结果中被忽略,因为无论如何C到D都是饱和的。
  2. 如果图表中有一个循环(比如从C回到B的边缘),你会计算出这个循环从不,一次,两次或更多次作为不同的解决方案。