Я кодирую простые локальные алгоритмы поиска для TSP в Java. Вот метод:
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,} ДЛИНА: 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
.................................................. ........
Как видите, «лучшее» всегда заменяется «кандидатом», а не должно.
Мой код мне подходит, но что-то явно не так.
ПРИМЕЧАНИЯ:
1) Я проверил метод stochastic_2_opt (), и все в порядке.
2) Метод getLength () возвращает двойные значения, поэтому я подумал, что это может быть ловушкой, и я использовал Double.compare, но даже тогда он не работал.
3) Я также замечаю, что при написании условия if как (candid.getLength ()
Можете ли вы помочь мне найти, где ошибка?