zuc算法代码详解_最短路算法-dijkstra代码与案例详解
引言
在研究路径选择和流量分配等交通问题时,常常会用到最短路算法。用最短路算法解决交通问题存在两个难点:
一、算法的选择和程序的编写。最短路算法有很多种改进算法和启发式算法,这些算法的效率不同,适用的网络也不相同。
二、构建一个算例网络很简单,但由于实际路网具有高度复杂性,因此将真实的拓扑路网导入最短路算法变得困难。
本期介绍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代码与案例详解相关推荐
- 【阿良的算法之路】图论最短路算法模板
图论: [阿良的算法之路]图论最短路算法模板 [模板]dirjkstra单源最短路径 [模板]Bellman-Ford多源最短路 [模板]Spfa求最短路 [模板]Spfa判断负环 [模板]Floya ...
- 综合算法05—考虑换乘的K短路算法
一.问题描述 在路网中,已知站点.线路和线路-站点数据,有条件: 1.考虑到换乘时要花费一定的时间,因此对换乘路径费用要加上换乘时间. 2.当路网复杂时,为了避免多余计算,定义有效路径,使得路径在有效 ...
- 蓄水池采样算法的python实现_蓄水池抽样算法(Reservoir Sampling)
蓄水池抽样算法(Reservoir Sampling) 许多年以后,当听说蓄水池抽样算法时,邱simple将会想起,那个小学数学老师带他做"小明对水池边加水边放水,求何时能加满水" ...
- 国密算法java源码_国密算法SM2证书制作
前段时间将系统的RSA算法全部升级为SM2国密算法,密码机和UKey硬件设备大都同时支持RSA和SM2算法,只是应用系统的加解密签名验证需要修改,这个更改底层调用的加密动态库来,原来RSA用的对称加密 ...
- 国密算法sm3java软实现_国密算法实现
国密算法实现 一.国产密码算法介绍 国产密码算法(国密算法)是指国家密码局认定的国产商用密码算法,在金融领域目前主要使用公开的SM2.SM3.SM4三类算法,分别是非对称算法.哈希算法和对称算法. 1 ...
- minhash算法检索相似文本_文本去重算法:Minhash/Simhash/Klongsent
日前接到一个对名言警句这种短文本进行去重的小任务,下图是几个重复文本的示例: 很直观的结论就是重复度越高的文本,具有更多重复的词汇.一个最直接的去重思路可以描述为:将文本进行分词处理,统计各文本词汇的 ...
- 代码管理规范_微服务架构下代码管理规范
当下对于代码的管理,主要采用GitLab或GitHub,然而使用git进行代码管理过程中,一般有四种开发模式,分别为主干开发主干发布,主干开发分支发布,分支开发主干发布,分支开发分支发布.四种开发模式 ...
- java逆向生成代码有哪些_利用mybatis逆向工程生成代码
在做项目过程中,当面对很多表时,手动编写Mapper.xml.Mapper.java和pojo无疑是要人命,还容易出错,导致对数据库操作时各种异常.这就陷入了写bug,改bug的旋涡. 针对这一痛点, ...
- python实现pdf转word详解_手把手|20行Python代码教你批量将PDF文件转为Word格式(包教包会)...
在日常工作或学习中,经常会遇到这样的无奈: "小任,你把这个PDF中的文件码出来发我" 倒霉,2M的PDF12点也完不了啊! 很多时候在学习时发现许多文档都是PDF格式,PDF格式 ...
最新文章
- 推荐9款优秀的 HTML5 音乐播放器
- Azkaban启动与激活命令
- 缓存使用-4、Redis 持久化机制
- 由浅到深理解ROS(8)-线程管理
- 从零开始用python处理excel数据_Python对Excel的操作
- 顺丰控股子公司亮榛拟1000万美元参投海外投资基金
- python编程跳一跳_使用Python实现跳一跳自动跳跃功能
- arcgis自带的python版本_arcgis10.3自带的python2.7.8怎么安装geopandas?
- Power BI DAX 之日期函数
- sentinel卫星_常用的遥感卫星数据(一)哨兵
- Nero11序列号 有效序列号
- 网络编程入门(代码很详细)
- 【Dll调试】DLL调试方法
- 波峰波谷(凸点凹点)的检测算法
- disparity和parallax的区别
- python爬虫中遇到“\xb5”、“xa0”等字符时报错编码错误的处理方式
- 如何让网页界面变暗色
- 关于AML芯片电视,风行刷机包的自定义和去广告的研究
- CBAP备考|BABOK 01 业务分析核心概念
- 阿里巴巴开发手册(最新版)
热门文章
- 如何为自己找到合适的销售工作?
- 火灾原来离我们那么近
- 第五章 B树和B+树
- java 保存 设置_java的保存按钮怎么设置?
- 对接接口文档_产品经理所理解的接口
- ajax请求中带判断语句例子,jQuery中借助deferred来请求及判断AJAX加载的实例讲解...
- 现代计算机网络发展为第几代,晶体管计算机是第几代_个人计算机使用的电子元器件_计算机网络最突出的(6)...
- R︱并行计算以及提高运算效率的方式(parallel包、clusterExport函数、SupR包简介)
- 【转】switch中case与default的情况
- monkey自动化测试(命令行)