Генетический алгоритм - проблема суммы подмножеств - PullRequest
1 голос
/ 18 мая 2011

Я должен сделать проект, который с помощью генетического алгоритма решает проблему суммы подмножеств.К сожалению, при кодировании алгоритма я обнаружил большую проблему ...

Мой алгоритм:

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

(алгоритм былвзяты из книги «Генетические алгоритмы + структуры данных = программы эволюции, глава 2») Такие переменные, как размер популяции, объем данных, объем сбора данных, количество шагов, количество мутаций (в шаге), количество пересечений(в шаге) жестко задается в настройках программы.

Проблема в том, что после определенного (относительно небольшого) количества шагов в популяциивсе хромосомы идентичны.Проблема иллюстрирует этот график: http://imageshack.us/m/96/7693/wykresb.png

Что я делаю не так?Как это исправить?Заранее спасибо.

Редактировать:

Здесь Вы можете найти логи из моего приложения: http://paste.pocoo.org/show/391318/

Я думаю, что рулетка не самая лучшаярешение (как сказал deong).Мутации также необходимо улучшить.

Ответы [ 3 ]

3 голосов
/ 18 мая 2011

Вот (потенциально) проблема.Отказ от ответственности, конечно, в том, что у вас может быть просто глючная программа.

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

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

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

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

1 голос
/ 19 мая 2011

У меня раньше была похожая проблема, я хотел бы, чтобы она была такой же, как у вас

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

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

Другими словами, убедитесь, что ваш список всегда содержит разные хромосомы и всегда отсортирован от лучшего к худшему!

Примечание: генетические алгоритмы, с которыми я работаю, обычно таковы (это наиболее общийалгоритм и наиболее часто используемые):

  • создать P различных хромосом и добавить их в список Pop;
    1. while (не найдено оптимального решения && число итераций
    2. создавать новые хромосомы с использованием кроссовера, мутации или любых других методов;
    3. добавить созданную хромосому в список Pop
    4. отсортировать список Pop (от лучшего до худшего)
    5. выбрать первые P различных хромосом и отбросить все остальные изнаселение
    6. конец пока
1 голос
/ 18 мая 2011

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

Локальной оптимумы можно избежать:

  • Более высокая частота мутаций
  • Другая функция кроссовера

Более того, может быть полезно убить клонов . Это означает, что вы «быстро» просматриваете свою популяцию после каждой итерации и не учитываете клоны. Под быстрым я подразумеваю, что вы просто ищете приблизительные клоны, потому что проверка на точные клоны потребует O (m * n ^ 2), где n - размер вашей популяции, а m - размер хромосомы. Этот метод помог мне решить другую проблему, когда я столкнулся с клонами.

Надеюсь, это помогло, Christian

EDIT

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

...