如何在Java中实现这个等式?

时间:2009-05-17 21:20:22

标签: java algorithm dynamic-programming recurrence

好的,这更像是一个后续问题:How to compute optimal paths for traveling salesman bitonic tour?

首先,对于旅行商问题的比特游,我有以下复发关系:

(a) When i = 1 and j = 2, l(i; j) = dist(pi; pj )
(b) When i < j - 1; l(i; j) = l(i; j - 1) + dist(pj-1; pj)
(c) When i = j - 1 and j > 2, min 1<=k<i (l(k; i) + dist(pk; pj ))

l是以前结果的表格。我的问题是C部分:假设定义l(k,i)dist(pk,pj),我将如何在Java中实现C部分?我最初的想法是,我从k迭代1i并存储(l(k,i) + dist(pk,pj))的最小结果,但我认为这不对。

例如:

for (int k = 1; k < i; ++k) {
  tmp = l(k,i) + dist(pk,pj);
  if (tmp < min) {
    min = tmp;
  }
}

// min is the result

这可能看起来像是一个愚蠢的问题(可能是,我严重缺乏睡眠),但我希望有人可以提供帮助。

3 个答案:

答案 0 :(得分:2)

一个明显的优化是在循环之前预先计算dist(pk,pj)

例如

dist_pk_pj = dist(pk,pj);

/* then do as you did before */
for (int k = 1; k < i; ++k) {
  tmp = l(k,i) + dist_pk_pj;
  if (tmp < min) {
    min = tmp;
  }
}

注意我没有对l进行类似的优化(如预先计算l的表),因为你声明它已经是一个预先计算的表。如果不是那么我会执行相同的优化:)

但正如之前的评论所述,Java编译器可以很好地为您进行优化。我不是Java编译器执行什么优化的专家,所以最后评论带有一点点盐:)

最后是l(k,i)表有什么特殊属性吗?例如一些对称性l(i,k) = l(k,i)(我只是在这里猜测,因为我对这个问题知之甚少,所以如果听起来很古怪就忽略这个评论)。如果有任何特殊属性发布,我们可以进一步优化。

答案 1 :(得分:1)

我认为Java编译器会以其方式优化您的循环。没关系。

答案 2 :(得分:0)

(a) When i = 1 and j = 2, l(i; j) = dist(pi; pj )

(b) When i < j - 1; l(i; j) = l(i; j - 1) + dist(pj-1; pj)

(c) When i = j - 1 and j > 2, min 1<=k<i (l(k; i) + dist(pk; pj ))
import system.math

unsigned long i;

unsigned long j;

if ((i==j-1)&& (j>2))

{

unsigned long k=1;

unsigned long result;

while (k<i)

{

  result = l(k; i) + dist(pk; pj )

  min = minus(min, result);

  k++;

}

return min;

}