SciTech-BigDataAIML-Algorithm-Heuristic启发式- 无向带weight(权重)Graph(图)的最优路线规划算法 : Dijkstra迪杰斯特拉算法

news/2024/12/24 11:34:48/文章来源:https://www.cnblogs.com/abaelhe/p/18529152

Dijkstra迪杰斯特拉算法

图例:


行号 节点 最短距离 前一节点 已访问完全
1 A 0
2 B 2 A T
3 C 12 F T
4 D 7 B T
5 E 8 B T
6 F 9 D,E T

上表的用法:

  • 表格的"第1行"是"起点"; 图例:上表是图上的节点"A"作为起点;
  • 由"终点"起始,用"每一节点"查表得到的"前一节点";
    一步步倒推,可得出 "起点" 到 "终点" 的 "最短完整路线".
    例如:要求解“A点出发,到C点的最短路线”,
    根据上表,可查表得出:
    • 终点"C"节点的数据记录行的"行号"是 "3"(第3行),
    • "最短路线" 为12(由"起点A"到"终点C"),
    • "最短完整路线"("起点A"到"终点C"):
      由终点C起始, 递推的用"每一节点"查表得到的"前一节点", 一步步倒推, 可得出:
      $ C \leftarrow F \leftarrow D \leftarrow B \leftarrow A $
    • 注意:"最短路径"可能有不只一条;
      例如: "起点A"到"终点F"的"最短路线"
      • $ F \leftarrow D \leftarrow B \leftarrow A $
      • $ F \leftarrow E \leftarrow B \leftarrow A $

如何根据"节点路线Graph"得出"路由表"

  • 将 Graph 转化为 Dictionary 数据结构:存储全部的"每一节点"到其"下一节点"映射;
    例如图示的 Graph 可转化为:

    MAX_DIST = 99999999
    DIST_INDEX = 0
    PREV_INDEX = 1
    SOURCE = "A"graph_dict = {"A": [0, ["A"], ("B", 2), ("D", 8)],"B": [MAX_DIST, [], ("A", 2), ("D", 5), ("E", 6)],"C": [MAX_DIST, [], ("E", 9), ("F", 3)],"D": [MAX_DIST, [], ("A", 8), ("B", 5), ("E", 3), ("F", 2)],"E": [MAX_DIST, [], ("B", 6), ("D", 3), ("F", 1), ("C", 9)],"F": [MAX_DIST, [], ("D", 2), ("E", 1), ("C", 3)],
    }result_dict = {}
    result_dict[SOURCE] = graph_dict[SOURCE]while len(result_dict) > 0:(node, val) = result_dict.popitem()(min_dist, prev, *edges) = valprint("\n Processing : %r: min_dist:%d, prev:%r" % (node, min_dist, prev))for next, weight in edges:next_val = graph_dict[next]accu_dist = min_dist + weightif accu_dist < next_val[DIST_INDEX]:next_val[DIST_INDEX] = accu_distnext_val[PREV_INDEX] = [node]result_dict[next] = next_valprint("  Edge from:%r, to:%r, accu_dist:%d, prev:%r"% (node, next, accu_dist, next_val[PREV_INDEX]))elif accu_dist == next_val[DIST_INDEX]:if node not in next_val[PREV_INDEX]:next_val[PREV_INDEX].append(node)print("  Edge from:%r, to:%r, accu_dist:%d, prev:%r"% (node, next, accu_dist, next_val[PREV_INDEX]))else:print("  Edge from:%r, to:%r, accu_dist:%d, " % (node, next, accu_dist))print("\n" + "#" * 10 + "\n")
    items = list(graph_dict.items())
    for n, val in sorted(items, key=lambda x: x[0]):print("Node:%r, accu_dist:% 2d, prev:%r" % (n, val[DIST_INDEX], val[PREV_INDEX]))
  • 选定Graph图上的节点"A"作为起点,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/827436.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式系统架构笔记

概述 能够识别与分布式系统的非功能性需求相关的指标和机制 能够识别和解释在对分布式系统进行建模时使用的各种视点。 能够在设计分布式系统时对架构样式进行适当的选择。 能够实现一个简单的分布式系统,考虑函数外属性。 能够分析架构模型并评估从不同角度呈现的分布式系统模…

【2024.11.05】所谓照片,不过是在时间长河里刻舟求剑罢了

