Быстрый пример генетической эволюции в JavaScript: Давайте сделаем ребенка.

«Процесс мутации является единственным известным источником новых материалов генетической изменчивости и, следовательно, эволюции». - Добжанский, 1957.

Алгоритмы Genetic Evolution действительно очаровательны для меня. Способность программировать виртуальную ДНК - просто феноменальный подвиг информатики. Способность написать в коде теорию эволюции Дарвина и реально увидеть модель выживания наиболее приспособленных в действии просто поразительна.

Я никогда раньше не касался генетических алгоритмов и решил, что пора начинать. И что может быть лучше для начала, чем фактическое начало? В этом уроке я создам «палку», и эта палочка хочет достичь «круга». Получите от этого то, что хотите, но я пишу учебные пособия для всей семьи, и так будет всегда.

Я получаю невероятно сильное влияние от The Coding Train: Coding Challenge # 29 в качестве вдохновения для этого. Ссылка на это здесь. Он был вдохновлен Smart Rockets, поэтому, хотя я не делаю ничего нового или оригинального, я надеюсь, что это послужит примером алгоритма генетической эволюции. Я использую библиотеку P5.JS, которую я бы описал как визуальную библиотеку JavaScript.

Прежде чем я смогу создать какой-либо генетический алгоритм, мне нужно сначала установить фактическую настройку. Сначала я создаю очень простую страницу HTML.

У меня есть две библиотеки для P5. Main обрабатывает рисование на экране, создание переменных и т. Д. Палочка - это линия, которая будет развиваться, популяция - это коллекция палочек, а ДНК - это то, что я бы назвал ядром генетического алгоритма. Давайте посмотрим на код для Stick:

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

Население действительно не так интересно. Он создает 25 палочек, которых я считаю достаточными для населения, а затем перемещает их на экране. С помощью этой функции не ломайте барьеров! ДНК:

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

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

Так что, если мы запустим это в том виде, в каком оно есть в настоящее время, мы получим это:

Смущенные маленькие палочки

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

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

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

вар фитнес = 0

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

this.calculateFitness = function () {
var distance = dist (this.pos.x, this.pos.y, target.x, target.y)
this.fitness = 1 / расстояние
}

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

Таким образом, этот пул относительно прост в концепции. Выше мы уже выяснили, что наиболее успешными являются те, которые наиболее близки к кругу. Чем ближе палка, тем больше раз ее геном будет введен в пул, и тем больше вероятность его размножения. Палка, которая сделала это 5% пути, будет иметь 5% шансов на воспроизведение, в то время как палка, которая сделала это 70% пути, имеет 70% шансов на воспроизведение. Надеюсь, я объяснил это достаточно хорошо. Более успешная палка = лучший шанс возродиться как часть новой палки.

Выше две новые функции. Отбор, как следует из названия, отбор родительских генов из генофонда. Эти гены затем объединяются, чтобы сформировать новую ДНК в кроссовере, который, в свою очередь, затем назначается новой палке! Вот и все, так как мы хотим сохранить это относительно простым и элементарным.

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

Все еще смущенные, но немного более умные палки.

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

Очень умные, альфа-палочки.

Чем дольше он работает, тем больше на экране появится только одна палка. Эта палка представляет собой оптимальную палку! Выбранная палка. Вот они, кульминация нашего генетического алгоритма:

Гениальная палка (и)!

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

Как уже упоминалось в начале, на это сильно повлиял The Coding Train. Ссылка на их репо.

Мой полный код