我正在尝试在加权图上找到最短路径,因为路径必须具有小于某个参数的总距离(假设为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
另一件事是我不想根据从给定节点开始的路径距离进行比较,而是基于整个路径距原始起点的距离。我不知道这里最好的方法。
答案 0 :(得分:1)
我真的无法对您提供的代码(firststep_distance
?firststep_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(我假设是路径的权重)必须大于剩余距离,而不是更少。