警告:此问题需要初步了解
这个问题并不完全与dynamic programming : traversal of cities重复。假设我有4个城市的以下图表[0-3]:
d[0][1] = 1;
d[0][2] = 2;
d[0][3] = 5;
d[1][2] = 3;
d[1][3] = 6;
d[2][3] = 4;
链接中提出的解决方案是
C[i,j] = {
C[i,j-1] + d[j-1,j] (if i < j-1)
min C[k,i] + d[k,j] for 0 <= k < i (if i = j-1)
}
但是让我们计算c [1] [2]:
c[1][2] = min between {
k = 0 => C[0,1] + d[0][2]
}
这是有道理的,但它不是评估此步骤的唯一途径,因为我可以将城市[0,1]分组到第一组中,并且单独使用[2]组。在那种情况下,它本来是
c[1][2] = min between {
k = 0 => C[0,1] + d[0][2]
d[0][1]
}
此时我想问一下我的异议是否有意义。如果确实如此,并且上面链接中提出的算法是错误的,我应该如何在解决方案中包含这种情况?我尝试递归地制定它,但无法想出任何简单的东西。
答案 0 :(得分:0)
您所指的解决方案确实不完整,并且不考虑第二位旅行者从j
开始时的情况。要考虑到这一点,请将周期性关系更新为:
C[i,j] = {
C[i,j-1] + d[j-1,j] (if i < j-1)
min C[k,i] + d[k,j] for 0 <= k < i
and C[0,i] (if i = j-1)
}
此处的例外情况为C[0,1]
,应设置为d[0,1]
通过这种方式,您还可以考虑第二位旅行者刚开始时的情况(C[0,i]
将是第一位旅行者从0到i
旅行的费用,并且第二位旅行者无需支付任何费用从j = i+1
开始。
请注意,您也可以将0 <= k < i
替换为0 < k < i
,因为k = 0
会导致C[0,i] + d[0,j]
严格大于C[0,i]