Ага, это мой первый пост на Medium!

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

Вкратце, идея GA довольно проста: мы пытаемся «вырастить» решение, используя механизм естественного отбора, подобный тому, который используется природой для создания лучших живых существ. Звучит просто? На самом деле это просто, особенно в Swift.

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





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

Код не такой длинный, но стоит пояснить, чтобы он был понятен, начиная с самого начала:

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

DNA_LENGTH, вероятно, не требует пояснений, это длина последовательности, которую мы ищем.

TOURNAMENT_SIZE, в этой реализации мы используем метод турнира для выбора «родителей». В ярлыке мы случайным образом выбираем группу людей и выбираем одного из них, который является наиболее приспособленным, этот будет родительским для следующего поколения.

MUTATION_CHANCE, значение от 0 до 1, которое определяет вероятность мутации конкретного гена. 0,1 (что означает 10%) используется по умолчанию во многих реализациях.

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

Индивидуальный, это суть этой реализации. Каждый отдельный объект представляет собой потенциальное решение нашей проблемы, а также определяет каждую операцию, необходимую в GA.

randomize (), позволяет создать человека со случайным выбором генов из пула AVAILABLE_GENES.

calculatefitness (), этот метод возвращает целочисленное значение, которое интерпретируется как расстояние между текущим решением и тем, которое мы ищем, чем ближе к нулю, тем лучше. Ноль означает, что решение является оптимальным.

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

mutate (), основанный на MUTATION_CHANCE, случайным образом изменяет значение определенных генов в индивидуальном

Похоже, что это все, все, что вам нужно знать, чтобы начать играть с генетическими алгоритмами в Swift, было объяснено выше (надеюсь), после нескольких тестов я заметил, что в конфигурации по умолчанию требуется ~ 80 поколений, чтобы найти решение.

Структуру Population и runGeneticAlgorithm () вообще не нужно изменять. Если будет правильно определена только отдельная структура, то она будет работать без проблем.

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