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+mongodb数据抓取详细介绍
Oct 25 Python
Python图像处理之颜色的定义与使用分析
Jan 03 Python
python实现二级登陆菜单及安装过程
Jun 21 Python
django 使用 PIL 压缩图片的例子
Aug 16 Python
Django 实现Admin自动填充当前用户的示例代码
Nov 18 Python
Python assert关键字原理及实例解析
Dec 13 Python
pytorch三层全连接层实现手写字母识别方式
Jan 14 Python
Python 解析pymysql模块操作数据库的方法
Feb 18 Python
python读取xml文件方法解析
Aug 04 Python
Python 带星号(* 或 **)的函数参数详解
Feb 23 Python
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
Jun 23 Python
Python安装使用Scrapy框架
Apr 12 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文本数据库的搜索方法
2006/10/09 PHP
PHP分页显示制作详细讲解
2006/10/09 PHP
动态生成gif格式的图像要注意?
2006/10/09 PHP
让你同时上传 1000 个文件 (一)
2006/10/09 PHP
PHP精确计算功能示例
2016/11/29 PHP
php连接mysql数据库
2017/03/21 PHP
PHP扩展Swoole实现实时异步任务队列示例
2019/04/13 PHP
浅谈jquery点击label触发2次的问题
2016/06/12 Javascript
JavaScript新增样式规则(推荐)
2016/07/19 Javascript
利用fecha进行JS日期处理
2016/11/21 Javascript
Angular实现跨域(搜索框的下拉列表)
2017/02/16 Javascript
Three.js的使用及绘制基础3D图形详解
2017/04/27 Javascript
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
JavaScript实现图片本地预览功能【不用上传至服务器】
2017/09/20 Javascript
详解vue mixins和extends的巧妙用法
2017/12/20 Javascript
详解安装mitmproxy以及遇到的坑和简单用法
2019/01/21 Python
Python实现多线程/多进程的TCP服务器
2019/09/03 Python
详解Python3 定义一个跨越多行的字符串的多种方法
2020/09/06 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
详解Python中的Lock和Rlock
2021/01/26 Python
Jar包的作用是什么
2014/03/30 面试题
存储过程和sql语句的优缺点
2014/07/02 面试题
同步和异步有何异同,在什么情况下分别使用他们
2013/04/09 面试题
生产总经理岗位职责
2013/12/19 职场文书
工作表扬信的范文
2014/01/10 职场文书
高中生家长寄语大全
2014/04/03 职场文书
信用社竞聘演讲稿
2014/05/16 职场文书
乔布斯斯坦福大学演讲稿
2014/05/23 职场文书
农民工预备党员思想汇报
2014/09/14 职场文书
反四风对照检查材料思想汇报
2014/09/16 职场文书
人身损害赔偿协议书范本
2014/09/27 职场文书
院党委组织查摆问题对照检查材料思想汇报2014
2014/10/08 职场文书
教师个人师德工作总结2015
2015/05/12 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
python前后端自定义分页器
2022/04/13 Python
JavaScript原型链中函数和对象的理解
2022/06/16 Javascript