玩摄影一年了,随便瞎写点感受好了 作为模特的感受 想成为一位摄影前就要先练习成为一位模特,这是很有必要的 我觉得九成以上的人难以做到面对镜头时表里如一 在镜头前多少都会紧张,显得不自然 除非是像我一样持续记录自我,已经适应了镜头的存在 而对于模特来说最好的照片是…

Alpha迭代阶段——第七周Scrum Meeting记录

1.Alpha阶段工作内容: 目前是项目调研、设计和游戏系统开发阶段,后续是游戏组件开发阶段。 主要工作为: (1)分析上周Scrum Meeting会议中的不足,总结本周的工作内容和不足,构思下一步的工作内容; (2)探讨游戏关卡的合理性,初步完成游戏关卡设计; (3)初步完成游戏…

19. 使用MySQL之插入数据

1. 数据插入 顾名思义,INSERT是用来插入(或添加)行到数据库表的。插入可以用几种方式使用:插入完整的行;插入行的一部分;插入多行;插入某些查询的结果。补充: 插入及系统安全: 可针对每个表或每个用户,利用MySQL的安全机制禁止使用INSERT语句,这将在第28章介绍 2. 插…

看懂 UML 类图

原文:看懂 UML 类图和时序图从一个示例开始 请看以下这个类图,类之间的关系是我们需要关注的:车的类图结构为<<abstract>>,表示车是一个抽象类; 它有两个继承类:小汽车和自行车;它们之间的关系为实现关系,使用带空心箭头的虚线表示; 小汽车为与 SUV 之间也…

linux 中awk命令实现按照 指定的字符对文本进行排序

001、[root@PC1 test1]# ls a.txt [root@PC1 test1]# cat a.txt ## 测试数据,对如下文本按照a、b进行排序输出 01 02b 03 04 05 06a 07 08 09 10b 11 12 13 14b 15 16 17 18a 19 20 [root@PC1 …

游戏关卡设计文档

关卡设计 关卡一:基础逻辑门练习 任务描述:在这个关卡中,学习如何使用基本的逻辑门(AND门和NOT门)来构建一个简单的“非与”逻辑门。 任务过程:理解逻辑门: 学习AND门的工作原理:只有当所有输入都为高电平时,输出才为高电平。 学习NOT门的工作原理:输出总是输入的…

【入门笔记】CSE 365 - Fall 2024之Computing 101(pwn.college)

真不会了,GDB把我榨干了,会了会回来填坑的【入门笔记】CSE 365 - Fall 2024之Computing 101(pwn.college) Your First Program 你的第一个程序 Your First Register 你的第一个寄存器 CPU的思维方式非常简单。 它移动数据,更改数据,基于数据做出决策,并基于数据采取行动…

Jenkins之代理节点搭建-随笔

背景: 最近在公司搭建Jenkins的CICD,Linux的代理节点,公司前辈已经搭建好了。这次由于需要一个Windows环境作为代理节点,执行UI自动化测试。 于是,就参考了教程搭建完了,花了一个小时吧,最近无聊,就在此简单写一下心得和感受,总体上很简单,遇到了一个坑,但是这个坑…

[SUCTF 2019]CheckIn

题目链接:[SUCTF 2019]CheckIn。 打开后,环境如下。可以看到,是一道文件上传题目,尝试上传 php 文件,发现存在检测。爆破其他可支持的 php 文件后缀无果。 尝试上传 .htaccess 文件,发现存在检测是否为图片的机制。通过加入 GIF 文件幻数后成功绕过检测图片的机制,但是这…

LIS系统与仪器进行通信

本文主要介绍医疗检测仪器与LIS系统之间的通信,两者之间的通信还是比较简单的,两者通过通信方式连接成功后,对接收到的数据按照特定的协议进行解析,拿到我们需要的数据保存到LIS系统,或者将LIS中的数据传到仪器上即可。 下面介绍一下比较常用的通信方式及协议。详细的协议…

0-1搭建 账务自动化集成系统

对财务人员来说,记账是一项非常繁琐又麻烦的工作,每天/月重复,要求还高;如果能实现自动化入账,绝对能提高不少工作效率。这篇文章,我们就来讨论下这个问题。在企业的财务管理中,会计工作是核心环节,会计是基于经济业务活动的根据会计法、会计准则等法律法规,通过记账、…