引言

在研究路径选择和流量分配等交通问题时,常常会用到最短路算法。用最短路算法解决交通问题存在两个难点:

一、算法的选择和程序的编写。最短路算法有很多种改进算法和启发式算法,这些算法的效率不同,适用的网络也不相同。

二、构建一个算例网络很简单,但由于实际路网具有高度复杂性,因此将真实的拓扑路网导入最短路算法变得困难。

本期介绍dijkstra算法,并分享一些思路和实战案例。


最短路算法

最短路算法(shortest path algorithm)用于解决最短路径问题。常见的最短路算法有迪杰斯特拉算法(Dijkstra算法),Bellman-Ford算法,SPFA算法(队列优化的Bellma-Ford算法)和Floyd-Warshall算法等。

Dijkstra算法是典型的最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

算法步骤:

创建两个表,OPEN和 CLOSE。OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。

(1)访问路网中里起始点最近且没有被检查过的点,把这个点放入OPEN组中等待检查。

(2)从OPEN表中找出距起始点最近的点,找出这个点的所有子节点,把这个点放到CLOSE表中。

(3)遍历考察这个点的子节点。求出这些子节点距起始点的距离值,放子节点到OPEN表中。

(4)重复(2)、(3)步,直到OPEN表为空,或找到目标点。

单纯看理论部分比较难理解,下面分享一个Dijkstra算法的实例。

实例分析:

构建一个名为dijkstra()的函数,其功能是用dijkstra算法计算最短路。函数的参数分别设置为路网连通图(graph)、起点(start)和终点(end)。

# 函数:Dijkstra算法
#
def dijkstra(graph, start, end):points = len(graph)pre = [0] * (points)               # 记录前驱vis = [0] * (points)               # 记录节点遍历状态dis = [_ for i in range(points)]   # 保存最短距离road = [0] * (points)              # 保存最短路径roads = []# 初始化起点到其他点的距离for i in range(points):     if i == start:dis[i] = 0else:dis[i] = graph[start][i]if graph[start][i] != _:pre[i] = startelse:pre[i] = -1vis[start] = 1# 每次循环确定一条最短路for i in range(points):            minimum = _# 确定当前最短路for j in range(points):        if vis[j] == 0 and dis[j] < minimum:t = jminimum = dis[j]        # 找到并标记最短的一条路径vis[t] = 1for j in range(points):if vis[j] == 0 and dis[j] > dis[t] + graph[t][j]:dis[j] = dis[t] + graph[t][j]pre[j] = tp = endlength = 0while p >= 0 and length < points:road[length] = pp = pre[p]length += 1length -= 1while length >= 0:roads.append(road[length])length -= 1return dis[end], roads

先在简单的算例网络上测试一下我们的代码!

我们构造一个包含6个节点和9条边的算例网络。输入起点和终点(用空格隔开),用dijkstra算法计算最短路,并输出最短路径和最短距离的代码如下:

# 定义路网连通图
_ = float('inf')  # 定义不可达距离
graph=[[_, 2, _, 4, 7, _],[_, _, 2, _, 5, _],[_, _, _, _, _, 3],[_, _, _, _, 4, _],[_, _, 3, _, _, 1],[_, _, _, _, _, _],]
# 输入起点和终点
r, s = input("输入起点和终点:").split()
dis, road = dijkstra(graph, int(r), int(s))
# 输出最短路结果
print("最短路径:", road)
print("最短距离:", dis)

程序的运行结果如下:

>>>
输入起点和终点:0 5
最短路径: [0, 1, 2, 5]
最短距离: 7
>>>
输入起点和终点:1 5
最短路径: [1, 2, 5]
最短距离: 5
>>>
输入起点和终点:3 5
最短路径: [3, 4, 5]
最短距离: 5

虽然Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。下图是Dijkstra算法在4000节点网络上的演示,遍历过的节点由黑色圆圈表示。

由图中可以看出,Dijkstra算法从起始点开始向周围所有方向层层计算,经计算大量节点后,才到达目标点。所以该算法速度慢效率低。

下一篇文章为大家介绍floyd算法和真实地图导入!

