GA Jgap: Избегайте дубликатов (дублетов) хромосом, где порядок не учитывается
Я реализую с помощью JGAP генетический алгоритм для решения проблемы, когда хромосома представляет собой список целых чисел (я хотел бы сохранить N подходящих решений в результате, а не только самое подходящее).
Каждое целое число должно появляться только один раз в хромосоме (я сделал это, установив fitness=0 для хромосом с дублирующимися аллелями, и это нормально...)
Моя проблема:
В моей проблеме порядок, в котором числа появляются в хромосомах, не учитывается ( 1 2 3 совпадает с 2 1 3).
Итак, в конце выполнения у меня есть список возможных решений
Я использовал решение, о котором сообщалось здесь ( используя JGAp (библиотека генетических алгоритмов) и дублированные хромосомы), чтобы удалить дубликаты хромосом следующим образом:
conf.getNaturalSelectors(false).clear();
BestChromosomesSelector bcs = new BestChromosomesSelector(conf, 0.8d);
bcs.setDoubletteChromosomesAllowed(false);
conf.addNaturalSelector(bcs, false);
Но он удаляет только идентичные хромосомы, но не удаляет, например:
A B C D
A C B D
B A C D
Эти хромосомы в моей проблеме представляют собой одно и то же решение
В итоге я получаю список хромосом с одинаковой пригодностью и одинаковым значением, но с генами в другом порядке.
Как я могу удалить хромосомы, которые представляют одно и то же решение, несмотря на порядок, в котором оно представлено?
Спасибо, хорошего дня.
1 ответ
Просто сортируйте хромосомы, прежде чем хранить их. Поскольку различные перестановки одного и того же набора целых чисел будут сортироваться в одну и ту же последовательность, вы можете использовать код, который вы уже используете, чтобы удалить дубликаты.