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使用chardet判断字符编码
May 09 Python
R语言 vs Python对比:数据分析哪家强?
Nov 17 Python
python3 发送任意文件邮件的实例
Jan 23 Python
Python实现随机漫步功能
Jul 09 Python
Python for循环中的陷阱详解
Jul 13 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
Jul 17 Python
Python3匿名函数用法示例
Jul 25 Python
Python内置random模块生成随机数的方法
May 31 Python
基于Django静态资源部署404的解决方法
Jul 28 Python
Django项目创建到启动详解(最全最详细)
Sep 07 Python
python将unicode和str互相转化的实现
May 11 Python
JAVA SpringMVC实现自定义拦截器
Mar 16 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与C#分别格式化文件大小的代码
2011/05/14 PHP
PHP+Jquery与ajax相结合实现下拉淡出瀑布流效果【无需插件】
2016/05/06 PHP
PHP+JavaScript实现无刷新上传图片
2017/02/21 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
PHP htmlspecialchars() 函数实例代码及用法大全
2018/09/18 PHP
thinkphp5框架实现的自定义扩展类操作示例
2019/05/16 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
JavaScript中使用document.write向页面输出内容实例
2014/10/16 Javascript
javascript面向对象快速入门实例
2015/01/13 Javascript
easyui Droppable组件实现放置特效
2015/08/19 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
AngularJS中watch监听用法分析
2016/11/04 Javascript
实现图片首尾平滑轮播(JS原生方法—节流)
2017/10/17 Javascript
vue中如何创建多个ueditor实例教程
2017/11/14 Javascript
Angular 容器部署的方法
2018/04/17 Javascript
详解vue-cli3 中跨域解决方案
2019/04/10 Javascript
jQuery 淡入/淡出效果函数用法分析
2020/05/19 jQuery
Python 错误和异常小结
2013/10/09 Python
举例讲解如何在Python编程中进行迭代和遍历
2016/01/19 Python
Python3连接MySQL(pymysql)模拟转账实现代码
2016/05/24 Python
高效使用Python字典的清单
2018/04/04 Python
python交互模式基础知识点学习
2020/06/18 Python
Python 调用 ES、Solr、Phoenix的示例代码
2020/11/23 Python
python 基于Apscheduler实现定时任务
2020/12/15 Python
TensorFlow的环境配置与安装方法
2021/02/20 Python
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
英国50岁以上人群的交友网站:Ourtime
2018/03/28 全球购物
巴西最好的男鞋:Rafarillo
2018/05/25 全球购物
土建资料员岗位职责
2014/01/04 职场文书
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
出差报告怎么写
2014/11/06 职场文书
初中物理教学反思
2016/02/19 职场文书
win10电脑双屏显示一个黑屏怎么办?win10电脑双屏显示一个黑屏解决方法
2022/07/15 数码科技