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中的多条件排序实现
Jun 07 Python
Python socket网络编程TCP/IP服务器与客户端通信
Jan 05 Python
python使用标准库根据进程名如何获取进程的pid详解
Oct 31 Python
tensorflow TFRecords文件的生成和读取的方法
Feb 06 Python
python smtplib发送带附件邮件小程序
May 22 Python
python编写简易聊天室实现局域网内聊天功能
Jul 28 Python
Python+OpenCV实现图像融合的原理及代码
Dec 03 Python
uwsgi+nginx部署Django项目操作示例
Dec 04 Python
python实现的按要求生成手机号功能示例
Oct 08 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
Jun 11 Python
PyTorch 导数应用的使用教程
Aug 31 Python
详解python3类型注释annotations实用案例
Jan 20 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下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
老生常谈PHP数组函数array_merge(必看篇)
2017/05/25 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
使用JavaScript switch case 另类写法
2010/03/14 Javascript
JavaScript 产生不重复的随机数三种实现思路
2012/12/13 Javascript
5个书写JavaScript代码的坏习惯,看看你中枪了没?
2014/11/06 Javascript
jQuery实现高亮显示网页关键词的方法
2015/08/07 Javascript
用JS生成UUID的方法实例
2016/03/30 Javascript
微信小程序  action-sheet详解及实例代码
2016/11/09 Javascript
jquery-mobile基础属性与用法详解
2016/11/23 Javascript
vue.js中ref及$refs的使用方法解析
2019/10/08 Javascript
详解小程序如何动态绑定点击的执行方法
2019/11/26 Javascript
Element-UI+Vue模式使用总结
2020/01/02 Javascript
vue 动态组件用法示例小结
2020/03/06 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
[01:10:58]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
2016/06/03 Python
Python 实现文件的全备份和差异备份详解
2016/12/27 Python
Python和Java进行DES加密和解密的实例
2018/01/09 Python
基于python代码实现简易滤除数字的方法
2018/07/17 Python
Numpy之文件存取的示例代码
2018/08/03 Python
python复制列表时[:]和[::]之间有什么区别
2018/10/16 Python
matplotlib事件处理基础(事件绑定、事件属性)
2021/02/03 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
html5 postMessage解决跨域、跨窗口消息传递方案
2016/12/20 HTML / CSS
英国最大的在线床超市:Bed Star
2019/01/24 全球购物
事业单位接收函
2014/01/10 职场文书
人事专员职责
2014/02/22 职场文书
《蜗牛的奖杯》教后反思
2014/04/24 职场文书
医院搬迁方案
2014/06/14 职场文书
最新离婚协议书范本
2014/08/19 职场文书
警告通知
2015/04/25 职场文书
院系推荐意见
2015/06/05 职场文书
Python Numpy之linspace用法说明
2021/04/17 Python
基于Python实现流星雨效果的绘制
2022/03/18 Python