好的,这是更多的后续行动的问题: 如何计算的最佳途径推销员bitonic的旅游吗?

首先,为bitonic旅游的旅行推销员问题,我有以下的再次发生关系:

(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) 定义,我将如何执行部分C在Java?我的初步想法是,我迭代 k1i 和储存的最低结果 (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

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

有帮助吗?

解决方案

一个明显的优化是预先在循环之前计算你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;
  }
}

请注意我没做●一个类似的优化(如升预先计算表),因为你说,它已经是一个预计算表。如果不是,那么我会执行相同的优化:)

但是,随着以前的评论指出,Java编译器可以很好地做到这一点优化你。我在什么优化的Java编译器执行,但这样采取与一粒盐是最后的评论没有专家:)

最后在那里该l(k,i)表具有任何特殊的性质?例如一些对称l(i,k) = l(k,i)(我只是猜测这里是因为我不很了解,如果听起来很古怪的问题,所以忽略此评论)。如果有任何特殊的性质张贴他们,我们可以拿出进一步的优化。

其他提示

我认为Java编译器将优化你的循环中它的方式。并且它是确定

(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;

}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top