zuc算法代码详解_最短路算法-dijkstra代码与案例详解相关推荐

  1. 【阿良的算法之路】图论最短路算法模板

    图论: [阿良的算法之路]图论最短路算法模板 [模板]dirjkstra单源最短路径 [模板]Bellman-Ford多源最短路 [模板]Spfa求最短路 [模板]Spfa判断负环 [模板]Floya ...

  2. 综合算法05—考虑换乘的K短路算法

    一.问题描述 在路网中,已知站点.线路和线路-站点数据,有条件: 1.考虑到换乘时要花费一定的时间,因此对换乘路径费用要加上换乘时间. 2.当路网复杂时,为了避免多余计算,定义有效路径,使得路径在有效 ...

  3. 蓄水池采样算法的python实现_蓄水池抽样算法(Reservoir Sampling)

    蓄水池抽样算法(Reservoir Sampling) 许多年以后,当听说蓄水池抽样算法时,邱simple将会想起,那个小学数学老师带他做"小明对水池边加水边放水,求何时能加满水" ...

  4. 国密算法java源码_国密算法SM2证书制作

    前段时间将系统的RSA算法全部升级为SM2国密算法,密码机和UKey硬件设备大都同时支持RSA和SM2算法,只是应用系统的加解密签名验证需要修改,这个更改底层调用的加密动态库来,原来RSA用的对称加密 ...

  5. 国密算法sm3java软实现_国密算法实现

    国密算法实现 一.国产密码算法介绍 国产密码算法(国密算法)是指国家密码局认定的国产商用密码算法,在金融领域目前主要使用公开的SM2.SM3.SM4三类算法,分别是非对称算法.哈希算法和对称算法. 1 ...

  6. minhash算法检索相似文本_文本去重算法:Minhash/Simhash/Klongsent

    日前接到一个对名言警句这种短文本进行去重的小任务,下图是几个重复文本的示例: 很直观的结论就是重复度越高的文本,具有更多重复的词汇.一个最直接的去重思路可以描述为:将文本进行分词处理,统计各文本词汇的 ...

  7. 代码管理规范_微服务架构下代码管理规范

    当下对于代码的管理,主要采用GitLab或GitHub,然而使用git进行代码管理过程中,一般有四种开发模式,分别为主干开发主干发布,主干开发分支发布,分支开发主干发布,分支开发分支发布.四种开发模式 ...

  8. java逆向生成代码有哪些_利用mybatis逆向工程生成代码

    在做项目过程中,当面对很多表时,手动编写Mapper.xml.Mapper.java和pojo无疑是要人命,还容易出错,导致对数据库操作时各种异常.这就陷入了写bug,改bug的旋涡. 针对这一痛点, ...

  9. python实现pdf转word详解_手把手|20行Python代码教你批量将PDF文件转为Word格式(包教包会)...

    在日常工作或学习中,经常会遇到这样的无奈: "小任,你把这个PDF中的文件码出来发我" 倒霉,2M的PDF12点也完不了啊! 很多时候在学习时发现许多文档都是PDF格式,PDF格式 ...

最新文章

  1. 推荐9款优秀的 HTML5 音乐播放器
  2. Azkaban启动与激活命令
  3. 缓存使用-4、Redis 持久化机制
  4. 由浅到深理解ROS(8)-线程管理
  5. 从零开始用python处理excel数据_Python对Excel的操作
  6. 顺丰控股子公司亮榛拟1000万美元参投海外投资基金
  7. python编程跳一跳_使用Python实现跳一跳自动跳跃功能
  8. arcgis自带的python版本_arcgis10.3自带的python2.7.8怎么安装geopandas?
  9. Power BI DAX 之日期函数
  10. sentinel卫星_常用的遥感卫星数据(一)哨兵
  11. Nero11序列号 有效序列号
  12. 网络编程入门(代码很详细)
  13. 【Dll调试】DLL调试方法
  14. 波峰波谷(凸点凹点)的检测算法
  15. disparity和parallax的区别
  16. python爬虫中遇到“\xb5”、“xa0”等字符时报错编码错误的处理方式
  17. 如何让网页界面变暗色
  18. 关于AML芯片电视,风行刷机包的自定义和去广告的研究
  19. CBAP备考|BABOK 01 业务分析核心概念
  20. 阿里巴巴开发手册(最新版)

热门文章

  1. 如何为自己找到合适的销售工作?
  2. 火灾原来离我们那么近
  3. 第五章 B树和B+树
  4. java 保存 设置_java的保存按钮怎么设置?
  5. 对接接口文档_产品经理所理解的接口
  6. ajax请求中带判断语句例子,jQuery中借助deferred来请求及判断AJAX加载的实例讲解...
  7. 现代计算机网络发展为第几代,晶体管计算机是第几代_个人计算机使用的电子元器件_计算机网络最突出的(6)...
  8. R︱并行计算以及提高运算效率的方式(parallel包、clusterExport函数、SupR包简介)
  9. 【转】switch中case与default的情况
  10. monkey自动化测试(命令行)