SciTech-BigDataAIML-Algorithm-Heuristic启发式- 带weight(权重)的Graph(无向图)最优路线规划 : Dijkstra Algorithm(迪杰斯特拉算法)"由"边线加权"的Graph"得出"Routing Table(最优路由表)"
Dijkstra迪杰斯特拉算法
用“Graph”作出简图:
图例:

"选定起点"的Routing Table(路由表)
| 行号 | 节点 | 最短距离 | 前一节点 | 已访问完全 |
|---|---|---|---|---|
| 1 | A | 0 | A | T |
| 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 \overset{3}{\leftarrow} F \overset{2}{\leftarrow} D \overset{5}{\leftarrow} B \overset{2}{\leftarrow} A $ - 注意:"最短路径"可能有不只一条;
例如: "起点A"到"终点F"的"最短路线"(最短距离都为9)- $ F \overset{2}{\leftarrow} D \overset{5}{\leftarrow} B \overset{2}{\leftarrow} A $
- $ F \overset{1}{\leftarrow} E \overset{6}{\leftarrow} B \overset{2}{\leftarrow} A $
由"节点路线Graph"推导出"Routing Table(路由表)"
将 Graph 转化为 Dictionary 数据结构:
例如图示的 Graph 可转化为:
MAX_DIST = 99999999
DIST_INDEX = 0
PREV_INDEX = 1
SOURCE = "A"
graph_dict = { # Graph 转化为 Dictionary 数据结构
"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)],
}
queue_dict = {}
queue_dict[SOURCE] = graph_dict[SOURCE] # 开始只需要将初始"起点A"加入"任务队列"
while len(queue_dict) > 0: # 需要更新计算“后继”节点的"任务队列"
(node, val) = result_dict.popitem() # 取出一个任务"节点"
(min_dist, prev, *edges) = val # 得到其"当前累加权重","前一个节点" 和 "其edges"
print("\n Processing : %r: min_dist:%d, prev:%r" % (node, min_dist, prev))
for next, weight in edges: # 迭代每一条 edge
next_val = graph_dict[next]
accu_dist = min_dist + weight # 由"当前节点" 计算 "下一节点" 的"累加权重"
if accu_dist < next_val[DIST_INDEX]: # 计算得出"更优"的"累加权重":
next_val[DIST_INDEX] = accu_dist # 将"更优"的"累加权重"更新到"下一节点"
next_val[PREV_INDEX] = [node] # "更优"选择的"前一节点", 更新到"下一节点"
queue_dict[next] = next_val # 有更新的"下一节点"要加入"任务队列"
print(
" 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 + "\nRouting Table:\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])
)
运行结果:
root@localhost:~/storage/shared/AAAAA# python dijkstra.py
Processing : 'A': min_dist:0, prev:['A']
Edge from:'A', to:'B', accu_dist:2, prev:['A']
Edge from:'A', to:'D', accu_dist:8, prev:['A']
Processing : 'D': min_dist:8, prev:['A']
Edge from:'D', to:'A', accu_dist:16,
Edge from:'D', to:'B', accu_dist:13,
Edge from:'D', to:'E', accu_dist:11, prev:['D']
Edge from:'D', to:'F', accu_dist:10, prev:['D']
Processing : 'F': min_dist:10, prev:['D']
Edge from:'F', to:'D', accu_dist:12,
Edge from:'F', to:'E', accu_dist:11, prev:['D', 'F']
Edge from:'F', to:'C', accu_dist:13, prev:['F']
Processing : 'C': min_dist:13, prev:['F']
Edge from:'C', to:'E', accu_dist:22,
Edge from:'C', to:'F', accu_dist:16,
Processing : 'E': min_dist:11, prev:['D', 'F']
Edge from:'E', to:'B', accu_dist:17,
Edge from:'E', to:'D', accu_dist:14,
Edge from:'E', to:'F', accu_dist:12,
Edge from:'E', to:'C', accu_dist:20,
Processing : 'B': min_dist:2, prev:['A']
Edge from:'B', to:'A', accu_dist:4,
Edge from:'B', to:'D', accu_dist:7, prev:['B']
Edge from:'B', to:'E', accu_dist:8, prev:['B']
Processing : 'E': min_dist:8, prev:['B']
Edge from:'E', to:'B', accu_dist:14,
Edge from:'E', to:'D', accu_dist:11,
Edge from:'E', to:'F', accu_dist:9, prev:['E']
Edge from:'E', to:'C', accu_dist:17,
Processing : 'F': min_dist:9, prev:['E']
Edge from:'F', to:'D', accu_dist:11,
Edge from:'F', to:'E', accu_dist:10,
Edge from:'F', to:'C', accu_dist:12, prev:['F']
Processing : 'C': min_dist:12, prev:['F']
Edge from:'C', to:'E', accu_dist:21,
Edge from:'C', to:'F', accu_dist:15,
Processing : 'D': min_dist:7, prev:['B']
Edge from:'D', to:'A', accu_dist:15,
Edge from:'D', to:'B', accu_dist:12,
Edge from:'D', to:'E', accu_dist:10,
Edge from:'D', to:'F', accu_dist:9, prev:['E', 'D']
##########
Routing Table:
Node:'A', accu_dist: 0, prev:['A']
Node:'B', accu_dist: 2, prev:['A']
Node:'C', accu_dist: 12, prev:['F']
Node:'D', accu_dist: 7, prev:['B']
Node:'E', accu_dist: 8, prev:['B']
Node:'F', accu_dist: 9, prev:['E', 'D']
SciTech-BigDataAIML-Algorithm-Heuristic启发式- 带weight(权重)的Graph(无向图)最优路线规划 : Dijkstra Algorithm(迪杰斯特拉算法)"由"边线加权"的Graph"得出"Routing Table(最优路由表)"的更多相关文章
- 单源最短路径-迪杰斯特拉算法(Dijkstra's algorithm)
Dijkstra's algorithm 迪杰斯特拉算法是目前已知的解决单源最短路径问题的最快算法. 单源(single source)最短路径,就是从一个源点出发,考察它到任意顶点所经过的边的权重之 ...
- 带你找到五一最省的旅游路线【dijkstra算法推导详解】
前言 五一快到了,小张准备去旅游了! 查了查到各地的机票 因为今年被扣工资扣得很惨,小张手头不是很宽裕,必须精打细算.他想弄清去各个城市的最低开销. [嗯,不用考虑回来的开销.小张准备找警察叔叔说自己 ...
- 带你找到五一最省的旅游路线【dijkstra算法代码实现】
算法推导过程参见[dijkstra算法推导详解] 此文为[dijkstra算法代码实现] https://www.cnblogs.com/Halburt/p/10767389.html package ...
- Android 布局之LinearLayout 子控件weight权重的作用详析(转)
关于Android开发中的LinearLayout子控件权重android:layout_weigh参数的作用,网上关于其用法有两种截然相反说法: 说法一:值越大,重要性越高,所占用的空间越大: 说法 ...
- Android 布局之LinearLayout 子控件weight权重的作用详析
关于Android开发中的LinearLayout子控件权重android:layout_weigh参数的作用,网上关于其用法有两种截然相反说法: 说法一:值越大,重要性越高,所占用的空间越大: 说法 ...
- 【算法】狄克斯特拉算法(Dijkstra’s algorithm)
狄克斯特拉算法(Dijkstra’s algorithm) 找出最快的路径使用算法——狄克斯特拉算法(Dijkstra’s algorithm). 使用狄克斯特拉算法 步骤 (1) 找出最便宜的节点, ...
- 广度优先搜索(BreadthFirstSearch)& 迪克斯特拉算法 (Dijkstra's algorithm)
BFS可回答两类问题: 1.从节点A出发,有前往节点B的路径吗? 2.从节点A出发,前往节点B的哪条路径经过的节点最少? BFS中会用到"队列"的概念.队列是一种先进先出(FIFO ...
- 机器人路径规划其一 Dijkstra Algorithm【附动态图源码】
首先要说明的是,机器人路径规划与轨迹规划属于两个不同的概念,一般而言,轨迹规划针对的对象为机器人末端坐标系或者某个关节的位置速度加速度在时域的规划,常用的方法为多项式样条插值,梯形轨迹等等,而路径规划 ...
- Method for finding shortest path to destination in traffic network using Dijkstra algorithm or Floyd-warshall algorithm
A method is presented for finding a shortest path from a starting place to a destination place in a ...
- Dijkstra Algorithm 迪克特斯拉算法--Python
迪克斯拉特算法: 1.找出代价最小的节点,即可在最短时间内到达的节点: 2.更新节点的邻居的开销: 3.重复这个过程,直到图中的每个节点都这样做了: 4.计算最终路径. ''' 迪克斯特拉算法: 1. ...
随机推荐
- CTF你真的懂PHP吗--PHP代码审计
http://ctf5.shiyanbar.com/web/PHP/index.php 就是一个纯代码审计 访问.txt地址撸一把源码 进行分析 <?php $info = "&quo ...
- Java Factory工厂模式
/** * 工厂类:用于连接接口和子类,尽量减少客户端的复杂性 * 2017-08-25 * @author Junwei Zhu * */ interface Fruit { public void ...
- 仿EXCEL插件,智表ZCELL产品V1.8 版本发布,增加行高鼠标拖动功能
详细请移步 智表(ZCELL)官网www.zcell.net 更新说明 这次更新主要应用户要求,主要增加了行高鼠标拖动功能,并增加了单元格换行等功能,欢迎大家体验使用. 本次版本更新内容如下: 版本 ...
- GIM: 调用AI自动生成git提交消息的工具
GIM - Git Intelligence Message,是根据文件变更内容,自动请求用户配置的AI服务,生成提交消息的工具. 代码托管地址 https://github.com/davelet/ ...
- 工具:Prisms:漏洞扫描器,棱镜开源版
Prism X 集资产发现.指纹识别.弱密码检测.漏洞验证于一体,采用模块化 YAML 插件策略配置,实现与真实攻击链高度相似的 PoC 验证机制. 跨平台和轻量级设计:支持多种操作系统,易于部署和使 ...
- Number of Atoms——LeetCode进阶路
原题链接https://leetcode.com/problems/number-of-atoms/ 题目描述 Given a chemical formula (given as a string) ...
- My Calendar III——LeetCode⑪
//原题链接https://leetcode.com/problems/my-calendar-iii/submissions/ 题目描述 Implement a MyCalendarThree cl ...
- 虚拟机搭建CDH6详细过程_三节点为例
准备工作 一.安装虚拟机.centos 1.安装VMwareWorkstation虚拟化软件 首先我们使用VMwareWorkstation来快速的进行虚拟机的新建. 本文使用的版本为VMwareWo ...
- HashMap的数据结构和源码分析
如果想透彻理解什么是HashMap,首先需要知道HashMap的数据结构是什么:其次需要厘清它能做什么,即它的功能:最后,还需要知道HashMap怎么实现这些功能的.下面我们针对这三个方面展开剖析. ...
- 洛谷 P3945 三体问题
洛谷 P3945 三体问题 在物竞dalao的帮助下(简化下?)终于A了此题,于是在他的提议下来喷出题人. 接下来看题. 题意分析 模拟三维空间中\(n\)个星体的运动,求\(Ts\)后\(n\)个星 ...