无法使用Python 3实现我的短路径图

时间:2019-01-23 10:14:03

标签: python path dijkstra shortest

我正在开发一个简单的代码,该代码将通过使用字典和循环为我提供图形中的最短路径。

但是,我在此过程中有些困惑,无法获取正确的答案。

我试图使代码尽可能简单:我有两个字典-一个用于访问,另一个用于未访问的节点。

class Graph:
    def __init__(self):
        self.graph = {
           'A': {'B': 10, 'D': 4, 'F': 10},
           'B': {'E': 5, 'J': 10, 'I': 17},
           'C': {'A': 4, 'D': 10, 'E': 16},
           'D': {'F': 12, 'G': 21},
           'E': {'G': 4},
           'F': {'H': 3},
           'G': {'J': 3},
           'H': {'G': 3, 'J':5},
           'I': {},
           'J': {'I': 8}
        }

    def shortpath(self, start, end):
        D = {} 
        P = {} 

         for knote in self.graph.keys():
            D[knote] = - 1  
            P[knote] = ""  

        D[start] = 0  


        unvisited_n = list(self.graph.keys()) 

        while len(unvisited_n) > 0:

            shortest = None
            knote = ''
            for temp_node in unvisited_n:
                if shortest == None:
                    shortest = D[temp_node]
                    node = temp_node
                elif D[temp_node] < shortest:
                    shortest = D[temp_node]
                    knote = temp_node

                if knote in unvisited_n:
                    unvisited_n.remove(knote)


        for c_knote, v_value in self.graph[knote].items():
            if D[c_knote] < D[knote] + v_value:
                D[c_knote] = D[knote] + v_value

                P[c_knote] = knote

                path = []

                knote = end


        while not (knote == start):
            if path.count(knote) == 0:
                path.insert(0, knote) 
                knote = P[knote]  
            else:
                break
                path.insert(0, start) 
            return path

def main():
    gg = Graph()
    path = gg.shortpath('C', 'I')
    print(path)

if __name__ == '__main__':
    main()

我希望输出是C(起点)和I(终点)之间的最短路径。 我也无法初始化算法。也就是说,每当我在下一个单元格中输入:“ shortpath(graph,'C','I')”时,我会收到SyntaxError或“ Shorpath尚未定义” ...

我先感谢您的时间和耐心!

0 个答案:

没有答案