Применение кроссовера и мутации на график (генетический алгоритм)

StackOverflow https://stackoverflow.com/questions/3160619

Вопрос

Я играю в раунду с генетическим алгоритмом, в котором я хочу развиваться графики. Знаете ли вы способ применить кроссовер и мутацию, когда хромосомы - графики?

Или я упускаю кодировку для графиков, которые позволили мне применить «обычный» кроссовер и мутацию над битовыми строками?

большое спасибо! Любая помощь, даже если она не связана напрямую с моей проблемой, ценится!

Мануэль

Это было полезно?

Решение

мне нравиться Сандорское предложение Использование Кена Стэнли Аккуратный алгоритм.

Аккуратный был разработан для развития нейронных сетей с произвольными топологиями, но это просто в основном направленные графиками. Было много способов развивать нейронные сети до аккуратного, но один из самых важных взносов аккуратства заключался в том, что он предоставил способ Выполните осмысленный кроссовер между двумя сетями, которые имеют разные TopLogies.

Для этого аккуратно использует Историческая маркировка Прикрепленный к каждому генну, чтобы «выровнять» гены двух геномов во время кроссовера (обрабатывают биологических биологов синапсис). Например:

crossover with different topologies in NEAT
(источник: Natekohl.net.)

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

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

Другие советы

Вы можете также попробовать Генетическое программирование. Отказ График будет самым близким к дереву, а GP использует деревья ... Если вы все еще хотите использовать газ вместо GPS, то посмотрите, как пересекается на GP, и это может дать вам идею, как это выполнить На графиках вашего GA:

Crossover
(источник: geneticprogramming.com.)

Вот как кроссовер на деревья (и графики) работает:

  1. Вы выбираете 2 образца для спаривания.
  2. Вы выбираете случайное узел от одного родителя и поменяете его случайным узлом в другом родиве.
  3. Полученные деревья - это потомство.

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

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

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

Если у вас есть фиксированная топология, то кроссовер, и мутация довольно просты (при условии, что вы только эволюционируете веса сети):

Кроссовер: возьмите несколько весов от одного родителя, остальное от другого, может быть очень легко сделать, если вы представляете веса как массив или список. Для более подробной информации или альтернативы см. http://en.wikipedia.org/wiki/crossover_%28genetic_algorithm%29..

Мутация: просто выберите некоторые из весов и немного отрегулируйте их.

Эволюция некоторых других вещей (например, функция активации) довольно похожа на них.

Если вы также хотите развивать топологию, то вещи становятся намного интереснее. Есть несколько дополнительных возможностей мутации, такие как добавление узла (, скорее всего, подключенные к двум уже существующим узлам), разделение соединения (вместо A-> B имеют A-> C-> B), добавляя соединение или противоположности из этих.

Но кроссовер не будет слишком легко (по крайней мере, если количество узлов не зафиксировано), поскольку вы, вероятно, захотите найти «совпадения» узлов (где сопоставление может быть что-нибудь, но, вероятно, связано с аналогичной «ролью» или похожее место в сети). Если вы также хотите сделать это, я бы очень рекомендую изучать уже существующие методы. Тот, который я знаю и люблю, называется аккуратным. Вы можете найти некоторую информацию об этом в
http://en.wikipedia.org/wiki/neuroevolution_of_augmenting_topologies.
http://nn.cs.c.utexas.edu/?neat.
а также http://www.cs.ucf.edu/~kstrley/neat.html.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top