Рубрики
Без рубрики

Нырять в генетические алгоритмы: 101

Введение в генетические алгоритмы

Автор оригинала: Ethar Alali.

Путешествие в странный мир генетических алгоритмов.

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

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

Конечно, поэтому узнать о своей среде, была работа для искусственных нейронных сетей. Однако это было только половина истории.

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

Видите ли, дети рождаются с особыми складками в мозге и других генетических чертах. «Успешные» гены развивались в течение миллионов лет, и они позволяют людям принимать успех в качестве вида … Некоторые мировые лидеры в стороне в стороне. Гены дают нам базовый уровень, который наш мозг построил на атаку, чтобы сделать нас бессмысленными людьми сформированы контекстом, в котором мы находимся.

Задний план

Генетические алгоритмы рассматриваются многие ветви искусственного интеллекта. Лично я не думаю, что это совершенно правильно, так как он больше в царстве распределенных многоагентных систем и программного обеспечения Bippa. «Интеллект» в таких системах является возможность решить проблему или умно пройти проездное пространство поиска. Грубое сравнение – это как «Мудрость толпы», но работает через генетическую или мемтичную передачу информации. Эти же генетические концепции также могут быть применены к программированию таким образом, что программы, построенные из нуля, решают проблемы, более эффективно, чем люди, имеют кодирование традиционных алгоритмов. Как часто бывает случай, комплексное поведение населения нелинейно, даже если правила размножения отдельных членов по своей природе простой.

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

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

Генетические алгоритмы-1 точки кроссовера и мутация .png

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

Представляет несколько ключевых проблем, которые нам нужно решить не менее важно, измерять «фитнес». Откуда вы знаете, что самые сильнистые члены теоретики?

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

Прохождение

Я собрал несколько ломковых кодов Aftera Talk, я дал в Manchester Barcamp 2015, чтобы проиллюстрировать действительно просто генетический алгоритм на работе. Это полезное введение в тему.

Что вам нужно?

Если вы хотите катиться, вам понадобится jQuery и ваш любимый редактор. Я бросил код в jsbin здесь Отказ

Лом кода порождает агенты к идеальной строке, в этом случае, предоставляемый пользователем в текстовом поле, помеченной «Строка фитнеса:». Для этого демо я замедлил эволюцию, чтобы облегчить посмотреть, как она работает в визуализации. Вы можете увидеть его в самом правом раме JSBIN, которая содержит популяцию 100 агентов, каждый как круг в сетке.

Метрика расстояния

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

Расстояние гамминга – это просто количество точек в строке, где характеры отличаются. Что в этом случае число различных персонажей, каждая из двух строк имеет.

Например, слово «шина» и «шина» имеют расстояние 1, так как они отличаются на символ 1 (у одного есть «я» другой A ‘Y’).

Аналогичным образом, «сцена» и «штаб» имеют расстояние от мотывания 2. Чем ближе к нулю. Функция фитнес-функции является, подработка кандидата. Давайте посмотрим на то, как это закодировано:

function fitness(agent) {
  // Get the target string to find
    var target = $("#fitness-name").val().toUpperCase();
    var distance = hammingDistance( agent, target );
    
    return distance;    
}

// ...

function HammingDistance(agent, targetFitness) {
  var distance = 0;
    var target = targetFitness.toUpperCase();
    var upperAgent = targetFitness.toUpperCase();
    
    for( var i = 0; i < agent.generCode.length; i++ ) {
    	distance += upperAgent[i] === target[i]? 0 : 1;
    }
    return distance;
}

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

Примечание:

Если вы знакомы с TDD/BDD, это может показаться странно знакомым. Целью является ваши критерии тестирования приема, первоначальное состояние – это то, где начинаются агенты и действия, как он получает от Pre to Post-Условия, вы не заботитесь о своем родах, как вы надеетесь, что менеджеры/архитекторы оставляют Devs пробелы.

Разведение

В этом блоке кода все, что я делаю, делает топ 33%, когда отсортированы по фитнесу и разведению их. Нет причин, которые они не могут размиться в других частях населения, но это может занять больше времени для сходства.

 this.Breed = function () {
        // Sort the populous by fitness utility
        me.population.sort(function(agent1, agent2) {
            return  fitness(agent1) - fitness(agent2);
        });

        // Only breed the first half of the list
        for (var j = 0; j < (me.population.length / 3) ; j++) {
            var item = me.population[j];
            var matePosition = Math.round((Math.random() * (me.population.length / 3)));
            var pairedMate = me.population[matePosition];
            item.crossOverWith(pairedMate);
        }
    };

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

function Baby(name, geneCode) {
    this.geneCode = geneCode;
    this.name = name;

    this.crossOverWith = function(otherParent)
    {
        // Pick a random point in the string
        var endOfString = this.geneCode.length;
        var swapPoint = Math.random() * endOfString;

        // Find same position in other parent
        var myGeneticSubencoding = geneCode.substring(swapPoint, endOfString);
        var myPartnerGeneticSubencoding = otherParent.geneCode.substring(swapPoint, endOfString);

        // Swap the two bits from then on
        this.geneCode = geneCode.substring(0, swapPoint) + myPartnerGeneticSubencoding;
        otherParent.geneCode = geneCode.substring(0, swapPoint) + myGeneticSubencoding;
    };

    this.mutate = function() {
        // This mutates itself. 
        // Pick digit position
        var endOfString = this.geneCode.length;
        var mutatePoint = Math.random() * endOfString;

        // randomise the digit in that position
        this.geneCode[mutatePoint] = Math.random() * 9;
    };
}

Шокирующий монстр Франкенштейна …

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

Чем темнее круг, тем короче расстояние от цели. Полностью черный круг, (Hex RGB = # 000000), нашел точную Matc, в то время как более легкие круги, дальше подальше от цели. Я кругю победившие члены зеленым, когда они ударили его.

Обратите внимание, как кохорт отвечает на более длинные строки персонажей, сколько времени требуется, чтобы добраться до решения. Также выполните ровно одинаковую тест дважды и посмотрите, как различные начать конфигурации изменяют количество и размещение поколений, необходимых для достижения цели, а также там, где являются выигрышные члены. Есть ли вы нашли, что никогда не станет ближе?

Эволюционные стратегии

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

  • Изменить дистанционную функцию/метрику
  • Количество пригодных членов (я выбрал 33%, но это может варьироваться)
  • Увеличение количества перекрестных точек
  • Увеличьте число в когорте
  • Примените истирание/смертность
  • Неограничивать рост населения
  • Запускать большие популяции параллельно
  • Randomeis, возникает ли мутация или нет ….

Играйте с любым или всеми из них. Было бы интересно посмотреть, с чем вы придумали. Если у вас есть какие-либо вопросы, вы знаете, где я!

Как это? Следуйте по Twitter @axelisys или если вы не возражаете в хорошую Ранту, вы можете найти меня @etharuk