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进行稳定可靠的文件操作详解
Dec 31 Python
Python随机生成彩票号码的方法
Mar 05 Python
简单了解Python中的几种函数
Nov 03 Python
python获取文件路径、文件名、后缀名的实例
Apr 23 Python
caffe binaryproto 与 npy相互转换的实例讲解
Jul 09 Python
python使用递归的方式建立二叉树
Jul 03 Python
Python帮你微信头像任意添加装饰别再@微信官方了
Sep 25 Python
python 并发下载器实现方法示例
Nov 22 Python
python中property和setter装饰器用法
Dec 19 Python
python 日志模块 日志等级设置失效的解决方案
May 26 Python
使用pandas生成/读取csv文件的方法实例
Jul 09 Python
Python实现双向链表
May 25 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生成N个不重复的随机数实例
2013/11/12 PHP
php简单实现MVC
2015/02/05 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
用javascript动态调整iframe高度的方法
2007/03/06 Javascript
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
Jquery中扩展方法extend使用技巧
2014/08/24 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
js实现兼容IE和FF的上下层的移动
2015/05/04 Javascript
js实现简单计算器
2015/11/22 Javascript
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例
2016/10/13 Javascript
BootStrap tooltip提示框使用小结
2016/10/26 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
深入理解vue2.0路由如何配置问题
2017/07/18 Javascript
jQuery轮播图实例详解
2018/08/15 jQuery
在 Vue 应用中使用 Netlify 表单功能的方法详解
2019/06/03 Javascript
elementUI vue this.$confirm 和el-dialog 弹出框 移动 示例demo
2019/07/03 Javascript
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
Atom Python 配置Python3 解释器的方法
2019/08/28 Python
python中matplotlib条件背景颜色的实现
2019/09/02 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
详解django使用include无法跳转的解决方法
2020/03/19 Python
使用CSS3的::selection改变选中文本颜色的方法
2015/09/29 HTML / CSS
CSS3实现网站商品展示效果图
2020/01/18 HTML / CSS
HTML5实现移动端点击翻牌功能
2020/10/23 HTML / CSS
Eastbay官网:美国最大的运动鞋网络零售商
2016/07/27 全球购物
世界上最好的旅行夹克:BauBax
2018/12/23 全球购物
英国儿童鞋和靴子:Start-Rite
2019/05/06 全球购物
股份合作协议书
2014/04/12 职场文书
工作检讨书怎么写
2015/01/23 职场文书
2015年学生会部门工作总结
2015/04/21 职场文书
2015年检验科工作总结
2015/04/27 职场文书