遍历城市 - 解决方案是否缺少这种情况?

时间:2015-09-25 20:06:29

标签: algorithm dynamic-programming

警告:此问题需要初步了解

这个问题并不完全与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]
          }

此时我想问一下我的异议是否有意义。如果确实如此,并且上面链接中提出的算法是错误的,我应该如何在解决方案中包含这种情况?我尝试递归地制定它,但无法想出任何简单的东西。

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]