python实现Dijkstra静态寻路算法


Posted in Python onJanuary 17, 2019

算法介绍

迪科斯彻算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。

当然目前也有人将它用来处理物流方面,以获取代价最小的运送方案。

算法思路

Dijkstra算法采用的是一种贪心的策略。

1.首先,声明一个数组dis来保存源点到各个顶点的最短距离和一个保存已经找到了最短路径的顶点的集合T。
2.其次,原点 s 的路径权重被赋为 0 (dis[s] = 0)。若对于顶点 s 存在能直接到达的边(s,m),则把dis[m]设为w(s, m),同时把所有其他(s不能直接到达的)顶点的路径长度设为无穷大。初始时,集合T只有顶点s。
3.从dis数组选择最小值,则该值就是源点s到该值对应的顶点的最短路径,并且把该点加入到T中,此时完成一个顶点。
4.再次,看看新加入的顶点是否可以到达其他顶点并且看看通过该顶点到达其他点的路径长度是否比源点直接到达短,如果是,那么就替换这些顶点在dis中的值。
5.最后,从dis中找出最小值,重复上述动作,直到T中包含了图的所有顶点(可以到达的)。

算法图形演示

现在有图如下:

python实现Dijkstra静态寻路算法

每个线的权重以及标识如图所示。

第一步:

建立dis数组和T数组。
首先从起点A 开始,将A可以直接到达的顶点的权重记录在dis数组中,无法直达的记录无穷大(当前使用FFFF表示无穷大)。

python实现Dijkstra静态寻路算法

将当前选择的顶点加入数组T:

python实现Dijkstra静态寻路算法

第二步:

从dis数组中选择一个不在T数组中的顶点的最小权重值的顶点,当前选择为B顶点,并将B可以直接到达的顶点的相关权重和当前dis中的权重值比较,如果当前dis权重值大,则替换:

python实现Dijkstra静态寻路算法

将B加入数组T:

python实现Dijkstra静态寻路算法

第三步:

依次选择顶点C:

python实现Dijkstra静态寻路算法

将C加入数组T:

python实现Dijkstra静态寻路算法

第四步:

依次选择顶点D:

python实现Dijkstra静态寻路算法

将D加入数组T:

python实现Dijkstra静态寻路算法

第五步:

依次选择顶点E:

python实现Dijkstra静态寻路算法

将E加入数组T:

python实现Dijkstra静态寻路算法

第六步:

依次选择顶点F:

python实现Dijkstra静态寻路算法

将F加入数组T:

python实现Dijkstra静态寻路算法

因为所有的顶点都已经在T数组中了,算法结束。
这样就求得了从A点到各个顶点的最优解。

可以看到A顶点无法直达F顶点。

代码表示:

(代码中使用999代表FFF)

#encoding:utf-8

import copy
"""
图的表示方式
邻接矩阵
999代表无限远
"""
tuG=[[0, 10, 20, 999, 999, 999],
 [999, 0, 999, 20, 70, 999],
 [999, 999, 0, 50, 30, 999],
 [999, 999, 999, 0, 999, 999],
 [999, 999, 999, 10, 0, 999],
 [999, 999, 999, 20, 20, 0]];

tuX = 6;

# 设置原点到其他定点的各个距离
dis = copy.deepcopy(tuG[0]);

def Dijkstra(G,v0):
 """
 使用 Dijkstra 算法计算指定点 v0 到图 G 中任意点的最短路径的距离
 INF 为设定的无限远距离值
 """
 t = [];
 minv = v0;

 while len(t) <= tuX:
 t.append(minv);
 #以当前点的中心向外扩散
 for w in range(0, tuX):
  if dis[minv] + G[minv][w] < dis[w]:
  dis[w] = dis[minv] + G[minv][w]

 tmp = 1000;
 for i in range(0, tuX):
  tmpFlag = False;
  for j in range(0, len(t)):
  if i == t[j]:
   tmpFlag = True;
   break;

  if tmpFlag == True:
  continue;

  if tmp > dis[i]:
  tmp = dis[i];
  minv = i;

if __name__ == '__main__': 
 Dijkstra(tuG,0); 
 print dis;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 动态获取当前运行的类名和函数名的方法
Apr 15 Python
使用Python编写一个在Linux下实现截图分享的脚本的教程
Apr 24 Python
使用Nginx+uWsgi实现Python的Django框架站点动静分离
Mar 21 Python
python字典快速保存于读取的方法
Mar 23 Python
基于anaconda下强大的conda命令介绍
Jun 11 Python
python使用tcp实现局域网内文件传输
Mar 20 Python
浅谈Python接口对json串的处理方法
Dec 19 Python
Pycharm中Python环境配置常见问题解析
Jan 16 Python
使用Python爬虫库requests发送表单数据和JSON数据
Jan 25 Python
Python实现对adb命令封装
Mar 06 Python
如何在Django中使用聚合的实现示例
Mar 23 Python
python判断字符串以什么结尾的实例方法
Sep 18 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
Jan 17 #Python
python实现dijkstra最短路由算法
Jan 17 #Python
Pycharm 设置默认头的图文教程
Jan 17 #Python
python实现狄克斯特拉算法
Jan 17 #Python
在PyCharm下使用 ipython 交互式编程的方法
Jan 17 #Python
python最小生成树kruskal与prim算法详解
Jan 17 #Python
解决PyCharm不运行脚本,而是运行单元测试的问题
Jan 17 #Python
You might like
php入门小知识
2008/03/24 PHP
PHP统计二维数组元素个数的方法
2013/11/12 PHP
PHP 函数call_user_func和call_user_func_array用法详解
2014/03/02 PHP
php实现水仙花数示例分享
2014/04/03 PHP
ThinkPHP视图查询详解
2014/06/30 PHP
PHP输出缓冲控制Output Control系列函数详解
2015/07/02 PHP
CodeIgniter基于Email类发邮件的方法
2016/03/29 PHP
浅析JavaScript中两种类型的全局对象/函数
2013/12/05 Javascript
使用CSS样式position:fixed水平滚动的方法
2014/02/19 Javascript
jQuery常用数据处理方法小结
2015/02/20 Javascript
jquery 插件实现瀑布流图片展示实例
2015/04/03 Javascript
JavaScript子窗口调用父窗口变量和函数的方法
2015/10/09 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
JavaScript实现简单的拖动效果
2016/07/02 Javascript
jQuery实现底部浮动窗口效果
2016/09/07 Javascript
如何用js判断dom是否有存在某class的值
2017/02/13 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
JavaScript变量Dom对象的所有属性
2020/04/30 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
Python下线程之间的共享和释放示例
2015/05/04 Python
pymongo给mongodb创建索引的简单实现方法
2015/05/06 Python
详解Python装饰器由浅入深
2016/12/09 Python
关于pytorch处理类别不平衡的问题
2019/12/31 Python
python实现飞行棋游戏
2020/02/05 Python
Python如何生成xml文件
2020/06/04 Python
Python Charles抓包配置实现流程图解
2020/09/29 Python
python制作一个简单的gui 数据库查询界面
2020/11/19 Python
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/09/18 面试题
电子商务专业求职信
2014/07/10 职场文书
安全施工责任书
2014/08/25 职场文书
小学生交通安全寄语
2015/02/27 职场文书
2015年社区矫正工作总结
2015/04/21 职场文书
爱国主义教育基地观后感
2015/06/18 职场文书
swagger如何返回map字段注释
2021/07/03 Java/Android
Java由浅入深通关抽象类与接口(上篇)
2022/04/26 Java/Android
Python如何加载模型并查看网络
2022/07/15 Python