编程语言
首页 > 编程语言> > 如何在Java中实现此等式?

如何在Java中实现此等式?

作者:互联网

好的,这更多是一个后续问题: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从1迭代到i,并存储(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;
  }
}

注意,我没有对l进行类似的优化(如对l的表进行预计算),因为您说它已经是预计算的表.如果不是,那么我将执行相同的优化:)

但是正如前面的评论所述,Java编译器可以很好地为您进行优化.我不是Java编译器执行什么优化的专家,所以请您在最后的评论中花点时间:)

最后,l(k,i)表具有什么特殊属性?例如,一些对称性l(i,k)= l(k,i)(我只是在这里猜测,因为我对这个问题了解不多,所以如果听起来很古怪就可以忽略此评论).如果有任何特殊属性,可以将它们发布出来,我们可以进行进一步的优化.

标签:recurrence,dynamic-programming,java,algorithm
来源: https://codeday.me/bug/20191210/2103058.html