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 ответ

Решение

Просто сортируйте хромосомы, прежде чем хранить их. Поскольку различные перестановки одного и того же набора целых чисел будут сортироваться в одну и ту же последовательность, вы можете использовать код, который вы уже используете, чтобы удалить дубликаты.

Другие вопросы по тегам