Java:本地搜索TSP错误

时间:2011-08-28 18:12:12

标签: java search local traveling-salesman

我在java中为TSP编写一个简单的本地搜索算法。这是方法:

public Permutation localSearch(Permutation best, int maxnoimprov) {
    int count = 0 ;
    Permutation candidate;
    do {
        candidate = stochastic_2_opt(best);
        count = (candidate.getLength() < best.getLength()) ? 0 : count+1;
        if (candidate.getLength() < best.getLength()) {
            best=candidate;
        }
        System.out.print("Candidate "); candidate.showPermutation(); System.out.println(" Current best: "+best.getLength());
    } while (count<maxnoimprov);
    return best;
}

问题是if语句始终为true,因此在运行方法时输出如下所示:

  

.... 3,34,43,32,}长度:30464.0当前最佳:30464.0

     

.... 14,37,24,49,} LENGTH:31499.0当前最佳:31499.0

     

.... 8,4,20,42,} LENGTH:30710.0当前最佳:30710.0

     

.... 23,33,12,6,} LENGTH:29321.0当前最佳:29321.0

     

.... 11,32,28,15,} LENGTH:30545.0当前最佳:30545.0   .................................................. ........

正如你所看到的那样,“最佳”总是被“候选人”所取代,而不应该。

我的代码对我来说似乎不错,但显然是错误的。

注意:

1)我检查了stochastic_2_opt()方法,没关系。

2)getLength()方法返回double值,所以我认为这可能是一个陷阱,我使用Double.compare,但即使这样也没有用。

3)我还注意到,当将if条件写为(candidate.getLength()&lt; best.getLength())时,它也始终为真。

你能帮我找到错误的地方吗?

1 个答案:

答案 0 :(得分:1)

我怀疑持有长度的Permutation成员变量是一个静态变量;这可以完美地解释结果。然后当stochastic_2_opt()创建候选时,它也会无意中设置best的长度。在这种情况下,你认为if总是正确的是一个红鲱鱼; if将评估为false,但您仍会获得相同的结果。