我正在Djikstra算法实现中工作,并且在for循环中遇到问题。在此循环中,我将每个节点从“无穷大”更新为它们的“距离”。重要的是,我不知道如何使下一个节点遵循寻找最小“距离”的路径。我正在python上使用Networkx,但无法使用已实现的Djikstra算法。这是我的评论代码:
def dijkstra(G, origen, destino, infinity=float(9999999999999999999.9)):
[G.add_node(i, distance = infinity, prev = None) for i in G.nodes() if
G.node[i]!= origen] #set all 'distance' to infinity except soure node(origen)
G.add_node(origen,distance= 0, prev = None)
pathFound = False #I will stop when found my destiny node in the loop
exploredNode = origen #SourceNode for the loop start
fastPath=[] #Fast path between source node and destiny node.
fastPath.append(exploredNode)
nodeNeighbours = list(G.neighbors(origen)) #Neighbors of source node
while not pathFound:
for nodes in nodeNeighbours :
G.node[nodes]['distance'] = (G.get_edge_data(exploredNode,nodes)['distance'])+(G.node[exploredNode]['distance'])
#main loop, only implemented the update of the distance, looking for implement the min 'distance with nodes
注意:所有节点都是由数字设计的,我使用G.node [number]访问它们。这将返回具有所有属性的字典。 每个节点都有一个包含其值的字典: {'line':4, 'distance':0.321831}
很明显,如果我的英语不够好,我深表歉意。
答案 0 :(得分:0)
一些想法:
您的第一行看起来像是列表理解,因此它正在创建一个新列表。显式循环可能是一个更好的选择。
第一行也在调用add_node()方法。您要添加新节点,还是仅更新现有节点?将节点距离设置为无穷大并设置为“无”之前,是因为尚未看到它们。这是图形搜索算法的第一步。
我不了解NetworkX,但通常要注意在同一循环中更新数据结构并对其执行查找。
pathFound何时设置为True? (我知道您没有编写完整的算法,但请澄清!)我认为该循环应改为:
while fastPath: # While the queue is not empty
v = fastPath.pop() # The node with minimum distance (use a priority queue)
,然后遍历v的邻接关系。请参见“将列表用作队列”中的python docs(您可能希望按距离对它进行排序)。
Dijkstra是breadth-first search的特例(或者相反),因此它维护着要访问的节点队列。您已经探究了您的来源(探索可能意味着不仅仅是访问,但是确实访问了来源),但是代码并未从while循环中要访问的节点队列中弹出。弹出哪个节点?队列的前端应具有最小距离的节点,该距离在第一次迭代中将作为原点,其距离设置为零,所有其他节点设置为无穷大。这就是算法从原点开始搜索的方式。 fastPath似乎是对此队列的尝试,但不完整。 (将每个节点放在那里!)我建议您研究BFS的工作原理(链接),这将使Dijkstra更具意义。慢慢来!