算法图解-狄克斯特拉算法
本章内容:
- 加权图-提高或者降低某些边的权重
- 狄克斯特拉算法,能找出加权图中前往x的最短路径
- 图中的环,它导致狄克斯特拉算不管用
7.1狄克斯特拉算法
4个步骤:
- 找出最便宜的节点,即最短时间内前往的节点
- 对于该节点的邻居,检查是否有前往他们的最短路径,如果有,就更新其开销
- 重复这个过程,知道对图中的每个节点都这样做了
- 计算最终路径
7.3负边权
狄克斯特拉算法不支持包含负边权的图,因为,狄克斯特拉算法这样假设:对于处理过的海报节点,没有前往该节点的更短的路径。包含负边权的图,可使用贝尔曼-福德算法(bellman-Ford algorithm)。
7.4实现
1 # the graph 2 graph = {} 3 graph["start"] = {} 4 graph["start"]["a"] = 6 5 graph["start"]["b"] = 2 6 7 graph["a"] = {} 8 graph["a"]["fin"] = 1 9 10 graph["b"] = {} 11 graph["b"]["a"] = 3 12 graph["b"]["fin"] = 5 13 14 graph["fin"] = {} 15 16 # the costs table 17 infinity = float("inf") 18 costs = {} 19 costs["a"] = 6 20 costs["b"] = 2 21 costs["fin"] = infinity 22 23 # the parents table 24 parents = {} 25 parents["a"] = "start" 26 parents["b"] = "start" 27 parents["fin"] = None 28 29 processed = [] 30 31 def find_lowest_cost_node(costs): 32 lowest_cost = float("inf") 33 lowest_cost_node = None 34 # Go through each node. 35 for node in costs: 36 cost = costs[node] 37 # If it's the lowest cost so far and hasn't been processed yet... 38 if cost < lowest_cost and node not in processed: 39 # ... set it as the new lowest-cost node. 40 lowest_cost = cost 41 lowest_cost_node = node 42 return lowest_cost_node 43 44 # Find the lowest-cost node that you haven't processed yet. 45 node = find_lowest_cost_node(costs) 46 # If you've processed all the nodes, this while loop is done. 47 while node is not None: 48 cost = costs[node] 49 # Go through all the neighbors of this node. 50 neighbors = graph[node] 51 for n in neighbors.keys(): 52 new_cost = cost + neighbors[n] 53 # If it's cheaper to get to this neighbor by going through this node... 54 if costs[n] > new_cost: 55 # ... update the cost for this node. 56 costs[n] = new_cost 57 # This node becomes the new parent for this neighbor. 58 parents[n] = node 59 # Mark the node as processed. 60 processed.append(node) 61 # Find the next node to process, and loop. 62 node = find_lowest_cost_node(costs) 63 64 print "Cost from the start to each node:" 65 print costs
dijkstras_algorithm.py
字典graph描述了一个图,如下所示:
costs描述了每个节点的开销;
parents描述了一个父节点散列表。
算法逻辑简述如下:
- 查找开销最低的节点,获取该节点开销和邻居,即以此节点为起始点的权值和路径,这里是B节点。
- 计算通过B节点到达其邻居的开销,并与从起点到达B邻居的开销对比。如图:到达A节点新开销较小,更新到达A节点的散列表开销值,并把A的父节点改为B;比较B节点到终点的路径2+5<无穷大,故将终点的路径由无穷大改为7,父节点改为B。
- 将B节点标记为处理过。
- 重复步骤1,查找出开销最低的节点即A;此时A的开销是5,终点的开销是7。
- 重复步骤2,A只有一个邻居节点即终点,对比通过A到达终点的开销和已有的数据(7),更新到达终点的开销为6,并更新终点的父节点为A。
- 所有的节点都查找过后,算法结束。通过父节点散列表可以得到最优路径;通过开销散列表可得到最少到达终点的开销。
7.6小结
- 广度优先搜索用于非加权图中从查找最短路径
- 狄克斯特拉算法用于加权图中查找最短路径
- 仅当权重为正时,狄克斯特拉算法才管用
- 如果图中包含负权边,请使用贝尔曼-福德算法
转载于:https://www.cnblogs.com/mofei004/p/8893414.html
算法图解-狄克斯特拉算法相关推荐
- 算法(四):图解狄克斯特拉算法
算法简介 狄克斯特拉算法(Dijkstra )用于计算出不存在非负权重的情况下,起点到各个节点的最短距离 可用于解决2类问题: 从A出发是否存在到达B的路径: 从A出发到达B的最短路径(时间最少.或者 ...
- 广度优先算法之狄克斯特拉算法
广度优先算法之狄克斯特拉算法 package cn.wizzer.common.util; import java.util.ArrayList; import java.util.HashMap; ...
- 算法之狄克斯特拉算法 --《图解算法》
2019你好!好好生活,好好工作! 狄克斯特拉算法 狄克斯特拉算法(Dijkstra )用于计算出不存在非负权重的情况下,起点到各个节点的最短距离 可用于解决2类问题: 从A出发是否存在到达B的路径: ...
- Python查找算法之狄克斯特拉算法
目录 简介 加权图 非加权图 思路 实例 代码步骤 代码示例 运行结果 简介 狄克斯特拉算法解决了耗时最短(总权重最小)问题狄克斯特拉算法适用于加权图,并且图为有向无环图(DAG),而且权重不能为负数 ...
- 算法之狄克斯特拉算法
[算法定义] 是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题.迪克斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. [算法图示] [程序设计] /****** ...
- 算法图解---狄杰斯特拉算法(原理+代码)
要编写解决这个问题的代码,需要三个散列表. 随着算法的进行,你将不断更新散列表costs和parents.首先,需要实现这个图,为此可像第6章那样使用一个散列表,样将节点的所有邻居都存储在散列表中.但 ...
- 算法图解part7:狄克斯特拉算法
算法图解part7:狄克斯特拉(Dijkstra)算法 1.狄克斯特拉算法(Dijkstra's algorithm) 2.术语 3.负权边 4.实现狄克斯特拉算法 4.1 最短路径思路 4.2 py ...
- 《算法图解》——狄克斯特拉算法
前面文章提到,找出段数最少的路径,使用广度优先搜索. 现在要找出最快的路径,(花费最少)使用狄克斯特拉算法. 狄克斯特拉算法包含的四个步骤: (1)找出最便宜的节点,即可在最短时间内前往的节点. (2 ...
- 狄克斯特拉算法 - 学习整理
个人整理,原创发布,转载请标注博客来源.https://editor.csdn.net/md/?articleId=102799813 很多时候,总会忽略了一些你认为不需要的知识体系,但最终你发现,你 ...
最新文章
- 微信开发者和其他服务器区别,求教微信公众号开发中两种认证技术的区别?
- java生成pdf怎么合并行或者列_Java基础之PDF文件的合并
- 计算机中丢失ENWeb,webapi session 丢失
- 车座自动排水阀行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- 值对于int32太大或太小_影响涂镀层测厚仪测量值的因素与解决方法
- 如何理解数列极限和收敛性
- ## 鲁棒控制 第一节 概论
- win10 oracle安装
- 基于 软件体系结构(第3版)考试重点和复习指南
- P2433 【深基1-2】小学数学 N 合一
- 物联网技术技术架构以及物联网应用领域的介绍
- 关于当前安全设置不允许下载文件问题的解决
- Nginx 配置多个SSL域名指向不同端口
- win8关闭uefi+linux,UEFI启动是什么意思?Win8关闭UEFI引导方式的方法
- layui下拉框联动
- javax,java
- 达摩院视觉ai图像识别项目
- Saber仿真软件平台下的蔡氏电路验证测试
- linux环境qt输入框不能切换中文输入法是什么原因
- 横扫天下mysql首充修改_横扫天下完整修复商业端(邮件发送+充值后台+物品ID+教程)...