狄克斯特拉算法(入门)
狄克斯特拉算法可以找出加权图中前往X的最短路径。
注意:
- 其只适用于有向无环图
- 适用于正权边,负权边的将出错(贝尔曼—福德算法适用于负权边)
步骤:
- 找出当前最“便宜”的节点,即可在最短时间内前往的节点
- 对于该节点的邻居,检查是否有经当前节点前往他们的更短的路径,如果有,经更新其开销
- 重复这个过程,直到对图中的每个节点都这样做了
- 计算最终得路径
实例:
# coding=utf-8# 图表
graph = {}
graph["start"] = {}
graph["start"]["a"] = 6 # 开始节点的邻居和邻居的开销
graph["start"]["b"] = 2graph["a"] = {} # a节点的邻居和邻居的开销
graph["a"]["fin"] = 1 graph["b"] = {} # b节点的邻居和邻居的开销
graph["b"]["a"] = 3
graph["b"]["fin"] = 5graph["fin"] = {} # 终点的邻居和邻居的开销# 节点的开销散列表
infinity = float("inf")
costs = {}
costs["a"] = 6 # 这时你可能找到更短的路径,但没有影响
costs["b"] = 2
costs["fin"] = infinity
#print infinity# 父节点的散列表
parents = {}
parents["a"] = "start"
parents["b"] = "start"
parents["fin"] = None# 处理过的节点列表
processed = []# 查找开销最小的节点
def find_lowest_cost_node(costs):lowest_cost = float("inf") # python中表示无穷大lowest_cost_node = None # 查找每个节点for node in costs:cost = costs[node]# 如果小于目前的最小开销并且未处理,就替换if cost < lowest_cost and node not in processed: lowest_cost = costlowest_cost_node = node # 替换目前最小开销的节点return lowest_cost_node # 返回目前最小开销的节点node = find_lowest_cost_node(costs) # 未处理的节点中找到开销最小的点
print 'lowest_cost_node:',node
while node is not None: # 直到遍历完所有的节点cost = costs[node] # 当前节点的开销 neighbors = graph[node] # 当前节点的邻居和开销for n in neighbors.keys(): # 遍历当前节点所有的邻居new_cost = cost + neighbors[n] # 从当前节点前往邻居结点的开销 if costs[n] > new_cost: # 如果经当前节点前往邻居节点更近costs[n] = new_cost # 就更新该邻居的开销parents[n] = node # 同时将该邻居节点的父节点更新为当前节点processed.append(node) # 将当前节点标记为已处理node = find_lowest_cost_node(costs) # 找出接下来要处理的节点print 'lowest_cost_node:',nodeprint "Cost from the start to each node:"
print 'parents:',parents
print costs
结果:
=========== RESTART: C:\Users\LiLong\Desktop\Algorithm\dixstrah.py ===========
lowest_cost_node: b
lowest_cost_node: a
lowest_cost_node: fin
lowest_cost_node: None
Cost from the start to each node:
parents: {'a': 'b', 'b': 'start', 'fin': 'a'}
{'a': 5, 'b': 2, 'fin': 6}
>>>
可以看出最短路径:
start\overset{2}{\rightarrow} b start\overset{3}{\rightarrow} a start\overset{1}{\rightarrow}fin
开销是:6
参考:《算法图解》—Aditya Bhargava
适合入门的看,讲的很基础,很多形象插图
狄克斯特拉算法(入门)相关推荐
- 《算法图解》学习笔记(七):狄克斯特拉算法(附代码)
欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...
- 小白的算法初识课堂(part7)--狄克斯特拉算法
学习笔记 学习书目:<算法图解>- Aditya Bhargava 文章目录 狄克斯特拉算法 具体步骤实现 术语 跳蚤市场 具体步骤实现 负权边 python实现 狄克斯特拉算法 在上一个 ...
- 图解算法学习笔记(七):狄克斯特拉算法
目录 1)使用狄克斯特拉算法 2)术语 3)实现 4)小结 本章内容; 介绍加权图,提高或降低某些边的权重: 介绍狄克斯特拉算法,找出加权图中前往X的最短路径: 介绍图中的环,它导致狄克斯特拉算法不管 ...
- 算法(四):图解狄克斯特拉算法
算法简介 狄克斯特拉算法(Dijkstra )用于计算出不存在非负权重的情况下,起点到各个节点的最短距离 可用于解决2类问题: 从A出发是否存在到达B的路径: 从A出发到达B的最短路径(时间最少.或者 ...
- 《算法图解》——狄克斯特拉算法
前面文章提到,找出段数最少的路径,使用广度优先搜索. 现在要找出最快的路径,(花费最少)使用狄克斯特拉算法. 狄克斯特拉算法包含的四个步骤: (1)找出最便宜的节点,即可在最短时间内前往的节点. (2 ...
- 算法图解之狄克斯特拉算法实现
狄克斯特拉算法用于在加权图中查找最短路径(权重不能为负) '''实现狄克斯特拉算法''' graph = {} graph['start'] = {}#在散列表graph中再建一个散列表为start, ...
- 算法学习之狄克斯特拉算法
加权图 在了解狄克斯特拉算法之前,先介绍一下加权图. 如图,假设你要从起点出发到达终点,如果只考虑换乘少,即最短路径.那么可以使用广度优先搜索算法,该算法我之前简单的写过,链接点这里.但是,现在你要找 ...
- 初学狄克斯特拉算法~(待提高)
读书笔记 狄克斯特拉算用来寻找加权图的"最短路径"(不一定是段数最少,我们需要一定的量度,比如说最少花费,最短时间等,bfs只是解决了段数的最短路径问题) 鉴于无向图就是一个环,而 ...
- Python查找算法之狄克斯特拉算法
目录 简介 加权图 非加权图 思路 实例 代码步骤 代码示例 运行结果 简介 狄克斯特拉算法解决了耗时最短(总权重最小)问题狄克斯特拉算法适用于加权图,并且图为有向无环图(DAG),而且权重不能为负数 ...
最新文章
- 在像Angular2这样的SPA应用中使用Google Analytics的方法
- python 3.0内置函数map、filter
- stm32核心板可以点亮灯吗_STM32库函数点亮LED
- unittest+discover批量处理自动化脚本
- 消息系统kafka原理解析
- jQuery实现的简单分页功能的详细解析
- excel 表生成insert语句。
- Win7系统下调整硬盘分区大小给C盘更多的空间
- Visual Studio 2015打开ASP.NET MVC的View提示“Object reference not set to an instance of an object“错误的解决方案
- git新建和删除远程分支
- [SPLEB]CodeSmith原理剖析(2)
- 百度网盘加速下载Motrix多线程下载器
- 转基因,请你走出这片净土。!!!食用转基因的人,你们伤不起~有木有,有木有啊~!!!!!!!!!!!!!!!
- 初识软件工程-软件工程的产生与发展
- 【软件测试】盘一盘工作中遇到的 MQ 异常测试
- udt4 VS udt gateway
- python中一个星号(*)与两个星号(**)的作用
- systemctl status mysqld.service或者systemctl start mysqld 启动失败的解决办法
- 工业4.0时代读后感
- Linux搭建一个网站,实现局域网访问
热门文章
- OpenCV文件输入输出的序列化功能的实例(附完整代码)
- C语言查找单链列表的第k个元素的算法(附完整源码)
- OpenGL Deferred Shading延迟阴影实例
- C++ edit distances最小编辑距离(附完整源码)
- QT的QMutableMapIterator类的使用
- QML基础类型之point
- boot spring 怎么执行hql_spring-boot 中使用graphql的正确姿势
- 下pg负载均衡_SAE 场景下,应用流量的负载均衡及路由策略配置实践
- MySQL里面json_MySQL中的JSON
- 开源的ESB产品列表信息