Genotype.evolve() выдает "Метод сравнения нарушает его общий контракт"
Я пишу генетический алгоритм для решения проблемы классификации.
Я настраиваю свою конфигурацию точно так, как я видел, что другие делают онлайн, но использую мою собственную функцию фитнеса (обязательно). Я генерирую случайный генотип, который содержит мою популяцию, а затем развивает эту популяцию. Однако иногда я получаю сообщение об ошибке "Метод сравнения нарушает его общий контракт!"
Я понимаю, что означает эта ошибка, но так как она вызывается в методе Framework.evolve(), я не уверен, что я могу сделать...
Есть мысли / помощь? Благодарю.
Моя настройка:
DefaultConfiguration.reset();
Configuration config = new DefaultConfiguration();
config.setPopulationSize(100);
// Setup fitness function
FitnessFunction fit = new HyperrectFitnessFunction(is);
config.setFitnessFunction(fit);
// Get bounds
double[][] bounds = getInstanceSetBounds(is);
// Setup chromosome
Chromosome sample = new Chromosome(config, createSampleGenes(config, attrCount, bounds));
config.setSampleChromosome(sample);
// Generate initial population
Genotype population = Genotype.randomInitialGenotype(config);
// Evolve
int i = 0;
IChromosome bestSolution = null;
for (i = 1; i < 100 + 1; i++) {
population.evolve();
bestSolution = population.getFittestChromosome();
double bestFitness = bestSolution.getFitnessValue();
if (bestFitness > 0.8)
break;
}
1 ответ
Это означает именно то, что он говорит. Эта ошибка обычно означает, что ваш compareTo
метод не согласован, что может означать, что порядок зависит от порядка параметров.
Например, если compareTo(a,b)
является 0
, затем compareTo(b,a)
также должно быть 0. То же самое можно сказать и для отношений "больше чем" и "меньше". Инвертирование параметров также должно инвертировать ответ.
Если это не выполняется, невозможно найти сортировку значений, так как порядок зависит от точного ввода компаратора.