Alterna · учебный материал
B. 计算通往《管理法》的路线
Topsort(加纳)、动态程序、关键路径。
Что в этом материале
- 地形分类(Kan algororitm)
- Kang 算法: 逐步
- 框中7个顶点的示例
- 用于跟踪计算的 DP
- 公式公式公式
- 仿多码
- 复杂程度
- 扩展名: 最长路径
- 关键路径(CPM)
- 什么是一条关键的道路?
- CPPC 应用
- 阿尔格瑞特姆
- 示例示例示例
- 模拟器:计算音轨+关键路径
- 互动:CPPM - 项目规划员
- 小型试验:5个问题
Содержание и основные понятия
返回目录
第24章 · 第24.3页
B. 计算通往《管理法》的路线
地形分类(卡纳)+动态编程+关键路径。
对于DAS,轨道数计为O(V+E)——从结构学上对顶点进行分类,然后从头开始对DP进行分类。
关键路径
在项目管理方面。
全球环境基金,全环基金
PIF 太平洋岛屿论坛
第1号EGE E GE No.1
他有一点点深度
01
地形分类(Kan algororitm)
地形分类是直线结构化的直线环形图(DAG)的最上层位置,因此对于每根u'v肋骨, v's是 v. v. 的顶部。 这是图中 DP 的基础。
Kang 算法: 逐步
以度计算
每一顶点都是输入它的肋骨数。
启动线线
- 把所有脊椎动物的度 都等于0
删除u
从一行开始,在结果的结尾处添加(最上顺序)。
减少在业
对于每个邻居 v 的 rib u.v. 如果 度为 0, 则加入 v 行 。
重复重复
3 -4步骤,直到线线是空的。
核查:
如果由于顶点较少,图中包含的周期(上层不可能)比图中少,则图中含有周期(顶层不可能)。
复杂程度
O(V + E)
执行程序使用一条线 (_FIFO_) ,但让我们也有一个堆叠。
框中7个顶点的示例
第1步:
in-degree: A=0, B=1, C=1, D=2, E=2, F=1, G=4
第2步:
行: [A]
第3步:
摘录A是结果:[A]
第4步:
B, C: 中B= 0, C = 0 : [B, C]
第3步:
提取 B x 结果: [A、B]
第4步:
B→D, B→E: in-degree D=1, E=1
第3步:
Cx结果:[A、B、C]
第4步:
C.E., C.F.: 中度E=0, F=0。 行: [英、法]
…
G 继续为 G
成果:
A * B * C * E * F * D * G (一个选项)
你为什么需要一个上层的?
它保证每个顶端的所有祖先在按照获得的顺序绕过脊椎时,都已经被处理,这正是正确的 DP所需要的。
02
用于跟踪计算的 DP
目标:
DAG和两个顶点,等等。从s到e有多少不同的指导路径?
公式公式公式
dp[v] = dp [u] 所有肋骨 u\v
基数 :
dp[s] = 1 (从 s 到 s 的“ 零长度路径 ” 。 所有其他 dp 值初始化为 0 。
四舍五入顺序:
顶部按地形顺序排列(Kan算法的结果)。
仿多码
topsort
← Kahn(G)
dp
[s] ← 1
for
v
in
topsort:
for
each u → v
in
edges:
dp[v] ← dp[v] + dp[u]
return
dp[e]
复杂程度
O(V + E) 是一个顶层孔+一根通过肋骨的通道。
扩展名: 最长路径
对于关键路径任务,修改公式如下:
disp[v] =所有 u\v 的最大 (dist[u] + w(u,v))
这里(u,v)是肋骨的重量。
CPM (Critical Path Method)
.
分步计算轨道A+G
计数:AB、A.C、B.D.、C.E.、K.F.、D.G.、E.G、F.G
上层:阿、英、法、法.D G
初始化 :
dp[A]=1, 其余 dp=0
步骤A:
⁇ B(dp[B] ⁇ dp [A]=1)、A ⁇ C(dps[C]+=1)
→ dp: A=1, B=1, C=1, D=0, E=0, F=0, G=0
步骤B:
bbb (dp[D] ⁇ dp [B]=1], bp[E]+=1)
→ dp: A=1, B=1, C=1, D=1, E=1, F=0, G=0
步骤C:
* rib C:E(dp[E] ⁇ dp [C] = 1: dp [E]= 2),C:F(dpp[F]+=1)
→ dp: A=1, B=1, C=1, D=1, E=2, F=1, G=0
步骤E:
-=YTET -伊甸园字幕组=- 翻译:
→ dp: A=1, B=1, C=1, D=1, E=2, F=1, G=2
D步:
-=YTET -伊甸园字幕组=- 翻译:
→ dp: A=1, B=1, C=1, D=1, E=2, F=1, G=3
步骤F:
-=YTET -伊甸园字幕组=- 翻译:
共计:
4个轨道
从A到G!
在模拟中检查: 选择开始=A, 完成=G, 按计数 。
def count_paths_dag(n, edges, start, end):
# edges = [(u, v), ...]
adj = [[] for _ in range(n)]
indeg = [0]*n
for u, v in edges:
adj[u].append(v)
indeg[v] += 1
# Кана: топологическая сортировка
q = [i for i in range(n) if indeg[i] == 0]
topo = []
while q:
v = q.pop(0)
topo.append(v)
for u in adj[v]:
indeg[u] -= 1
if indeg[u] == 0:
q.append(u)
# DP
dp = [0]*n
dp[start] = 1
for v in topo:
for u in adj[v]:
dp[u] += dp[v]
return dp[end]
# Пример:
edges = [(0,1),(0,2),(1,3),(1,4),(2,4),(2,5),(3,6),(4,6),(5,6)]
print(count_paths_dag(7, edges, 0, 6)) # 4
🔢
DP:追踪——动画
03
关键路径(CPM)
关键路径方法(紧急路径方法,CPM)
每个任务都是重量肋骨(执行时间),每个峰值都是里程碑(活动)。
什么是一条关键的道路?
关键途径是:
最长的路程
它确定了完成项目的最低可能时间:如果任何特派团被推迟,整个项目被推迟。
CPPC 应用
建筑:
墙的根基是屋顶的屋顶,关键路径是最长的面积。
软件开发:
分析师 设计 编码测试
生产:
采购材料以收集材料
后勤:
最延迟的路线决定总交货时间。
阿尔格瑞特姆
查找顶部的表层顺序( Kan 的 方位 ) 。
直接通过: dut[v] = 最大(dist[u] + w(u,v)),所有进入的肋骨 u\v。
逆向通过(可选):关键路径. /. 的每根肋骨时间相同。
关键路径 = 多根肋骨, 此处的 det[v] = dist[u] + w(u,v) 和可实现的肋骨最大化 。
重要
关键的道路不是不止一条道路,关键道路上的所有任务都有。
准备金零准备金
(浮点数=0):在不延长整个期间的情况下,不能推迟。
示例示例示例
项目目标:
AB.(3天)、A.C.(2天)、B.D.(4天)、C.E.(2天)、D.G.(1天)、E.G (2天)和F.G(1日)
关键路线:
A → B → D → G = 3+4+1 =
8天 8天
(A'B'E'G的路径 = 3+2+2=7天并不关键)
def cpm_critical_path(tasks):
# tasks = [{id, from, to, dur}, ...]
nodes = sorted(set(sum([[t['from'], t['to']] for t in tasks], [])))
adj = {n: [] for n in nodes}
indeg = {n: 0 for n in nodes}
for t in tasks:
adj[t['from']].append((t['to'], t['dur']))
indeg[t['to']] += 1
# Forward pass
early = {n: 0 for n in nodes}
q = [n for n in nodes if indeg[n] == 0]
order = []
while q:
v = q.pop(0)
order.append(v)
for to, w in adj[v]:
early[to] = max(early[to], early[v] + w)
indeg[to] -= 1
if indeg[to] == 0: q.append(to)
project_dur = early[order[-1]]
# Backward pass
late = {n: project_dur for n in nodes}
for v in reversed(order):
for to, w in adj[v]:
late[v] = min(late[v], late[to] - w)
# Float & critical path
critical = [t['id'] for t in tasks if late[t['from']] - early[t['from']] == 0]
return critical, project_dur
tasks = [
{'id':'A','from':'S','to':'A','dur':3},
{'id':'B','from':'S','to':'B','dur':2},
{'id':'C','from':'A','to':'C','dur':4},
{'id':'D','from':'A','to':'D','dur':2},
{'id':'E','from':'B','to':'D','dur':3},
{'id':'F','from':'C','to':'F','dur':1},
{'id':'G','from':'D','to':'G','dur':2},
{'id':'H','from':'E','to':'G','dur':1},
{'id':'I','from':'F','to':'I','dur':3},
{'id':'J','from':'G','to':'J','dur':2},
]
path, dur = cpm_critical_path(tasks)
print(f"Критический путь: {' → '.join(path)} ({dur} дней)")
⚡
CPM: 逐步关键路径
04
模拟器:计算音轨+关键路径
📊
DP: 道路和关键道路
开始
完成完成
05
互动:CPPM - 项目规划员
合成项目: 设定任务期限, 学习关键路径 + 每项任务的保留区 。
📋
CPM Project Scheduler
任务( 框)
期间(天数)
CPP 显示的 CPM 显示
关键路径
任何拖延都将拖延整个项目。
准备金(折流)
- 只要任务可以推迟而不延期。
🎯
小型试验:5个问题
🧩
主题的快速测试
五个问题,每个正确答案20XP