我在python中编写了dijkstras算法,并为输入G获得以下输出:
G={'A': {('B', 1.0), ('C', 5.0)},
'B': {('D', 2.0), ('E', 4.0), ('A', 1.0)},
'C': {('A', 5.0), ('E', 3.0), ('D', 2.0)},
'D': {('E', 1.0), ('C', 2.0), ('B', 2.0)},
'E': {('D', 1.0), ('B', 4.0), ('C', 3.0)}}
,即A和B之间的距离为1.0,A和C为5.0,依此类推
shortestPath(G,"A")
给了我:
Output: {'E': 4.0, 'D': 3.0, 'A': 0, 'C': 5.0, 'B': 1.0}
现在我应该使用此输出来查找两个节点之间的所有节点,例如:shortestPathnew(G,"A","C")
在该示例中,A和C之间的最短路径是5.0,并且它经过A-> B-> D-> C.所以输出应该是(5.0,[A,B,D,C])使用基本for循环而不使用.iterations,.keys,yield,sort等内置函数。我被困在这一部分,任何帮助都会有所帮助。
我尝试在线使用示例代码,但我无法根据我的要求修改它:
def shortestPathnew(G,start,end):
"""
Find a single shortest path from the given start node
to the given end node. The output is a list of the node in order along the shortest path."""
final_distances,predecessors = ShortestPath(graph,start)
path = []
while 1:
path.append(end)
if end == start: break
end = predecessors[end]
path.reverse()
return path
我必须在不使用.append,.reverse
的情况下实现它答案 0 :(得分:1)
根据示例代码,我不能认为您的shortestPath
方法和示例代码使用的方法返回相同的内容。我猜它正在回归:
({'E': 4.0, 'D': 3.0, 'A': 0, 'C': 5.0, 'B': 1.0}, {'B': 'A', 'D': 'B', 'C': 'A', 'E':'D', 'A': None})
因此它不仅具有最终距离,还包括每个节点及其前面的节点(我不知道它是否包括起始节点)。
如果您可以在shortestPath
方法中生成该方法,那么将示例代码更改为仅使用基本for
循环应该不会太难。这是一种可能性:
final_distances,predecessors = ShortestPath(graph,start)
path = end
while end != start:
end = predecessors[end]
path = '%s->%s' % (end, path)
return path
不是将结果存储在列表中并将每个新节点附加到该列表的末尾,而是每次创建一个前置字符串的字符串。您可以使用列表执行类似操作,如果这是您需要返回的内容:
final_distances,predecessors = ShortestPath(graph,start)
path = [end]
while end != start:
end = predecessors[end]
path = [end] + path
return path
这里我将路径初始化为仅包含end
的列表,并且在循环的每个步骤中,它找到当前节点的前任并将其预先添加到路径。