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 过滤字符串的技巧,map与itertools.imap
Sep 06 Python
简单文件操作python 修改文件指定行的方法
May 15 Python
如何优雅地处理Django中的favicon.ico图标详解
Jul 05 Python
Python实现爬取马云的微博功能示例
Feb 16 Python
flask利用flask-wtf验证上传的文件的方法
Jan 17 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
Apr 14 Python
Python flask框架端口失效解决方案
Jun 04 Python
完美解决python针对hdfs上传和下载的问题
Jun 05 Python
在keras中对单一输入图像进行预测并返回预测结果操作
Jul 09 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
Oct 26 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
Feb 23 Python
python字符串拼接.join()和拆分.split()详解
Nov 23 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 Parse Error: syntax error, unexpected $end 错误的解决办法
2012/06/05 PHP
php生成略缩图代码
2012/07/16 PHP
php中判断文件存在是用file_exists还是is_file的整理
2012/09/12 PHP
thinkphp实现多语言功能(语言包)
2014/03/04 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
2014/10/16 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
2016/09/22 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
javascript的onchange事件与jQuery的change()方法比较
2009/09/28 Javascript
javascript之with的使用(阿里云、淘宝使用代码分析)
2016/10/11 Javascript
Vue.js组件tree实现省市多级联动
2016/12/02 Javascript
整理关于Bootstrap过渡动画的慕课笔记
2017/03/29 Javascript
webpack 2的react开发配置实例代码
2017/07/28 Javascript
解决vue2.0动态绑定图片src属性值初始化时报错的问题
2018/03/14 Javascript
小程序登录态管理的方法示例
2018/11/13 Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
2019/05/13 Javascript
基于Vue和Element-Ui搭建项目的方法
2019/09/06 Javascript
分享几道你可能遇到的python面试题
2017/07/24 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
关于Python的一些学习总结
2018/05/25 Python
pycharm中使用anaconda部署python环境的方法步骤
2018/12/19 Python
python读取并写入mat文件的方法
2019/07/12 Python
Python collections.deque双边队列原理详解
2020/10/05 Python
python 实现Harris角点检测算法
2020/12/11 Python
HTML5: Web 标准最巨大的飞跃
2008/10/17 HTML / CSS
html5+css3进度条倒计时动画特效代码【推荐】
2016/03/08 HTML / CSS
成人大专生实习期的自我评价
2013/10/02 职场文书
母校寄语大全
2014/04/10 职场文书
工作鉴定评语
2014/05/04 职场文书
试用期转正后的自我评价
2014/09/21 职场文书
建筑横幅标语
2014/10/09 职场文书
2015教师个人工作总结范文
2015/03/31 职场文书
2015年银行柜员工作总结报告
2015/04/01 职场文书
2016年幼儿园万圣节活动总结
2016/04/05 职场文书
Python+uiautomator2实现自动刷抖音视频功能
2021/04/29 Python
vue 给数组添加新对象并赋值
2022/04/20 Vue.js
PYTHON InceptionV3模型的复现详解
2022/05/06 Python