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实现的二叉树算法和kmp算法实例
Apr 25 Python
Python ORM框架SQLAlchemy学习笔记之数据查询实例
Jun 10 Python
详解python之heapq模块及排序操作
Apr 04 Python
Python3 Tkinter选择路径功能的实现方法
Jun 14 Python
Python线上环境使用日志的及配置文件
Jul 28 Python
基于Django静态资源部署404的解决方法
Jul 28 Python
pandas DataFrame 数据选取,修改,切片的实现
Apr 24 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
May 12 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
Jun 02 Python
如何利用python正则表达式匹配版本信息
Dec 09 Python
python Scrapy框架原理解析
Jan 04 Python
Python Flask请求扩展与中间件相关知识总结
Jun 11 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闭包函数详解
2016/02/13 PHP
微信JSSDK分享功能图文实例详解
2019/04/08 PHP
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
2012/02/13 Javascript
javascript获取作用在元素上面的样式属性代码
2012/09/20 Javascript
jQuery根据表单name获取值的方法
2016/05/24 Javascript
jQuery实现的简单分页示例
2016/06/01 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
2016/11/07 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
JS实现拖拽的方法分析
2016/12/20 Javascript
jquery animate动画持续运动的实例
2017/11/29 jQuery
JavaScript实现删除数组重复元素的5种常用高效算法总结
2018/01/18 Javascript
在 vue-cli v3.0 中使用 SCSS/SASS的方法
2018/06/14 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
2019/08/28 Javascript
python网页请求urllib2模块简单封装代码
2014/02/07 Python
python 垃圾收集机制的实例详解
2017/08/20 Python
python添加模块搜索路径方法
2017/09/11 Python
Python 实现打印单词的菱形字符图案
2020/04/12 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
2020/05/20 Python
python相对企业语言优势在哪
2020/06/12 Python
解决Keras自带数据集与预训练model下载太慢问题
2020/06/12 Python
python 提高开发效率的5个小技巧
2020/10/19 Python
pytorch学习教程之自定义数据集
2020/11/10 Python
css3实现的下拉菜单效果示例
2014/01/22 HTML / CSS
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
加拿大著名的奢侈品购物网站:SSENSE(支持中文)
2020/06/25 全球购物
高三毕业生自我鉴定
2013/12/20 职场文书
建筑经济管理专业求职信分享
2014/01/06 职场文书
一年级班主任寄语
2014/01/19 职场文书
商场客服专员岗位职责
2014/06/13 职场文书
中小学生学籍证明
2014/10/25 职场文书
2014年体育工作总结
2014/11/24 职场文书
年底个人总结范文
2015/03/10 职场文书
CSS3 制作精美的定价表
2021/04/06 HTML / CSS
Python scrapy爬取起点中文网小说榜单
2021/06/13 Python
Java实现字符串转为驼峰格式的方法详解
2022/07/07 Java/Android