关于Yen算法求解第3条及后续最短路径(k最短路径问题)的技术疑问
Yen算法求解第3条及后续最短路径(k最短路径问题)的技术疑问
嘿,我来帮你把Yen算法后续迭代的逻辑理清楚,结合你的具体案例拆解就好懂多了~
首先得纠正一个小误解:Yen算法求第k条最短路径时,不是简单地移除某一条或一对边,而是基于已经找到的前k-1条路径,通过「偏离路径(Deviation Path)」的机制生成候选路径,再从中筛选出最短的那个作为第k条路径。
先回顾Yen算法迭代的核心步骤(针对第k条路径)
对于每一条已经找到的前k-1条路径,我们要遍历它的每个中间节点(除了终点)作为「偏离点」,然后做三件事:
- 禁止使用任何前k-1条路径中,「起点到该偏离点」的子路径上的所有边(避免重复生成已经存在的路径);
- 禁止使用当前这条路径中,偏离点的下一条边(强制从偏离点走一条新的路线);
- 用Dijkstra算法计算从偏离点到终点的最短路径,把它和「起点到偏离点的原路径」拼接,得到一条候选路径。
把所有前k-1条路径的所有偏离点生成的候选路径收集起来,去重后,最短的那条就是第k条路径。
结合你的案例分析第3条路径的生成
你的网络里:
- 第1短路径:
MIA -> DFW -> DEN -> LAS - 第2短路径:
MIA -> MCO -> ATL -> DFW -> DEN -> LAS
你之前尝试单独移除第2短路径里的MIA->MCO、MCO->ATL或ATL->DFW,结果又得到了第1短路径——这是因为你只做了「禁止某一条边」的操作,但没限制「起点到偏离点的子路径边」,所以算法依然能走回原最短路径的路线,不符合Yen算法的完整规则。
按照Yen算法的要求,求第3短路径时,你需要同时处理第1短和第2短路径的所有偏离点:
针对第1短路径的偏离点
- 偏离点DFW:禁止
MIA->DFW(起点到DFW的子路径边),同时禁止DFW->DEN(原路径中DFW的下一条边)。然后找DFW到LAS的最短路径(比如DFW->MIA->JFK->LAX->LAS),再拼接MIA到DFW的替代路径(比如MIA->MCO->ATL->DFW),得到候选路径MIA->MCO->ATL->DFW->MIA->JFK->LAX->LAS。 - 偏离点DEN:禁止
MIA->DFW和DFW->DEN(起点到DEN的子路径边),同时禁止DEN->LAS。然后找DEN到LAS的最短路径(比如DEN->ORD->LAX->LAS),再拼接MIA到DEN的替代路径(比如MIA->MCO->ATL->DFW->DEN),得到候选路径MIA->MCO->ATL->DFW->DEN->ORD->LAX->LAS。
针对第2短路径的偏离点
- 偏离点MCO:禁止
MIA->MCO(起点到MCO的子路径边),同时禁止MCO->ATL。然后找MCO到LAS的最短路径(比如MCO->MIA->DFW->DEN->LAS),拼接后得到候选路径MIA->MCO->MIA->DFW->DEN->LAS。 - 偏离点ATL:禁止
MIA->MCO和MCO->ATL(起点到ATL的子路径边),同时禁止ATL->DFW。然后找ATL到LAS的最短路径(比如ATL->MCO->MIA->DFW->DEN->LAS),拼接MIA到ATL的替代路径(比如MIA->DFW->ATL),得到候选路径MIA->DFW->ATL->MCO->MIA->DFW->DEN->LAS。 - 偏离点DFW、DEN的情况逻辑类似,这里就不一一列举了。
最后筛选第3短路径
把所有这些候选路径收集起来,去掉重复的,再计算每条的总长度,最短的那条就是你的第3短路径。
所以你完全不需要遍历所有15种边对,只要按照「偏离点+双限制」的规则生成候选路径就好——这也是Yen算法效率比暴力遍历高的原因。
备注:内容来源于stack exchange,提问作者MKSS




