我在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,}长度: 31499.0电流最佳: 31499.0
....8,4,20,42,}长度: 30710.0电流最佳: 30710.0
....23,33,12,6,}长度: 29321.0电流最佳: 29321.0
....11,32,28,15,}长度: 30545.0电流最佳: 30545.0 ....11
正如你所看到的,“最好的”总是被“候选人”所取代,而它不应该。
在我看来,我的代码很好,但显然有些地方出了问题。
备注:
1)我检查了stochastic_2_opt()方法,没有问题。
2) getLength()方法返回双值,因此我认为这可能是一个陷阱,我使用了Double.compare,但即使这样也不起作用。
3)我还注意到,当将if-条件写为(candidate.getLength() < best.getLength())时,也总是正确的。
你能帮我找出哪里出错了吗?
发布于 2011-08-28 19:02:53
我怀疑保持长度的Permutation成员变量是一个静态变量;这可以很好地解释结果。然后,当stochastic_2_opt()创建候选时,它也会不经意地设置best的长度。在这种情况下,您认为if始终是正确的,这是一种“鲱鱼”;if将计算为false,但您仍然会得到相同的结果。
https://stackoverflow.com/questions/7222897
复制相似问题