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 18 Python
python使用pil生成缩略图的方法
Mar 26 Python
利用Python实现网络测试的脚本分享
May 26 Python
python 寻找list中最大元素对应的索引方法
Jun 28 Python
Python多线程应用于自动化测试操作示例
Dec 06 Python
Python企业编码生成系统之主程序模块设计详解
Jul 26 Python
Python实现的爬取豆瓣电影信息功能案例
Sep 15 Python
python 读取、写入txt文件的示例
Sep 27 Python
python3 使用ssh隧道连接mysql的操作
Dec 05 Python
python基于pexpect库自动获取日志信息
Feb 01 Python
python之openpyxl模块的安装和基本用法(excel管理)
Feb 03 Python
python中validators库的使用方法详解
Sep 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
这部番真是良心,画质好到像风景区,剧情让人跟着小公会热血沸腾
2020/03/10 日漫
PHP队列用法实例
2014/11/05 PHP
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
常用简易JavaScript函数
2009/04/09 Javascript
jQuery toggle()设置CSS样式
2009/11/05 Javascript
Ubuntu 11.10 安装Node.js的方法
2011/11/30 Javascript
初学Jquery插件制作 在SageCRM的查询屏幕隐藏部分行的功能
2011/12/26 Javascript
浅谈Javascript事件模拟
2012/06/27 Javascript
为jquery的ajaxfileupload增加附加参数的方法
2014/03/04 Javascript
Javascript 实现图片无缝滚动
2014/12/19 Javascript
JavaScript设计模式之外观模式介绍
2014/12/28 Javascript
jQuery鼠标事件汇总
2015/08/30 Javascript
Bootstrap Paginator分页插件与ajax相结合实现动态无刷新分页效果
2016/05/27 Javascript
最佳的JavaScript错误处理实践
2016/07/16 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
2016/08/01 Javascript
基于ajax与msmq技术的消息推送功能实现代码
2016/12/26 Javascript
在点击div中的p时,如何阻止事件冒泡
2017/02/07 Javascript
使用node搭建自动发图文微博机器人的方法
2019/03/22 Javascript
NodeJS http模块用法示例【创建web服务器/客户端】
2019/11/05 NodeJs
React 实现车牌键盘的示例代码
2019/12/20 Javascript
JavaScript实现拖拽效果
2020/03/16 Javascript
Node.js API详解之 Error模块用法实例分析
2020/05/14 Javascript
在Vue中使用Echarts实例图的方法实例
2020/10/10 Javascript
numpy.std() 计算矩阵标准差的方法
2018/07/11 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
tensorflow之自定义神经网络层实例
2020/02/07 Python
opencv之颜色过滤只留下图片中的红色区域操作
2020/06/05 Python
MyHeritage美国:家族史研究和DNA测试的领先服务
2019/05/27 全球购物
M.M.LaFleur官网:美国职业女装品牌
2020/10/27 全球购物
什么是lambda函数
2013/09/17 面试题
参观监狱心得体会
2014/01/02 职场文书
2014年公务员思想汇报范文:全心全意为人民服务
2014/03/06 职场文书
2015年暑期社会实践方案
2015/07/14 职场文书
导游词之西递宏村
2019/12/10 职场文书
python字符串常规操作大全
2021/05/02 Python
SQL中的三种去重方法小结
2021/11/01 SQL Server