Python查找算法之狄克斯特拉算法
目录
- 简介
- 加权图
- 非加权图
- 思路
- 实例
- 代码步骤
- 代码示例
- 运行结果
简介
狄克斯特拉算法解决了耗时最短(总权重最小)问题狄克斯特拉算法适用于加权图,并且图为有向无环图(DAG),而且权重不能为负数前面提到的广度优先算法适用于非加权图
加权图
非加权图
思路
狄克斯特拉算法包含4个步骤:
Step1: 找出“最便宜”的节点,即可在最短时间内到达的节点
Step2: 更新该节点的邻居的开销,即检查经过该节点是否有前往它们的更短路径如果有,则更新其开销
Step3: 重复此过程,直到对图中的每个节点都这样做了
Step4: 计算最终路径
实例
Rama,想拿一本乐谱换架钢琴。
这个图中的节点是大家愿意拿出来交换的东西,边的权重是交换时需要额外加多少钱。
最终结果:
代码步骤
代码步骤:
Step1: 定义阶段(1) 建图(graph)(2) 建开销表(costs)(3) 建父子关系表(parents)(4) 建标记处理表(processed)Step2: 找开销最小的节点(1) 从开销表(costs)找开销最小的节点(2) 假定开销最小的节点为None假定开销最小的值为infinity(无穷大, float('inf'))(3) 循环如果该节点不在processed中 并且 该节点开销值 小于 假定的节点的开销值更新最小开销节点更新最小开销值(4) return 最小开销节点Step3: 更新邻居开销只要节点不是None,就继续循环首先将该节点的邻居节点加入开销表(costs)以及父子关系表(parents)中,分别初始化为infinity,None其次跟新该节点所有邻居节点的开销接着将当前节点标记为已处理最后再执行Step2找开销最小的节点Step4: 输出
代码示例
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""狄克斯特拉(Dijkstra's Algorithm)狄克斯特拉算法解决了耗时最短(总权重最小)问题狄克斯特拉算法适用于加权图,并且图为有向无环图(DAG),而且权重不能为负数前面提到的广度优先算法适用于非加权图狄克斯特拉算法包含4个步骤:
Step1: 找出“最便宜”的节点,即可在最短时间内到达的节点
Step2: 更新该节点的邻居的开销,即检查经过该节点是否有前往它们的更短路径如果有,则更新其开销
Step3: 重复此过程,直到对图中的每个节点都这样做了
Step4: 计算最终路径代码步骤:
Step1: 定义阶段(1) 建图(graph)(2) 建开销表(costs)(3) 建父子关系表(parents)(4) 建标记处理表(processed)Step2: 找开销最小的节点(1) 从开销表(costs)找开销最小的节点(2) 假定开销最小的节点为None假定开销最小的值为infinity(无穷大, float('inf'))(3) 循环如果该节点不在processed中 并且 该节点开销值 小于 假定的节点的开销值更新最小开销节点更新最小开销值(4) return 最小开销节点Step3: 更新邻居开销只要节点不是None,就继续循环首先将该节点的邻居节点加入开销表(costs)以及父子关系表(parents)中,分别初始化为infinity,None其次跟新该节点所有邻居节点的开销接着将当前节点标记为已处理最后再执行Step2找开销最小的节点Step4: 输出
"""# 输出
def output(end):is_end = Falsepath = []while not is_end:tmp = endpath.append(end)for sub, par in parents.items():if sub == end:end = parbreakif tmp == end:is_end = Trueprint(' ---> '.join(path[::-1]))# 找开销最小的节点
def find_lowest_cost_node():"""find_lowest_cost_node找开销最小的节点(1) 从开销表(costs)找开销最小的节点(2) 假定开销最小的节点为None假定开销最小的值为infinity(无穷大, float('inf'))(3) 循环如果该节点不在processed中 并且 该节点开销值 小于 假定的节点的开销值更新最小开销节点更新最小开销值(4) return 最小开销节点Returns:lowest_cost_node(str), 最小开销节点"""lowest_cost = float('inf')lowest_cost_node = Nonefor node in costs:cost = costs[node]if cost < lowest_cost and node not in processed:lowest_cost = costlowest_cost_node = nodereturn lowest_cost_node# 更新邻居开销
def dijkstra_algorithm(end):"""Dijkstra's Algorithm更新邻居开销只要节点不是None,就继续循环首先将该节点的邻居节点加入开销表(costs)以及父子关系表(parents)中,分别初始化为infinity,None其次跟新该节点所有邻居节点的开销接着将当前节点标记为已处理最后再执行Step2找开销最小的节点"""node = find_lowest_cost_node()while node is not None:cost = costs[node]neighbors = graph[node]for n in neighbors:if not costs.get(n):costs[n] = float('inf')parents[n] = Nonefor n in neighbors:new_cost = cost + neighbors[n]if new_cost < costs[n]:costs[n] = new_costparents[n] = nodeprocessed.append(node)node = find_lowest_cost_node()output(end)# 定义
# 建图
graph = {} # 多余
graph['乐谱'] = {'海报': 0, '黑胶唱片': 5}
graph['海报'] = {'架子鼓': 35, '低音吉他': 30}
graph['黑胶唱片'] = {'架子鼓': 20, '低音吉他': 15}
graph['低音吉他'] = {'钢琴': 20}
graph['架子鼓'] = {'钢琴': 10}
graph['钢琴'] = {} # 终点没有任何邻居# 建开销表
# 这里,我只初始化了从起点(乐谱)的邻居
costs = {}
costs['海报'] = 0
costs['黑胶唱片'] = 5# 建父子关系表
parents = {}
parents['海报'] = '乐谱'
parents['黑胶唱片'] = '乐谱'# 定义一个列表,记录处理过的节点
processed = []# 调用
end = '钢琴'
dijkstra_algorithm(end)
运行结果
乐谱 ---> 黑胶唱片 ---> 架子鼓 ---> 钢琴Process finished with exit code 0
Python查找算法之狄克斯特拉算法相关推荐
- 广度优先算法之狄克斯特拉算法
广度优先算法之狄克斯特拉算法 package cn.wizzer.common.util; import java.util.ArrayList; import java.util.HashMap; ...
- 算法之狄克斯特拉算法 --《图解算法》
2019你好!好好生活,好好工作! 狄克斯特拉算法 狄克斯特拉算法(Dijkstra )用于计算出不存在非负权重的情况下,起点到各个节点的最短距离 可用于解决2类问题: 从A出发是否存在到达B的路径: ...
- 算法图解-狄克斯特拉算法
本章内容: 加权图-提高或者降低某些边的权重 狄克斯特拉算法,能找出加权图中前往x的最短路径 图中的环,它导致狄克斯特拉算不管用 7.1狄克斯特拉算法 4个步骤: 找出最便宜的节点,即最短时间内前往的 ...
- 算法之狄克斯特拉算法
[算法定义] 是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题.迪克斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. [算法图示] [程序设计] /****** ...
- Python图算法之狄克斯特拉算法
可用于类似公交线路用时最短的案例. 图算法之狄克斯特拉算法(Dijkstra's algorithm),包含4个步骤: (1) 找出"最便宜"的节点(权重最小),即可在最短时间内前 ...
- 图解算法学习笔记(七):狄克斯特拉算法
目录 1)使用狄克斯特拉算法 2)术语 3)实现 4)小结 本章内容; 介绍加权图,提高或降低某些边的权重: 介绍狄克斯特拉算法,找出加权图中前往X的最短路径: 介绍图中的环,它导致狄克斯特拉算法不管 ...
- 算法学习之狄克斯特拉算法
加权图 在了解狄克斯特拉算法之前,先介绍一下加权图. 如图,假设你要从起点出发到达终点,如果只考虑换乘少,即最短路径.那么可以使用广度优先搜索算法,该算法我之前简单的写过,链接点这里.但是,现在你要找 ...
- 算法详解之狄克斯特拉算法
上一篇文章,我们了解了广度优先搜索算法(BFS),BFS主要用来解决图的可达路径验证和最小路径问题,即从一个顶点A到另一个顶点B,是否有可达路径,如果有那么求出其到达的最少步骤.那么这里的最短路径就如 ...
- 《算法图解》学习笔记(七):狄克斯特拉算法(附代码)
欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...
最新文章
- 生成性对抗网络技术实现
- Science:基于微生物条形码系统的高分辨率物源追踪技术
- 英特尔与京东联合强化AI武器:让创新更专注
- NASA艾姆斯研究中心将跟Uber团队展开合作
- 打破常规,逆残差模块超强改进,新一代移动端模型MobileNeXt来了!精度速度双超MobileNetV2
- 网络——在网络上发送,接收数据
- CakePHP 2.10.17 发布,PHP 快速开发框架
- oracle aq_通过Java 8流使用Oracle AQ
- 前端学习(1746):前端调试值之时间监听
- SQLServer 的存储过程与java交互
- python设计模式9-装饰器模式
- 多通路fpga 通信_基于USB通信的FPGA高速数据采集系统研究
- django在window和linux,从windows导入Django项目到linux时出错
- KDD18 DIN Deep Interest Network for Click-Through Rate Prediction
- FPGA Verilog进阶开发教程:WM8978音频回环实验
- 机器学习_深度学习毕设题目汇总——漫画
- 为什么主机IP地址通常以192.168开头?
- Android-VideoView启动页视频,8.0崩溃解决
- Ubuntu14.04.6系统下安装软件和程序库(含安装PyCharm、Visual Studio Code、Boost和Eigen程序库等)
- RR报文解析(三)利用LSR, DLSR计算RTT
热门文章
- 使用ONVIF Device Test Tool获取网络摄像头的音/视频
- 将小写人民币转换成大写
- 昆石VOS3000_2.1.6.0.0安装交流 vos5000服务
- android 监控app 读写,Android端 APP性能监控实践
- 实战 Vue 之配置多页面应用
- android 属性动画伸缩,Android动画开发——Animation动画效果详解
- Android自定义键盘
- 绝对收敛级数重排定理的证明
- 使用父子两个进程拷贝同一个文件,父进程拷贝前一半,子进程拷贝后一半。
- CSS实现鼠标悬停缩放