Я знаком с GA в контексте строк или текста, но не с числовыми данными.
Для строк я понимаю, как будут применяться кроссовер и мутация:
ParentA = abcdef
ParentB = uvwxyz
Using one-point crossover:
ChildA = abwxyz (pivot after 2nd gene)
ChildB = uvcdef
Using random gene mutation (after crossover):
ChildA = abwgyz (4th gene mutated)
ChildB = uvcdef (no genes mutated)
Для строки, у меня есть дискретный алфавит для go, но как эти операторы будут применяться к непрерывным числовым данным?
Например, хромосомы, представленные в виде точек в 4-пространстве (каждая ось является геном):
ParentA = [19, 58, 21, 54]
ParentB = [65, 21, 59, 11]
Было бы целесообразно применить кроссовер, переключая оси обоих родителей на потомство?
ChildA = [19, 58, 59, 11] (pivot after 2nd gene)
ChildB = [65, 21, 21, 54]
У меня такое ощущение, что все в порядке, но мое наивное представление о мутации, рандомизации ген, кажется неправильным:
ChildA = [12, 58, 59, 11] (1st gene mutated)
ChildB = [65, 89, 34, 54] (2nd and 3rd genes mutated)
Я просто не уверен, как алгоритмы geneti c могут быть применены к таким цифрам c. Я знаю, что мне нужно для GA, но не знаю, как применять операторов. Например, рассмотрим проблему минимизации функции Растригина в 4-х измерениях: пространство поиска равно [-512, 512]
в каждом измерении, а функция пригодности - это функция Растригина. Я не знаю, как операторы, как я описал здесь, могут помочь найти более подходящую хромосому.
Для чего бы то ни было, отбор элиты и инициализация популяции кажутся простыми, моя единственная путаница связана с операторами кроссовера и мутации. .
Обновление для Bounty
Я выполнил реализацию GA для непрерывных числовых данных с использованием скоростей мутаций и кроссоверов, как я описал здесь. Задачей оптимизации является функция Стиблински-Тана в двух измерениях, потому что ее легко построить на графике. Я также использую стандартные стратегии выбора элиты и турнира.
Я считаю, что лучший фитнес для населения действительно сходится к решению, а средний фитнес на самом деле не очень.
Здесь я построил область поиска на протяжении десяти поколений: черная точка является подходящим решением, а красная 'x' - глобальный оптимум:
Оператор кроссовера как я описал, кажется, работает хорошо, но оператор мутации (рандомизируя оба, или ни одно из положений x или y хромосомы), похоже, создает шаблоны перекрестия и штриховки.
Я пробежался в 50 измерений, чтобы продлить сходимость (так как в двух измерениях она сходится в одном поколении) и нанесла ее на график:
Здесь ось Y представляет, насколько близко решение было к глобальному оптимуму (так как оптимальный известен), это всего лишь доля actual output / expected output
. Это процент. Зеленая линия - лучшая популяция (цель приблизительно 96-97%), синяя - средняя численность населения (цель колеблется на 65-85%).
Это подтверждает то, что я думал: оператор мутации действительно не влияет на популяцию лучше всего. но означает ли это, что средняя численность населения никогда не сходится и колеблется вверх и вниз.
Так что мой вопрос к награде за то, какие операторы мутации могут использоваться, кроме рандомизации гена?
Просто добавлю: Я задаю этот вопрос, потому что мне интересно использовать GA для оптимизации весов нейронных сетей для обучения сети вместо обратного распространения. Если вы знаете что-нибудь об этом, любой источник, который также ответит на мой вопрос.