本章内容:

  • 加权图-提高或者降低某些边的权重
  • 狄克斯特拉算法,能找出加权图中前往x的最短路径
  • 图中的环,它导致狄克斯特拉算不管用

7.1狄克斯特拉算法

  4个步骤:

  1. 找出最便宜的节点,即最短时间内前往的节点
  2. 对于该节点的邻居,检查是否有前往他们的最短路径,如果有,就更新其开销
  3. 重复这个过程,知道对图中的每个节点都这样做了
  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

算法图解-狄克斯特拉算法相关推荐

  1. 算法(四):图解狄克斯特拉算法

    算法简介 狄克斯特拉算法(Dijkstra )用于计算出不存在非负权重的情况下,起点到各个节点的最短距离 可用于解决2类问题: 从A出发是否存在到达B的路径: 从A出发到达B的最短路径(时间最少.或者 ...

  2. 广度优先算法之狄克斯特拉算法

    广度优先算法之狄克斯特拉算法 package cn.wizzer.common.util; import java.util.ArrayList; import java.util.HashMap; ...

  3. 算法之狄克斯特拉算法 --《图解算法》

    2019你好!好好生活,好好工作! 狄克斯特拉算法 狄克斯特拉算法(Dijkstra )用于计算出不存在非负权重的情况下,起点到各个节点的最短距离 可用于解决2类问题: 从A出发是否存在到达B的路径: ...

  4. Python查找算法之狄克斯特拉算法

    目录 简介 加权图 非加权图 思路 实例 代码步骤 代码示例 运行结果 简介 狄克斯特拉算法解决了耗时最短(总权重最小)问题狄克斯特拉算法适用于加权图,并且图为有向无环图(DAG),而且权重不能为负数 ...

  5. 算法之狄克斯特拉算法

    [算法定义] 是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题.迪克斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. [算法图示] [程序设计] /****** ...

  6. 算法图解---狄杰斯特拉算法(原理+代码)

    要编写解决这个问题的代码,需要三个散列表. 随着算法的进行,你将不断更新散列表costs和parents.首先,需要实现这个图,为此可像第6章那样使用一个散列表,样将节点的所有邻居都存储在散列表中.但 ...

  7. 算法图解part7:狄克斯特拉算法

    算法图解part7:狄克斯特拉(Dijkstra)算法 1.狄克斯特拉算法(Dijkstra's algorithm) 2.术语 3.负权边 4.实现狄克斯特拉算法 4.1 最短路径思路 4.2 py ...

  8. 《算法图解》——狄克斯特拉算法

    前面文章提到,找出段数最少的路径,使用广度优先搜索. 现在要找出最快的路径,(花费最少)使用狄克斯特拉算法. 狄克斯特拉算法包含的四个步骤: (1)找出最便宜的节点,即可在最短时间内前往的节点. (2 ...

  9. 狄克斯特拉算法 - 学习整理

    个人整理,原创发布,转载请标注博客来源.https://editor.csdn.net/md/?articleId=102799813 很多时候,总会忽略了一些你认为不需要的知识体系,但最终你发现,你 ...

最新文章

  1. 微信开发者和其他服务器区别,求教微信公众号开发中两种认证技术的区别?
  2. java生成pdf怎么合并行或者列_Java基础之PDF文件的合并
  3. 计算机中丢失ENWeb,webapi session 丢失
  4. 车座自动排水阀行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  5. 值对于int32太大或太小_影响涂镀层测厚仪测量值的因素与解决方法
  6. 如何理解数列极限和收敛性
  7. ## 鲁棒控制 第一节 概论
  8. win10 oracle安装
  9. 基于 软件体系结构(第3版)考试重点和复习指南
  10. P2433 【深基1-2】小学数学 N 合一
  11. 物联网技术技术架构以及物联网应用领域的介绍
  12. 关于当前安全设置不允许下载文件问题的解决
  13. Nginx 配置多个SSL域名指向不同端口
  14. win8关闭uefi+linux,UEFI启动是什么意思?Win8关闭UEFI引导方式的方法
  15. layui下拉框联动
  16. javax,java
  17. 达摩院视觉ai图像识别项目
  18. Saber仿真软件平台下的蔡氏电路验证测试
  19. linux环境qt输入框不能切换中文输入法是什么原因
  20. 横扫天下mysql首充修改_横扫天下完整修复商业端(邮件发送+充值后台+物品ID+教程)...

热门文章

  1. 5分绩点转4分_搞笑图片集:这才是4个兄弟分5块饼的正确答案吧
  2. 互联网电影院带来新突破,5G+4K’
  3. 关于EMC DAE、DPE、SPE、SPS的解释
  4. MS Windows 7 快捷键大全
  5. 基于STM32的ESP8266模块控制多路继电器
  6. c语言分拆素数和,分拆素数和。
  7. 投影仪对焦应用镜头马达驱动芯片
  8. 齐了!百度、腾讯、滴滴、抖音的技术大佬都来了
  9. 树莓派hc sr501 c语言,树莓派人体红外感应模块HC-SR501安装配置
  10. Acer传奇Go电脑开机几分钟就会蓝屏怎么重装系统?