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自然语言编码转换模块codecs介绍
Apr 08 Python
Python常见加密模块用法分析【MD5,sha,crypt模块】
May 24 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
Feb 08 Python
python使用循环打印所有三位数水仙花数的实例
Nov 13 Python
Python发送邮件功能示例【使用QQ邮箱】
Dec 04 Python
python利用跳板机ssh远程连接redis的方法
Feb 19 Python
python实现身份证实名认证的方法实例
Nov 08 Python
原来我一直安装 Python 库的姿势都不对呀
Nov 11 Python
Pytorch DataLoader 变长数据处理方式
Jan 08 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
Feb 22 Python
Python基础之字符串常见操作经典实例详解
Feb 26 Python
python tkinter实现连连看游戏
Nov 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 $_FILES函数详解
2011/03/09 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
PHP中去除换行解决办法小结(PHP_EOL)
2011/11/27 PHP
PHP编程中的常见漏洞和代码实例
2014/08/06 PHP
PHP微信开发之模板消息回复
2016/06/24 PHP
jquery 插件 人性化的消息显示
2008/01/21 Javascript
Javascript条件判断使用小技巧总结
2008/09/08 Javascript
用javascript判断IE版本号简单实用且向后兼容
2013/09/11 Javascript
深入理解JavaScript系列(40):设计模式之组合模式详解
2015/03/04 Javascript
javascript实现base64 md5 sha1 密码加密
2015/09/09 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
2015/11/02 Javascript
js实现延时加载Flash的方法
2015/11/26 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
2016/06/28 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
2017/08/15 jQuery
JS中call和apply函数用法实例分析
2018/06/20 Javascript
vue-router的两种模式的区别
2019/05/30 Javascript
详解vue中多个有顺序要求的异步操作处理
2019/10/29 Javascript
Vue使用Proxy代理后仍无法生效的解决
2020/11/13 Javascript
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python正则实现提取电话功能
2018/02/24 Python
Python中的元组介绍
2019/01/28 Python
pyqt 多窗口之间的相互调用方法
2019/06/19 Python
python搜索算法原理及实例讲解
2020/11/18 Python
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
印度尼西亚最完整和最大的在线药房网站:Farmaku.com
2019/11/23 全球购物
意大利奢侈品牌在线精品店:Jole.it
2020/11/23 全球购物
skyn ICELAND官网:冰岛成分天然护肤品
2020/08/24 全球购物
安全资料员岗位职责
2013/12/14 职场文书
纺织工程专业推荐信
2014/09/08 职场文书
会计试用期自我评价
2014/09/19 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
千手观音观后感
2015/06/03 职场文书
催款函怎么写
2015/06/24 职场文书
《打电话》教学反思
2016/02/22 职场文书
服务器间如何实现文件共享
2022/05/20 Servers