【问题标题】:How can I implement this equation in Java?如何在 Java 中实现这个等式?
【发布时间】:2009-05-17 21:20:21
【问题描述】:

好的,这更像是一个后续问题: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 部分?我最初的想法是我将k1迭代到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

这似乎是一个愚蠢的问题(可能是,我严重缺乏睡眠),但我希望有人能帮忙。

【问题讨论】:

    标签: java algorithm dynamic-programming recurrence


    【解决方案1】:

    一个明显的优化是在循环之前预先计算您的 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 用于将 dist 计算拉到循环之外。 Java 编译器将无法自行执行此操作,除非它可以证明 dist 函数无法更改。由于 dist 可能正在查找数组中的距离(这是可变的),我认为当前的任何编译器都无法证明这一点。
    【解决方案2】:

    我认为 Java 编译器会以它的方式优化你的循环。而且没关系。

    【讨论】:

      【解决方案3】:
      (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;
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-23
        • 2016-04-14
        • 1970-01-01
        • 1970-01-01
        • 2014-12-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多