Генетические алгоритмы: как сделать кроссовер в задачах "подмножества"?

У меня есть проблема, которую я пытаюсь решить с помощью генетических алгоритмов. Проблема заключается в выборе некоторого подмножества (скажем, 4) из 100 целых чисел (эти целые числа-просто идентификаторы, представляющие что-то еще). Порядок не имеет значения, решение проблемы-это набор целых чисел, а не упорядоченный список. У меня хорошая фитнес-функция, но у меня проблемы с функцией кроссовера.

Я хочу иметь возможность спаривать следующие две хромосомы:

[1 2 3 4] и [3 4 5 6] в нечто полезное. Ясно, что я не могу использовать типичную функцию кроссовера, потому что у меня могут быть дубликаты в моих детях, которые будут представлять недействительные решения. Каков наилучший метод кроссовера в этом случае.

5 ответов


просто игнорируйте любой элемент, который происходит в и множеств (т. е. в их пересечении.), то есть оставить эти элементы без изменений в обоих наборах.

остальные элементы образуют два непересекающихся набора, к которым вы можете применить практически любое случайное преобразование (например, случайное переключение некоторых пар) без получения дубликатов.

Это можно рассматривать как упорядочение и выравнивание обоих наборов, чтобы соответствующие элементы были обращены друг к другу и применяли один из стандартные алгоритмы кроссовера.


иногда полезно позволить вашему решению выйти" за пределы", чтобы ваш поиск сходился быстрее. Вместо того, чтобы делать набор из 4 уникальных целых чисел требованием для вашей хромосомы, сделайте количество целых чисел (и их уникальность) частью функции пригодности.


Я действительно не знаю, что вы имеете в виду под "типичным кроссовером", но я думаю, что вы можете использовать кроссовер, подобный тому, что часто используется для перестановок:

  • забрать m ints от первого родителя (m n, где n-количество целых чисел в наборах)
  • сканируйте второй и заполните свое подмножество из него (n-m) ints, которые свободны (не в подмножестве уже).

таким образом, вы будете есть n ints с первого и n-m ints от второго родителя, без дублирования.

звучит как действительный кроссовер для меня :-).

Я думаю, было бы полезно не делать никаких шагов по упорядоченным наборам (или использовать итератор, где порядок возвращаемых элементов каким-то образом коррелирует с естественным порядком ints), иначе меньшие или большие числа получат более высокий шанс быть в ребенке, делающем ваш поиск пристрастный.

Если это лучший способ зависит от проблемы, которую вы хотите решить...


чтобы объединить множества A и B, вы можете выбрать результирующее множество s вероятностно так, чтобы вероятность того, что x находится в S (количество множеств из A, B, которые содержат x) / 2. Это будет гарантированно содержать пересечение и будет содержаться в союзе, и будет ожидаться мощность 4.


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