Python 查找两个节点之间的节点
我用python编写了dijkstras算法,并为输入G获得以下输出:Python 查找两个节点之间的节点,python,Python,我用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
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)}}
i、 e A和B之间的距离为1.0,A和C之间的距离为5.0,依此类推。最短路径(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]),使用basic 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的情况下实现它。根据示例代码,我可以看出,您的
最短路径
方法与示例代码使用的方法返回的结果不一样。我猜它会返回类似于:
({'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
方法中生成,那么将示例代码更改为仅对循环使用基本,应该不会太难。这里有一种可能性:
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
的列表,在循环的每个步骤中,它都会找到当前节点的前置节点,并将其前置到路径中。能否显示当前的代码?否则我们无法改进itI,因为我已经编辑并更新了代码事实上,A->C已经是5,所以Dijkstra的算法不会更新距离。尝试使用A->C为6。您必须能够处理有向图,还是它们都是无向图?它应该处理有向图。在字符串中使用%s表示您将在字符串中插入变量值。这基本上相当于end+'->'+path
。谢谢。是否有可能用一个简单的循环来存储列表中的内容来替换“path='%s->%s'(end,path)”。@Rachel添加了如何使用列表。