Dijkstra’s Algorithm in python

╄→尐↘猪︶ㄣ 提交于 2019-12-08 06:05:34

问题


I am trying to implement Dijkstra’s algorithm on my python code but I can't really get the algorithm right. The algorithm I am using is from this youtube link: https://www.youtube.com/watch?v=pVfj6mxhdMw

So basically my class has these 3 variables:

self.nodes = [] #a,b,c
self.neighbours = {} # a:[b,c], b:[c], c:[a]
self.weights = {} #[a,b] = 2, [a,c] = 5

Here is how I partially implemented my shortest path function using the algorithm provided in the video:

def dijkstra(self, start, end):

    nodes = {}

    for n in self.nodes:
        if n == start:
                nodes[n] = 0
        else:
                nodes[n] = float('inf')

    unvisited = self.neighbours
    visited = []
    current_node = start
    current_distance = 0

    while unvisited:
        for n in unvisited[current_node]:
            print(n)
            #calc_weight = nodes[n] + self.weights[n, current_node]
            #if (unvisited[n] is None or calc_weight > nodes[n]):
                    #nodes[n] = calc_weight
        visited.append(current_node)
        del unvisited[current_node]

        if not unvisited: break

I havent really completed because I know I missing something out somewhere. Can someone please help me with this. Thank you


回答1:


def dijkstra(self, start, end):

    nodes = self.neighbours #{'A': {'B':2}, 'B': {'C':4}, ... }

    unvisited = {n: 1000 for n in self.nodes} #unvisited node & distance
    unvisited[start] = 0 #set start vertex to 0
    visited = {} #list of all visited nodes
    parent = {} #predecessors

    while unvisited:
        min_node = min(unvisited, key=unvisited.get) #get smallest distance

        for neighbour in nodes[min_node].items():
            if neighbour not in visited:
                new_distance = unvisited[min_node] + nodes[min_node][neighbour]
                if new_distance < unvisited[neighbour]:
                    unvisited[neighbour] = new_distance
                    parent[neighbour] = min_node

        visited[min_node] = unvisited[min_node]
        unvisited.pop(min_node)

    print(parent, visited)


来源:https://stackoverflow.com/questions/40871864/dijkstra-s-algorithm-in-python

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!