我正在为 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 语句始终为真,因此在运行该方法时,输出如下所示:
....3, 34, 43, 32, }LENGTH: 30464.0 当前最佳:30464.0
....14、37、24、49、}长度: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、}长度:30545.0 当前最佳:30545.0 .................... ......................
如您所见,“最佳”总是被“候选”取代,而它不应该。
我的代码对我来说似乎很好,但显然有问题。
笔记:
1) 我检查了 stochastic_2_opt() 方法,没关系。
2) getLength() 方法返回双精度值,所以我认为这可能是一个陷阱,我使用了 Double.compare,但即使那样也没有用。
3) 我还注意到,当将 if 条件写为 (candidate.getLength() < best.getLength()) 时,它也总是正确的。
你能帮我找出错误在哪里吗?