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实现堆排序的方法详解
May 03 Python
Python3学习urllib的使用方法示例
Nov 29 Python
通过Python模块filecmp 对文件比较的实现方法
Jun 29 Python
python爬虫之验证码篇3-滑动验证码识别技术
Apr 11 Python
Python、 Pycharm、Django安装详细教程(图文)
Apr 12 Python
Python网络爬虫之爬取微博热搜
Apr 18 Python
Python3远程监控程序的实现方法
Jul 15 Python
python3中替换python2中cmp函数的实现
Aug 20 Python
Python 词典(Dict) 加载与保存示例
Dec 06 Python
python 双循环遍历list 变量判断代码
May 04 Python
如何在sublime编辑器中安装python
May 20 Python
opencv 查找连通区域 最大面积实例
Jun 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
4.与数据库的连接
2006/10/09 PHP
ThinkPHP php 框架学习笔记
2009/10/30 PHP
解析php中memcache的应用
2013/06/18 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
Javascript 面向对象编程(coolshell)
2012/03/18 Javascript
js原生appendChild的bug解决心得分享
2013/07/01 Javascript
JavaScript中使用stopPropagation函数停止事件传播例子
2014/08/27 Javascript
详解JavaScript正则表达式中的global属性的使用
2015/06/16 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
2015/08/04 Javascript
json+jQuery实现的无限级树形菜单效果代码
2015/08/27 Javascript
Bootstrap Table的使用总结
2016/10/08 Javascript
javascript 中的事件委托详解
2016/10/25 Javascript
Angular的$http的ajax的请求操作(推荐)
2017/01/10 Javascript
理解 Node.js 事件驱动机制的原理
2017/08/16 Javascript
vue webpack打包后图片路径错误的完美解决方法
2018/12/07 Javascript
fetch 如何实现请求数据
2018/12/20 Javascript
Vue实现固定定位图标滑动隐藏效果
2019/05/30 Javascript
10种JavaScript最常见的错误(小结)
2019/06/21 Javascript
javascript-hashchange事件和历史状态管理实例分析
2020/04/18 Javascript
js+canvas实现刮刮奖功能
2020/09/13 Javascript
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
Python中的defaultdict模块和namedtuple模块的简单入门指南
2015/04/01 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
django中使用事务及接入支付宝支付功能
2019/09/15 Python
Python使用微信接入图灵机器人过程解析
2019/11/04 Python
python wxpython 实现界面跳转功能
2019/12/17 Python
Myprotein蛋白粉美国官网:欧洲畅销运动营养品牌
2016/11/15 全球购物
意大利奢侈品购物网站:Giglio
2018/01/05 全球购物
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
什么是"引用"?申明和使用"引用"要注意哪些问题?
2016/03/03 面试题
SQL面试题
2013/12/09 面试题
医学生毕业自我鉴定
2014/03/26 职场文书
网站美工岗位职责
2014/04/02 职场文书
2014年信用社工作总结
2014/11/25 职场文书
2015年七夕情人节感言
2015/08/03 职场文书
毕业生求职自荐信(2016最新版)
2016/01/28 职场文书