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中将单词首字母大写的capitalize()方法
May 18 Python
Python易忽视知识点小结
May 25 Python
基于python 处理中文路径的终极解决方法
Apr 12 Python
对python中大文件的导入与导出方法详解
Dec 28 Python
python 切换root 执行命令的方法
Jan 19 Python
Python代码太长换行的实现
Jul 05 Python
浅谈Python中re.match()和re.search()的使用及区别
Apr 14 Python
Python如何实现的二分查找算法
May 27 Python
在python3.64中安装pyinstaller库的方法步骤
Jun 02 Python
在pycharm中文件取消用 pytest模式打开的操作
Sep 01 Python
Python经典五人分鱼实例讲解
Jan 04 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
Mar 04 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中的reflection反射机制测试例子
2014/08/05 PHP
PHP模拟post提交数据方法汇总
2016/02/16 PHP
php的常量和变量实例详解
2017/06/27 PHP
IE6、IE7中获取Button元素的值的bug说明
2011/08/28 Javascript
用jquery实现输入框获取焦点消失文字
2013/04/27 Javascript
JS实现在状态栏显示打字效果完整实例
2015/11/02 Javascript
JS框架之vue.js(深入三:组件1)
2016/09/29 Javascript
JavaScript递归操作实例浅析
2016/10/31 Javascript
基于jQuery Easyui实现登陆框界面
2017/07/10 jQuery
详解从新建vue项目到引入组件Element的方法
2017/08/29 Javascript
mongoose更新对象的两种方法示例比较
2017/12/19 Javascript
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
vuex 实现getter值赋值给vue组件里的data示例
2019/11/05 Javascript
JavaScript原型继承和原型链原理详解
2020/02/04 Javascript
[03:52]显微镜下的DOTA2第三期——英雄在无聊的时候干什么
2014/06/20 DOTA
[45:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第二场 6.2
2018/06/04 DOTA
[46:14]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第一场 12.11
2020/12/16 DOTA
python脚本设置系统时间的两种方法
2016/02/21 Python
python GUI实例学习
2017/11/21 Python
Python+tkinter模拟“记住我”自动登录实例代码
2018/01/16 Python
python库lxml在linux和WIN系统下的安装
2018/06/24 Python
Django框架实现的普通登录案例【使用POST方法】
2019/05/15 Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
2019/07/23 Python
简单了解Django ContentType内置组件
2019/07/23 Python
pycharm显示远程图片的实现
2019/11/04 Python
HTML5 Canvas实现图片缩放、翻转、颜色渐变的代码示例
2016/02/28 HTML / CSS
数组越界问题
2015/10/21 面试题
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
网络工程系信息安全技术专业大学生求职信
2013/10/22 职场文书
致跳高运动员广播稿
2014/01/13 职场文书
先进典型事迹材料
2014/12/29 职场文书
诉讼和解协议书
2016/03/23 职场文书
Python OpenCV实现传统图片格式与base64转换
2021/06/13 Python
win10电脑双屏显示一个黑屏怎么办?win10电脑双屏显示一个黑屏解决方法
2022/07/15 数码科技