如何在图形上找到满足约束的最短路径

时间:2011-05-06 15:53:30

标签: python graph graph-theory

我正在尝试在加权图上找到最短路径,因为路径必须具有小于某个参数的总距离(假设为1000)。

我尝试了以下但我不知道为什么我的代码错了。

def directedDFS(digraph, start, end, maxTotalDist):
    visited = []
    if not (digraph.hasNode(start) and digraph.hasNode(end)):
        raise ValueError('Start or end not in graph.')
    path = [str(start)]
    if start == end:
        return path
    shortest = None
    for node in digraph.childrenOf(start):
        if (str(node) not in visited):
            visited = visited + [str(node)]
            firststep_distance = digraph.childrenOf(start)[node][0]
            firststep_outer_distance = digraph.childrenOf(start)[node][1]
            if (firststep_distance <= maxTotalDist):
                newPath = directedDFS(digraph, node, end, maxTotalDist-firststep_distance)
                if newPath == None:
                    continue
                if (shortest == None or TotalDistance(digraph,newPath) < TotalDistance(digraph,shortest)):
                    shortest = newPath
    if shortest != None:
        path = path + shortest
    else:
        path = None
    return path

另一件事是我不想根据从给定节点开始的路径距离进行比较,而是基于整个路径距原始起点的距离。我不知道这里最好的方法。

2 个答案:

答案 0 :(得分:1)

我真的无法对您提供的代码(firststep_distancefirststep_outer_distance?)做出正面或反面。你能提供你想要实现的算法的名称吗?

如果你只是动态地制作一些东西,并且你没有为了教育目的重新制作图论的目标,我建议你查找一个标准的最短路径算法。如果你可以保证你的权重是非负的,那么标准是Dijkstra的算法。维基百科将报告一个改进的渐近运行时,如果你用Fibonacci堆来支持它,但不要陷入那个陷阱 - 显然,斐波纳契堆在实践中表现糟糕。

如果Dijkstra不够好,请查看A*-search方法。在这里,与所有算法问题一样,CLR是您最好的指南,但维基百科非常接近。希望有所帮助!

答案 1 :(得分:0)

如果没有更多的代码或信息,我也无法确切知道发生了什么,但这很令人担忧:

        if (firststep_distance <= maxTotalDist):
            newPath = directedDFS(digraph, node, end, maxTotalDist-firststep_distance)

如果你在每次递归调用中减少maxTotalDistance,那么firststep_distance(我假设是路径的权重)必须大于剩余距离,而不是更少。