我在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())时,它也始终为真。
你能帮我找到错误的地方吗?
答案 0 :(得分:1)
我怀疑持有长度的Permutation
成员变量是一个静态变量;这可以完美地解释结果。然后当stochastic_2_opt()
创建候选时,它也会无意中设置best
的长度。在这种情况下,你认为if
总是正确的是一个红鲱鱼; if
将评估为false
,但您仍会获得相同的结果。