python实现Dijkstra静态寻路算法

 更新时间:2019年01月17日 15:37:24   作者:By漫步  
这篇文章主要介绍了python实现Dijkstra静态寻路算法,常用于路由算法或者作为其他图算法的一个子模块,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

算法介绍

迪科斯彻算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。

当然目前也有人将它用来处理物流方面,以获取代价最小的运送方案。

算法思路

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中包含了图的所有顶点(可以到达的)。

算法图形演示

现在有图如下:

每个线的权重以及标识如图所示。

第一步:

建立dis数组和T数组。
首先从起点A 开始,将A可以直接到达的顶点的权重记录在dis数组中,无法直达的记录无穷大(当前使用FFFF表示无穷大)。

将当前选择的顶点加入数组T:

第二步:

从dis数组中选择一个不在T数组中的顶点的最小权重值的顶点,当前选择为B顶点,并将B可以直接到达的顶点的相关权重和当前dis中的权重值比较,如果当前dis权重值大,则替换:

将B加入数组T:

第三步:

依次选择顶点C:

将C加入数组T:

第四步:

依次选择顶点D:

将D加入数组T:

第五步:

依次选择顶点E:

将E加入数组T:

第六步:

依次选择顶点F:

将F加入数组T:

因为所有的顶点都已经在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将列表中的元素转化为数字并排序的示例

    今天小编就为大家分享一篇Python将列表中的元素转化为数字并排序的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • windows下python之mysqldb模块安装方法

    windows下python之mysqldb模块安装方法

    这篇文章主要介绍了windows下python之mysqldb模块安装方法,需要的朋友可以参考下
    2017-09-09
  • Python中的heapq模块源码详析

    Python中的heapq模块源码详析

    这篇文章主要给大家介绍了关于Python中heapq模块的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • Python脚本实现快速整理图片文件

    Python脚本实现快速整理图片文件

    这篇文章主要为大家详细介绍了Python如何通过三个脚本实现快速整理图片文件,适用于日常数据整理与批量处理场景,感兴趣的小伙伴可以了解下
    2025-12-12
  • 基于Python开发一个文件头签名分析工具

    基于Python开发一个文件头签名分析工具

    本文介绍了一个功能强大的文件头签名分析工具的实现原理和开发过程,该工具通过读取文件头部二进制签名来识别文件真实类型,即使用户修改了文件扩展名也能准确判断,文章详细解析了核心算法、GUI设计以及技术实现细节,为开发类似工具提供了完整参考,需要的朋友可以参考下
    2025-05-05
  • Python使用ImageIO库实现从图像到视频的高效读写

    Python使用ImageIO库实现从图像到视频的高效读写

    在现代图像处理与计算机视觉项目中,我们几乎无时无刻不需要与图像文件或视频数据打交道,无论是读取一张照片、保存图像处理结果,还是从视频中提取帧序列,这些操作的第一步都是高效、正确地读写图像数据,所以本文介绍了Python如何使用ImageIO库实现从图像到视频的高效读写
    2025-11-11
  • 详解重置Django migration的常见方式

    详解重置Django migration的常见方式

    这篇文章主要介绍了详解重置Django migration的常见方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • Python搭建HTTP服务器和FTP服务器

    Python搭建HTTP服务器和FTP服务器

    这篇文章主要为大家详细介绍了Python搭建HTTP服务器和FTP服务器的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • python生成IP段的方法

    python生成IP段的方法

    这篇文章主要介绍了python生成IP段的方法,涉及Python文件读写及随机数操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Python实现登陆文件验证方法

    Python实现登陆文件验证方法

    本篇文章中我们给大家分享了关于Python实现登陆文件验证的方法和技巧,有兴趣的朋友们参考学习下。
    2018-10-10

最新评论