Alterna · учебный материал
更短路径和 MST
Dakestra, A* ,具有历史学、Bellman-Ford、MST(Prime/Crascal)、可视化器和算法比较。
Что в этом материале
- Dakestra 算法
- A* - Dakestra + 希力学
- Bellman-Ford(负权重)
- MST: 红和克拉
- 算法比较
- Dakestra 视觉化器
- MST游戏——风暴制造
- Bellman- Ford 视觉化器
- 小型试验:5个问题
Содержание и основные понятия
返回目录
第24.2页第24章
更短路径和 MST
达克斯特拉,A*,贝尔曼福特
导航员、路由器协议(OSPF、BGP)和游戏(Pathoice)都使用最短路线算法。
全球环境基金,全环基金
PIF 太平洋岛屿论坛
第1号EGE E GE No.1
奥林匹克奥林匹克奥林匹克运动奥林匹克
01
Dakestra 算法
Dakestra算法 正在找到一个快速的方法 从一个发射 顶到其他人在
带有非负加权加权数的加权图表
.
思想构想
贪婪算法: 支持当前已知的距离 。
最低最低
它不会变短的
启动: 移除[ 启动] = 0, 取消 [ =\ 全部 v\ 启动 。
新建新的
优先线条
(中位),加上所有带有diste[v]的顶部。
删除顶部
u
与最小的偏差 是当前“近” 无人参加的高峰会议。
放松娱乐
:对于每一根湿线的肋排:如果删除 [u] + w <dist [v] 更新 dist [vi] = dist][u]+w。
重复步骤 3 -4 直到线条为空 。
完成后,断层包含从恒星到所有可实现的脊椎动物的最短距离。
实例:6个顶点
计数: A.B(7), A.C.(3), B.D(2), C.B(1), C?E.(5), D.F.(6), E.F.2., B, E(8)。
步步步步骤步步一步步步
u
dist[A]
dist[B]
dist[C]
dist[D]
dist[E]
dist[F]
0
—
0
∞
∞
∞
∞
∞
1
A
0
7
3
∞
∞
∞
2
C
0
4
3
∞
8
∞
3
B
0
4
3
6
8
∞
4
D
0
4
3
6
8
12
5
E
0
4
3
6
8
10
捷径是A. C. B.
复杂程度
C 中中
二元堆积
O(V + E) log V. 。从堆放物(V- log V)中去除每个脊椎一次,每根肋骨在放松时得到处理(E-Log V)。
C 中中
一堆
(理论上):O(V)-log V + E)是最佳但难以执行的。
限制限制
阿尔格瑞特姆
负负权重不起作用
原因:贪婪的距离设置:如果负重量肋骨稍后出现,“记录”距离将不正确,无法纠正。
import heapq
def dijkstra(graph, start):
# graph[v] = [(u, w), ...] — список рёбер v→u с весом w
dist = {v: float('inf') for v in graph}
dist[start] = 0
pq = [(0, start)] # (расстояние, вершина)
while pq:
d, v = heapq.heappop(pq)
if d > dist[v]: continue # устаревший элемент
for u, w in graph[v]:
nd = d + w
if nd < dist[u]:
dist[u] = nd
heapq.heappush(pq, (nd, u))
return dist
# Пример:
graph = {
'A': [('B', 7), ('C', 3)],
'B': [('D', 2), ('E', 8)],
'C': [('B', 1), ('E', 5)],
'D': [('F', 6)],
'E': [('F', 2)],
'F': []
}
dist = dijkstra(graph, 'A')
print(f"A→F = {dist['F']}") # 10
print(f"Путь: A → C → B → E → F")
🐍
Dakestra: 代码动画
02
A* - Dakestra + 希力学
A** 最小化
f(v) = g(v) + h(v)
此处:
g(v)
- 道路(如Dakestra's)启动的实际成本。
h(v)
- 动力学:从V到目标的估价。
当h 0, A* 变成正常的Dakestra, 尤里主义将搜索方向指向目标, 减少了接受治疗的脊椎动物的数量。
谷地功率
经济学
公式公式公式
移动
曼哈顿
|x₁ − x₂| + |y₁ − y₂|
4点电网
斯洛文尼亚
√((x₁ − x₂)² + (y₁ − y₂)²)
任何方向
去你妈的!
max(|x₁ − x₂|, |y₁ − y₂|)
8点电网
维权主义容忍
经济学
允许
(可受理)如果h(v) ⁇ h* (v),则对所有人而言,h* (5) 是目标之前的真实价值。
单列
(golderov: h(a) 成本(a,b) + h(b)), A* 保证了最佳路径。
与 Dakestra 的比较
A* 与 Dakestra 相比, 实际中, 如果超光学是好的, 则比 Dakestra 更快。 在最坏的情况下( h × 0 或 坏的 尿素 ) , 复杂性与 Dakestrea 相同 : O ( V+E) 和 V 。
import heapq
def astar(graph, start, goal, h):
# h(v) — эвристика: оценка расстояния от v до goal
open_set = [(h(start), 0, start)] # (f, g, v)
g_score = {start: 0}
came_from = {}
while open_set:
f, g, v = heapq.heappop(open_set)
if v == goal:
# восстановление пути
path = []
while v in came_from:
path.append(v)
v = came_from[v]
path.append(start)
return path[::-1], g_score[goal]
if g > g_score.get(v, float('inf')):
continue
for u, w in graph.get(v, []):
ng = g + w
if ng < g_score.get(u, float('inf')):
came_from[u] = v
g_score[u] = ng
nf = ng + h(u)
heapq.heappush(open_set, (nf, ng, u))
return None, float('inf') # путь не найден
# Пример сетки 4×4, Манхэттенская эвристика:
def manhattan(a, b, cols=4):
return abs(a // cols - b // cols) + abs(a % cols - b % cols)
grid = {(i, j): [] for i in range(4) for j in range(4)}
# ... строим граф из соседних клеток ...
# path, cost = astar(grid, start=0, goal=15, h=lambda v: manhattan(v, 15))
🧭
A*在网格上:交互式可视化器
开始
目标目标目标和目标目标目标
开放
已关闭
障碍
03
Bellman-Ford(负权重)
和Dakestra不同的是 Bellman -Ford的算法
负负加权数
和
检测阴性循环
价格更为复杂。
阿尔格瑞特姆
启动: 移除[ 启动] = 0, 取消 [ =\ 全部 v\ 启动 。
重复重复
V - 1次
:每根肋骨(u, v, w)要放松:如果 dist[u] + w <dist[v],更新 dist [v] =dist [u]+w。
负循环测试
:再次行走所有肋骨。如果缩小一个距离,图中的负循环从一开始就可以实现。
为什么是V -1迭代?
没有周期的最短路径包含
最大V - 1 根
每次迭代, 算法“ 检测” 距离 k 肋骨最短( k 是迭代数 ) 。
复杂程度
O(V · E)
我们绕着E肋骨走 慢于Dakestra 但同时又保持负重
负周期
计数: A.B.(1), B.C.(3-3), C.B(1)。路径 B.O.C.1B:总重量 -3+1=-2。负重量周期 - 距离可以无限期缩短。算法将在Vth迭代中检测到这一点。
何时使用
当盒子里有负重量肋骨时(例如有“收入”的金融模型),或者当需要检查是否存在负周期时,需要Bellman-Ford。 Dakestra偏爱其他情况。
04
MST: 红和克拉
MST (Minimum Spanning Tree)
- 连接所有脊椎的子集
最低重量
MST完全是V -1肋骨
Kruscal 定理
一行中所有 MST 都有相同的总值。 如果所有重量都不同, MST 是独特的 。
Prima 算法
从任何顶部开始 。
在所有连接连接的肋骨中 被访和无人照料的脊椎中 选择
最低
.
添加肋骨和新顶部。
重复, 直到 V 顶点被访问 。
复杂性:
O((V+E) · log V) , 堆叠( 厚度图 - O(V2) ) 。
更好
稠密
伯爵夫人
克拉斯卡算法
每根肋骨都要按重量排序
排骨要排成一行,
如果 肋排, 添加
不构成周期
(DSU 检查是“非反向多重”的结构) 。
重复,直到加入 V-1 肋骨。
复杂性:
O(m - log m) 地点 m =
更好
稀释
伯爵夫人
🌲
初级:逐步建造MST
05
算法比较
阿尔格瑞特姆
复杂程度
半兽重量
任用任用
专业专业
Dakestra 达克斯特
O((V+E)·log V)
无无无无 无无
最短距离从一个顶端
贪婪、非负负权重
A*
O((V+E)·log V)*
无无无无 无无
与希力学一起寻找路由
在好 h(v) 时快于 Dakestra
贝尔曼-福特
O(V·E)
是 是
负加权数、周期
检测周期。
弗洛伊德·沃塞尔
O(V³)
是 是
全部上对齐
矩阵执行
最低轴(MTS)
接受。
O((V+E)·log V)
—
MST
密度图形更好。
油漆
O(m·log m)
—
MST
更适合稀释的图表
* A*的复杂程度取决于疲劳学的质量,最坏的情况是O(V+E)和Dakestra一样。
算法的选择
所有重量 ⁇ 0, 您需要最短的路径
Dakestra 达克斯特
我们需要一种方法+有累赘(网、地图)
A*
有负权重或周期。
贝尔曼-福特
我需要所有短裤
弗洛伊德·沃塞尔
最起码的食肉动物 密度的图表
接受。
最小的骨骼,稀释的图表
油漆
06
Dakestra 视觉化器
📍
Dakester是一步一步的。
07
MST游戏——风暴制造
克拉斯卡算法:从
很简单。
如果肋骨连接不同的成分, 它在MST。如果你得到一个循环, 我们跳过。
🌲
MST 游戏: 找到最小的丘体
选根肋骨,从现有的肋骨中取出最小重量。
5根肋骨
.
MST的重量 :
0
切割财产(Krascal定理)
在图表的任何一节中,两个不同组成部分之间的最小肋排重量为MST。红底线利用了这一点:在每一步,我们加上最小的肋排,不会形成循环。
08
Bellman- Ford 视觉化器
每个人,
V-1 迭代
所有肋骨都是可见的,“放松”―― 距离得到纠正。Vth迭代检查负循环。
⚡
Bellman -Ford 一步一步来
负周期
如果在迭代上至少缩短了一个距离,则图中有一个可实现的负周期。
未定义
:可以无限期地减少。
🎯
小型试验:5个问题
🧩
主题的快速测试
五个问题,每个正确答案20XP