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 15 Python
python执行精确的小数计算方法
Jan 21 Python
10招!看骨灰级Pythoner玩转Python的方法
Apr 15 Python
python之pyqt5通过按钮改变Label的背景颜色方法
Jun 13 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
Jun 24 Python
基于Python函数和变量名解析
Jul 19 Python
深入了解Django View(视图系统)
Jul 23 Python
Django自定义模板过滤器和标签的实现方法
Aug 21 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
Aug 26 Python
Django实现分页显示效果
Oct 31 Python
python实现简易淘宝购物
Nov 22 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
Sep 21 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的FTP学习(三)
2006/10/09 PHP
php+mysql数据库查询实例
2015/01/21 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
2015/07/01 PHP
PHP在线调试执行的实现方法(附demo源码)
2016/04/28 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
extjs 学习笔记(三) 最基本的grid
2009/10/15 Javascript
Bootstrap安装环境配置教程分享
2016/05/27 Javascript
浅析Javascript ES6新增值比较函数Object.is
2016/08/24 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
2017/06/13 Javascript
mui上拉加载更多下拉刷新数据的封装过程
2017/11/03 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
30分钟快速实现小程序语音识别功能
2018/11/27 Javascript
[00:43]魔廷新尊——痛苦女王至宝捆绑包
2020/06/12 DOTA
Python代理抓取并验证使用多线程实现
2013/05/03 Python
python解析xml文件实例分析
2015/05/27 Python
Python设计模式编程中Adapter适配器模式的使用实例
2016/03/02 Python
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
Python获取网段内ping通IP的方法
2019/01/31 Python
python pickle存储、读取大数据量列表、字典数据的方法
2019/07/07 Python
Python通过递归获取目录下指定文件代码实例
2019/11/07 Python
python数据化运营的重要意义
2019/11/25 Python
pytorch 批次遍历数据集打印数据的例子
2019/12/30 Python
基于Python获取照片的GPS位置信息
2020/01/20 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
2020/03/09 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
如何用python免费看美剧
2020/08/11 Python
香港卓悦化妆品官网:BONJOUR
2017/09/21 全球购物
杭州龙健科技笔试题.net部分笔试题
2016/01/24 面试题
2014年乡镇植树节活动方案
2014/02/28 职场文书
高中运动会广播稿
2014/09/16 职场文书
先进典型事迹材料
2014/12/29 职场文书
预备党员考察意见范文
2015/06/01 职场文书
教师旷工检讨书
2015/08/15 职场文书
CSS3新特性详解(五):多列columns column-count和flex布局
2021/04/30 HTML / CSS
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
浅析Python实现DFA算法
2021/06/26 Python