algorithm - 包含限制的 TSP 的 Bellman-Held-Karp 算法
问题描述
我正在使用动态编程修改 TSP 的 Bellman-Held-Karp 算法。在这种情况下,经典的 Bellman-Held-Karp 算法的不同之处在于必须先访问某些城市,但我需要保留最小化路径成本。在用编程语言实现它之前,我正在修改伪代码,最终解决并证明解决方案。我正在尝试一个示例,例如[1,2,3,4,5..n]
,在完整图表中,从第一个城市(第一个索引)开始排序的城市,例如,第 5 个城市不能出现在第二个城市之前。我使用这个伪代码作为基础:
function algorithm TSP (G, n) is
for k := 2 to n do
C({k}, k) := d1,k
end for
for s := 2 to n−1 do
for all S ⊆ {2, . . . , n}, |S| = s do
for all k ∈ S do
C(S, k) := minm≠k,m∈S [C(S\{k}, m) + dm,k]
end for
end for
end for
opt := mink≠1 [C({2, 3, . . . , n}, k) + dk, 1]
return (opt)
end function
我正在考虑将最大城市索引保存在列表中(在重复中),以确保它永远不会更高,但我不确定这种方法是否正确。
minm≠k,m∈S [C(S\{k}, m) + dm,k] + max(S\{k + i < 4})
是正确的这种方法吗?有人能帮我吗?
解决方案
我不明白你的第二个代码片段,或者你记录“最大城市索引”的意思(对于给定的集合,这不是总是一样的S
吗?),但无论如何:根据我的经验,试图记录DP 解决方案旁边的“附加信息”几乎总是会导致细微的错误,通常是因为它假设某种解决方案的唯一性实际上并不存在。例如,可能有两条不同的最佳长度路径访问一组S
顶点并结束于m
——那么边信息实际上是在谈论哪一条?
一种不同的方法允许任意优先约束。让succ(v)
是必须出现在 city之后的一组城市v
。改变
C(S, k) := minm≠k,m∈S [C(S\{k}, m) + dm,k]
至
if succ(k) ∩ S\{k} = ∅:
C(S, k) := minm≠k,m∈S [C(S\{k}, m) + dm,k]
else
C(S, k) = INF
这个想法只是对任何v
出现的后继者的路径进行严厉惩罚v
,确保它永远不会被选为最佳解决方案的一部分。
推荐阅读
- spring - 使用 spring webflux WebClient 进行服务发现
- sql - 将数据类型 varchar 转换为数字时出错 - 但具有数值
- wordpress - 无法在 Docker 上使用 Wordpress 保存帖子
- excel - 如何获取从 A2 到 End 的范围(无选择语句)
- applescript - 当我询问前窗的名称时,AppleScript 返回最后一个 Finder 的名称
- node.js - 有没有办法将默认值设置为缺少/可选的 JSON 属性?
- c++ - Switch 语句不显示除默认语句之外的任何类型的输出
- wordpress - 将退款金额添加到 WooCommerce 退款电子邮件?
- javascript - 更改 firebase.databse 中的变量
- c# - 用于匹配.net中重复值的正则表达式