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中pygame安装方法图文详解
Nov 11 Python
详解Python的Twisted框架中reactor事件管理器的用法
May 25 Python
python魔法方法-属性访问控制详解
Jul 25 Python
python 将字符串转换成字典dict的各种方式总结
Mar 23 Python
Pandas:DataFrame对象的基础操作方法
Jun 07 Python
pycharm运行程序时在Python console窗口中运行的方法
Dec 03 Python
Python常见数据结构之栈与队列用法示例
Jan 14 Python
对Python实现累加函数的方法详解
Jan 23 Python
Python 50行爬虫抓取并处理图灵书目过程详解
Sep 20 Python
使用Django实现把两个模型类的数据聚合在一起
Mar 28 Python
Django使用list对单个或者多个字段求values值实例
Mar 31 Python
Python进行特征提取的示例代码
Oct 15 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
德生PL550的电路分析
2021/03/02 无线电
用PHP实现小型站点广告管理
2006/10/09 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
2013/12/25 PHP
php的ZipArchive类用法实例
2014/10/20 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
PHP自定义错误处理的方法分析
2018/12/19 PHP
PHP hex2bin()函数用法讲解
2019/02/25 PHP
PHP中number_format()函数的用法讲解
2019/04/08 PHP
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
Ext.MessageBox工具类简介
2009/12/10 Javascript
jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法
2010/10/22 Javascript
json对象转字符串如何实现
2012/12/02 Javascript
用Jquery.load载入页面实现局部刷新
2014/01/22 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
2014/06/06 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
jquery判断iPhone、Android设备类型
2016/09/14 Javascript
Move.js入门
2017/02/08 Javascript
利用Javascript裁剪图片并存储的简单实现
2017/03/13 Javascript
JS实现点击Radio动态更新table数据
2017/07/18 Javascript
Vue-router 中hash模式和history模式的区别
2018/07/24 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
vue项目实现图片上传功能
2019/12/23 Javascript
Vue v-for中的 input 或 select的值发生改变时触发事件操作
2020/08/31 Javascript
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
详解HTML5布局和HTML5标签
2020/10/26 HTML / CSS
英国领先的奢侈品零售商之一:CRUISE
2016/12/02 全球购物
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
2014/09/26 面试题
商场端午节活动方案
2014/01/29 职场文书
销售总经理岗位职责
2014/03/15 职场文书
企业党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
2014年家长学校工作总结
2014/11/20 职场文书
MySQL 隔离数据列和前缀索引的使用总结
2021/05/14 MySQL
CSS中妙用 drop-shadow 实现线条光影效果
2021/11/11 HTML / CSS
JavaScript实现酷炫的鼠标拖尾特效
2022/02/18 Javascript