下面的代码用于根据给定的约束(maxTotalDist和maxDistOutdoors)找到最短路径。我有主要是工作,但我遇到的问题是,即使我能找到一条路径(在一些给定的问题上)。我无法确认我找到了它。
例如,如果找到了路径,那么"访问了#34;在代码中,list应该是我获得的完整路径(然后测试路径是否足够好,成为"最短路径")。但是,我试图实现的任何印刷语句,以查看我打击的节点都没有被打印。 (即试图找到从节点&A 39到节点的路径,节点A有孩子[' b',' c'如果我制作样本 if 语句(如果访问[0] ==' c'),则打印语句不会关闭。)
无论如何,我知道这可能写得很糟糕,但任何帮助都会有所帮助。感谢。
def bruteForceSearch1(digraph, start, end, maxTotalDist, maxDistOutdoors, 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
#This is the iterator talked about in the question
for node in digraph.childrenOf(start):
if (str(node) not in visited):
visited = visited + [str(node)]
#Sample print statement
if visited[0] == 'nodeName':
print "Node is part of search"
newPath = bruteForceSearch1(digraph, node, end, maxTotalDist, maxDistOutdoors, visited)
if newPath == None:
continue
if shortest != None:
totalShort, outdoorShort = digraph.getDistances(shortest)
total, outdoor = digraph.getDistances(path + newPath)
if (total <= maxTotalDist) and (outdoor <= maxDistOutdoors):
if (shortest == None):
shortest = newPath
else:
if (len(newPath) < len(shortest)):
shortest = newPath
elif (len(newPath) == len(shortest)) and (total <= totalShort) and (outdoor <= outdoorShort):
shortest = newPath
if shortest != None:
path = path + shortest
else:
path = None
return path
答案 0 :(得分:0)
所有递归调用都会看到与visited[0]
相同的值。它始终是原始start
值的第一个子项。由于您将所有其他值附加到列表的末尾,因此不会将该子项替换为visited
中的第一个值。
我认为您可能希望针对node
检查您的具体名称,而不是针对visited[0]
。
您的代码可能还有其他一些问题。例如,如果路径a->c->b
存在,则永远不会考虑路径a->b
(因为b
在visited
被检查后将在a->b
中。在某些类型的图形中(三角形不等式不成立),第一条路径可能比第二条路径短。如果在你的图表中不可能,你可以没事,但这不是你应该为所有图表所假设的。