Хобрук: Ваш путь к мастерству в программировании

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

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

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

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

Мануэль


Ответы:


1

Мне нравится предложение Сандора об использовании NEAT, разработанный Кеном Стэнли.

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

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

кроссовер с разными топологиями в NEAT
(источник: natekohl.net)

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

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

11.07.2010
  • NEAT позволяет создавать сети с циклами / повторяемостью в них. Как вы справляетесь с этим во время оценки? 19.08.2015
  • @iliacholy обычно зависит от проблемы, которую вы пытаетесь решить. Для задач управления (таких как робот для балансировки полюсов) могут быть полезны повторяющиеся соединения, поскольку они могут обеспечить способ вычисления производных значений с течением времени. При оценке сетей вы можете выполнять однократное распространение значений на каждом временном шаге или продолжать распространение значений до тех пор, пока выходы не стабилизируются ... Я не уверен, есть ли какой-либо единственный «правильный» ответ. :) 19.08.2015

  • 2

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

    Crossover
    (источник: Geneticprogramming.com < / а>)

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

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

    3

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

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

    01.07.2010
  • Я пытаюсь понять: технически как можно поменять местами подграфы, используя матрицы смежности? 18.08.2014

  • 4

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

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

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

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

    Развитие некоторых других вещей (например, функции активации) очень похоже на это.

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

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

    02.07.2010

    5

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

    01.07.2010
    Новые материалы

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

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

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

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