Эволюционные алгоритмы Эволюционные алгоритмы — направление в искусственном интеллекте (раздел эволюционного моделирования), которое использует и моделирует биологическую эволюцию. Различают различные алгоритмы: генетические алгоритмы, эволюционное программирование, эволюционные стратегии, системы классификаторов, генетическое программирование. Все они моделируют базовые положения в теории биологической эволюции — процессы отбора, мутации и воспроизводства. Генетические алгоритмы Генетический алгоритм — эвристический алгоритм поиска, используемый для решения задач оптимизации и моделирования посредством случайного подбора, комбинирования и вариации искомых параметров с использованием механизмов, напоминающих биологическую эволюцию. Является разновидностью эволюционных вычислений. Отличительной особенностью генетического алгоритма является акцент на использование оператора «скрещивания», который производит операцию рекомбинации решений-кандидатов, роль которой аналогична роли скрещивания в живой природе. Генетическое программирование Генетическое программирование — создание или изменение программ с помощью генетических алгоритмов. С помощью этой методологии «выводятся» или «выращиваются» программы все лучше и лучше (в соответствии с определенной функцией приспособленности), решающие требуемые задачи. Выбор способа кодирования программы в генетическом алгоритме — один из основных вопросов генетического программирования. Программа должна быть закодирована в таком виде, чтобы легко было автоматически вносить случайные изменения (оператор мутации) и объединять два алгоритма в один (оператор скрещивания). Генетическое программирование Способы кодирования можно разделить на два класса: 1. Прямое кодирование — генетический алгоритм работает с программой в явном виде. 2. Косвенное кодирование — генетический алгоритм работает не с самим кодом программы, а с правилами его построения. То есть генетический алгоритм работает с программой, которая генерирует другую программу, нужную нам. Генетические алгоритмы Генетические алгоритмы - разновидность эвристических алгоритмов, которая обеспечивает приемлемое решение задачи в большинстве практически значимых случаев, но при этом правильность решения математически не доказана. Генетические алгоритмы применяют чаще всего для задач, аналитическое решение которых весьма затруднительно или невозможно. Генетические алгоритмы Классическим примером задач такого класса является т.наз. «Задача коммивояжера», которая является одной из самых известных задач комбинаторной оптимизации и заключается в отыскании самого короткого маршрута, проходящего через указанные города хотя бы по одному разу с последующим возвратом в исходный город. Но ничто не мешает использовать генетические алгоритмы и для задач, поддающихся формализации. Генетические алгоритмы В основе генетических алгоритмов лежат методы, открытые при изучении эволюции и происхождения видов. Общеизвестно, что в процессе эволюции выживают наиболее приспособленные особи. Это приводит к тому, что приспособленность популяции в целом возрастает, позволяя ей лучше выживать в изменяющихся условиях. Генетические алгоритмы Впервые подобный алгоритм был предложен в 1975 году Джоном Холландом (John Holland) в Мичиганском университете. Он получил название «Репродуктивный план Холланда» и лег в основу практически всех вариантов генетических алгоритмов. Представление объектов в ГА Из биологии известно, что любой организм может быть представлен своим фенотипом (совокупность значений признаков, определяющих объект), который фактически определяет, чем является объект в реальном мире, и генотипом (совокупность значений генов, соответствующих определяющим объект признакам), который содержит всю информацию об объекте на уровне набора хромосом. Соответственно, каждый ген (при использовании ГА обычно представляется двоичным числом), то есть элемент информации генотипа, имеет свое отражение в фенотипе. Представление объектов в ГА Таким образом, для решения задач нам необходимо представить каждый признак объекта в форме, подходящей для использования в генетическом алгоритме. Все дальнейшее функционирование механизмов генетического алгоритма производится на уровне генотипа, позволяя обойтись без информации о внутренней структуре объекта, что и обуславливает широкое применение ГА в самых разных задачах. Представление объектов в ГА Как уже сказано, в наиболее часто встречающихся разновидностях генетических алгоритмов для представления генотипа объекта применяются битовые (двоичные) строки. При этом каждому атрибуту (признаку) объекта в фенотипе соответствует один ген в генотипе объекта. Ген представляет собой битовую строку, чаще всего фиксированной длины, которая представляет собой значение этого признака. Представление объектов в ГА Для кодирования признаков объекта можно использовать самый простой вариант – битовое значение этого признака. Тогда возможно использовать ген определенной длины, достаточной для представления всех возможных значений такого признака. Но у такого способа кодирования существует ряд недостатков. Основной недостаток состоит в том, что соседние числа отличаются в значениях нескольких битов, так например числа 7 (0111) и 8 (1000) в двоичном представлении различаются в 4-х позициях, что затрудняет функционирование генетического алгоритма и увеличивает время, необходимое для его сходимости. Представление объектов в ГА Для того, чтобы избежать эту проблему, используют способ кодирования, при котором соседние числа отличаются меньшим количеством позиций (в идеале - значением одного бита). Таким кодом является код Грея, который целесообразно использовать в реализации генетического алгоритма. Коды Грея Чтение записи происходит слева направо. Первый символ переносится как есть. Далее символ остаётся таким же, если перед ним стоит 0, и меняет своё значение на противоположное, если перед ним стоит 1. 0 – 0000 1 – 0001 2 – 0011 3 – 0010 4 – 0110 5 – 0111 6 – 0101 7 – 0100 8 – 1100 9 – 1101 10 – 1111 11 – 1110 12 – 1010 13 – 1011 14 – 1001 15 – 1000 Представление объектов в ГА Таким образом, при кодировании признака, представляемого целым числом, это число разбивается на тетрады, и каждая тетрада преобразуется по коду Грея. Для представления чисел с плавающей точкой обычно применяют следующий метод: 1. Разбивают весь интервал допустимых значений на участки с требуемой точностью. 2. Принимают значение гена как целочисленное число, определяющее номер интервала (используя код Грея). Представление объектов в ГА 3. В качестве значения параметра принимают число, являющиеся серединой этого интервала. Пусть значение признака принадлежит интервалу [0, 1]. При кодировании будем использовать разбиение участка на 256 интервалов, значит для кодирования номеру требуется 8 бит. Представление объектов в ГА Допустим значение гена 00100101bG (заглавная буква G показывает, что используется кодирование по коду Грея). Используя код Грея, найдем соответствующий ему номер интервала: 25hG = 36h = 54d. Теперь посмотрим, какой интервал ему соответствует… После простых расчетов получаем интервал [0,20703125, 0,2109375]. Значит значение нашего параметра будет (0,20703125 + 0,2109375) / 2=0,208984375. Представление объектов в ГА При кодировании нечисловых данных необходимо предварительно преобразовать их в числа. Таким образом, чтобы определить фенотип объекта необходимо знать значения генов, соответствующим признакам объекта, то есть генотип объекта. При этом совокупность генов, описывающих генотип объекта, представляет собой хромосому. Представление объектов в ГА В некоторых реализациях ГА хромосому также называют особью. Таким образом, в реализации генетического алгоритма хромосома представляет собой битовую строку фиксированной длины. При этом каждому участку строки соответствует ген. Длина генов внутри хромосомы может быть одинаковой или различной. Чаще всего применяют гены одинаковой длины. Представление объектов в ГА Рассмотрим пример хромосомы и интерпретации ее значения. Пусть у объекта имеется 5 признаков, каждый закодирован геном длиной в 4 бита. Тогда длина хромосомы будет 5 * 4 = 20 бит. 0010 1010 1001 0100 1101 Можно определить значения признаков: Признак 1 – 3. Признак 2 – 12. Признак 3 – 14. Признак 4 – 7. Признак 5 – 9. Основные генетические операторы В теории эволюции важную роль играет то, каким образом признаки родителей передаются потомкам. В генетических алгоритмах за передачу признаков родителей потомкам отвечает оператор, который называется «скрещивание» (его также называют «кроссовер» (crossover) или в некоторых источниках «кроссинговер»). Этот оператор и определяет передачу признаков родителей потомкам. Основные генетические операторы Кроссовер действует следующим образом: 1. Из популяции выбираются две особи, которые будут родителями. 2. Определяется (обычно случайным образом) точка разрыва хромосом. 3. Потомок определяется как конкатенация части первого и второго родителя. Основные генетические операторы Пусть хромосома родителя 1 0000000000, родителя 2 1111111111. Пусть разрыв происходит после 3-го бита хромосомы слева, тогда получаем: Результирующая хромосома 1 000 1111111, результирующая хромосома 2 111 0000000. Основные генетические операторы Затем с вероятностью 0,5 определяется одна из результирующих хромосом в качестве потомка. Другой генетический оператор предназначен для того, чтобы поддерживать разнообразие особей в популяции. Он называется оператором мутации. При его использовании каждый бит в хромосоме с определенной вероятностью инвертируется. Основные генетические операторы Также существует оператор инверсии, который заключается в том, что хромосома делится на две части, и затем они меняются местами: 0001111111 -> 1111111000 В принципе для функционирования генетического алгоритма достаточно описанных операторов, но на практике применяют еще и некоторые дополнительные операторы или модификации описанных выше. Основные генетические операторы Например, кроссовер может быть не одноточечный (как было описано выше), а многоточечный, когда формируется несколько точек разрыва (чаще всего две). Кроме того, в некоторых реализациях алгоритма оператор мутации представляет собой инверсию только одного случайно выбранного бита хромосомы. Функционирование ГА Теперь, зная как интерпретировать значения генов, перейдем к описанию функционирования генетического алгоритма. Рассмотрим схему функционирования генетического алгоритма в его классическом варианте. 1. Инициировать начальный момент времени t = 0. Случайным образом сформировать начальную популяцию, состоящую из k особей: B0 = (A1,A2,…,Ak) Функционирование ГА 2. Вычислить приспособленность для каждой особи FAi = fit(Ai), где i=1…k и для популяции в целом Ft = fit(Bt), также иногда называемую термином фитнес (fitness). Значение этой функции определяет насколько хорошо подходит особь, описанная данной хромосомой, для решения задачи. Функционирование ГА 3. Выбрать особь Ac из популяции: Ac = get (Bt) 4. С определенной вероятностью (вероятностью кроссовера Pc) выбрать вторую особь из популяции: Аc1 = get (Bt) и произвести оператор кроссовера: Ac = crossing (Ac, Ac1) Функционирование ГА 5. С определенной вероятностью (вероятностью мутации Pm) произвести оператор мутации: Ac = mutation (Ac) 6. С определенной вероятностью (вероятностью инверсии Pi) произвести оператор инверсии: Ac = inversion (Ac) Функционирование ГА 7. Поместить полученную хромосому в новую популяцию: insert (Bt+1,Ac) 8. Выполнить операции, начиная с шага 3, k раз. 9. Увеличить номер текущей эпохи t = t + 1. 10. Если выполнилось условие останова, то завершить работу, иначе переход на шаг 2. Функционирование ГА Наибольшую роль в успешном функционировании этого алгоритма играет этап отбора родительских хромосом на шагах 3 и 4. При этом возможны различные варианты. Наиболее часто используется метод отбора, называемый рулеткой. При использовании такого метода вероятность выбора хромосомы определяется ее приспособленностью: Pget(Ai) ~ fit(Ai) / fit(Bt) Использование этого метода приводит к тому, что вероятность передачи признаков более приспособленными особями потомкам возрастает. Функционирование ГА Другой часто используемый метод – турнирный отбор. Он заключается в том, что случайно выбирается несколько особей из популяции (обычно 2) и победителем выбирается особь с наибольшей приспособленностью. Кроме того, иногда применяется так называемая стратегия элитизма, которая заключается в том, что особи с наибольшей приспособленностью гарантировано переходят в новую популяцию. Использование элитизма обычно позволяет ускорить сходимость генетического алгоритма. Недостаток использования стратегии элитизма в том, что повышается вероятность попадания алгоритма в локальный минимум. Функционирование ГА Другой важный момент – определение критериев останова. Обычно в качестве них применяются или ограничение на максимальное число эпох функционирования алгоритма, или определение его сходимости, обычно путем сравнивания приспособленности популяции на нескольких эпохах и остановки при стабилизации этого параметра.