我目前正在使用Python实现Dijkstra的算法,我已经在这里查看了有关算法的其他问题,似乎没有一个适合我想要的。
目前我的程序读取两个文本文件,一个包含网络路由图network.txt(基本上是路由成本)。
0,2,4,1,6,0,0
2,0,0,0,5,0,0
4,0,0,0,0,5,0
1,0,0,0,1,1,0
6,5,0,1,0,5,5
0,0,5,1,5,0,0
0,0,0,0,5,0,0
和一个包含所需路线的路线(route.txt)
B>F
网络路由表: (每条线路是节点及其链路,因此节点A链接到B,C,D和E)
A B C D E F G
A [0, 2, 4, 1, 6, 0, 0]
B [2, 0, 0, 0, 5, 0, 0]
C [4, 0, 0, 0, 0, 5, 0]
D [1, 0, 0, 0, 1, 1, 0]
E [6, 5, 0, 1, 0, 5, 5]
F [0, 0, 5, 1, 5, 0, 0]
G [0, 0, 0, 0, 5, 0, 0]
网络上的节点: ([Structure] PreviousNode,DistanceFromSource,Visited)
A [-1, 1000000000, False]
B [-1, 1000000000, False]
C [-1, 1000000000, False]
D [-1, 1000000000, False]
E [-1, 1000000000, False]
F [-1, 1000000000, False]
G [-1, 1000000000, False]
我有点理解Dijkstra的算法,但是使用了我拥有的两种数据结构,再加上必须用Python编写它,我不知道从哪里开始,因为我无法理解如何做这不知道语言。
我对下一步要做的事情有一些非常基本的“伪代码”
3 - 检查当前节点的所有未访问的邻居并进行计算 他们与起始节点的暂定距离,覆盖了 新值较低时的现有距离
4 - 将当前节点标记为已访问(不会再次检查)
5 - 如果不在目的地并且存在未访问的节点,则转到具有最小>的未访问节点。距初始节点的距离并使其成为当前节点,否则结束
6 - 回到3
是否有人能够帮助我将“伪代码”转换为代码,或者甚至更有意义的伪代码将会很好,因为我正在努力解决这个问题
答案 0 :(得分:2)
在对象之间使用本机python“链接”,例如:
edges = {1: set([2,3,4]), 2: set([1,5]), ....}
costs = {(1, 2): 99.3, (1, 3): 127.77, ...}
没有必要为这样简单的问题创建自己的类。
注意灵感:
http://python.mirocommunity.org/video/1530/pycon-2010-mastering-team-play