Graph 在有向图中寻找具有特定代价的所有路径

Graph 在有向图中寻找具有特定代价的所有路径,graph,graph-algorithm,path-finding,directed-graph,weighted,Graph,Graph Algorithm,Path Finding,Directed Graph,Weighted,假设我们有一个有向加权图。我们的任务是找到两个顶点(源和目标)之间成本小于或等于=

假设我们有一个有向加权图。我们的任务是找到两个顶点(源和目标)之间成本小于或等于=
我认为可以用改进的Dijkstra算法来实现,但我不知道如何实现这样的事情。谢谢您的帮助。

您可以使用递归回溯来解决此问题。在以下情况下终止递归:

  • 你到达目的地了吗
  • 您访问的节点已被访问
  • 您的路径长度超过N
伪代码:

list curpath := {}
int dest, maxlen
def findPaths (curNode, dist):
    if curNode = dest:
        print curpath
        return
    if curNode is marked:
        return
    if dist > maxlen:
        return
    add curNode to curpath
    mark curNode
    for nextNode, edgeDist adjacent to curNode:
        findPaths(nextNode, dist + edgeDist)
    remove last element of curpath

您希望查找有向图中从点A到点B的所有路径,例如从A到B的距离小于N,并且允许A=B的可能性

Dijkstra的算法是泰勒算法,用于在图中找到从一个点到另一个点的最小路径,可以说,在这一过程中会删除许多其他路径。因此,如果包含重叠的路径,则不能使用它查找所有路径

通过在图中执行广度优先搜索,将覆盖树的每个分支保持在其上堆栈中(如果节点连接良好,将获得大量分支),并在深度N处停止,可以实现目标。所有到达B的分支都保留在一旁。一旦深度N被覆盖,你就放弃所有没有到达B的路径。剩下的路径,以及放在一起的路径,成为你的解决方案

您可以选择添加路径中不包含循环的限制,在这种情况下,您必须在搜索的每个步骤中检查新到达的节点是否已经在到目前为止覆盖的路径中,如果是这样,则删除该路径

下面是一些伪代码:

function find_paths(graph G, node A):
list<path> L, L';

L := empty list;
push path(A) in L;
for i = 2 to N begin
   L' := empty list;
   for each path P in L begin
       if last node of P = B then push P in L'
       else
       for each successor S of last node in P begin
           if S not in P then
              path P' := P;
              push S in P';
              push P' in L';
           endif
       end
       endif
   end
   L := L';
end

for each path P in L begin
  if last node of P != B
  then remove P from L
  endif
end
return L;
函数查找路径(图G,节点A):
列表L,L′;
L:=空列表;
L中的推送路径(A);
对于i=2到N,开始
L':=空列表;
对于L中的每个路径P开始
如果P=B的最后一个节点,则将P推入L'
其他的
对于P中最后一个节点的每个后续节点,S开始
如果不在P中,那么
路径P':=P;
将S推入P′;
将P'推入L';
恩迪夫
结束
恩迪夫
结束
L:=L';
结束
对于L中的每个路径P开始
如果P的最后一个节点=B
然后从L中去掉P
恩迪夫
结束
返回L;

我认为jma127建议的递归回溯算法的一个可能改进(取决于问题的大小和最大成本N)是预先计算每个节点到目的地的最小距离(最短路径树),然后在测试的条件后附加以下内容以终止递归:

  • 您将到达一个节点,该节点距离目标的最小距离大于最大成本N减去到达当前节点的行驶距离

如果需要针对不同的源和目的地多次运行该算法,可以在开始时运行约翰逊算法,以创建所有节点对之间的最短路径矩阵。

由于没有代码,我将该语言标记为不可知。否则,你就准备好被否决,因为你的努力很小,或者不是一个真正的问题。非常感谢你!算法运行得很好,除了(IMO),长度N的条件应该是函数中的第一个条件。否则,我们还会将到达目的地但成本超过N的路径添加到列表中。如果不需要重叠路径,回溯答案就是您需要的。