Представьте, что
вы собрались в поход и думаете, чтобы взять с собой в рюкзаке из некоторого
набора предметов? Причем, у каждого предмета есть свой вес и своя ценность.
Желательно подобрать предметы так, чтобы они умещались в рюкзак и при этом
имели бы максимальную суммарную ценность.
Или, такая
задачка. Необходимо составить график дежурств медперсонала, чтобы каждый из
врачей дежурил два дня в неделю, но не более пяти раз в месяц и чтобы интервал
между соседними дежурствами был, как минимум два дня. Кроме того, здесь могут
быть отдельные пожелания врачей о времени проведения дежурств.
Наконец, бывают
и еще более сложные задачи. Например, нужно создать алгоритм, который бы
управлял тележкой так, чтобы подвижный шест не падал как можно дольше:
Что объединяет
все эти задачи? Они имеют множество критериев и трудно реализуемые чисто
математически. Для решения таких задач часто применяют эвристические или
эволюционные алгоритмы, ярким представителем которых является генетический
алгоритм.
Идея, положенная
в основу этого алгоритма, - имитация эволюционного процесса. Но как эволюция
может помочь решать подобные задачи? Все дело в правильной формализации задачи.
Чтобы все это лучше понять, давайте вначале рассмотрим простой, классический
пример, известный под названием «задача OneMax».
Задача OneMax
В этой задаче у
нас имеется список определенной длины, состоящий из нулей и единиц:
Наша цель – найти
решение, которое бы давало максимальную сумму цифр этого списка:
Здесь N – длина списка.
Очевидно, это список, состоящий из всех единиц:
Конечно, мы
легко можем решить эту задачу без применения ГА, но на ее примере хорошо
показать принцип его работы.
Популяция
Итак, все
начинается с формирования популяции – множества особей одного вида. Что из себя
представляют особи в задаче OneMax? Это обычные списки из нулей и
единиц:
И это типовое
представление особей. Каждую задачу для генетического алгоритма стараются
формализовать так, чтобы особи были представлены списком целых или вещественных
чисел. В этом случае мы получаем естественную биологическую интерпретацию этих
списков как хромосом, состоящих из генов (отдельных элементов):
Следующий важный
вопрос, как сформировать начальную популяцию индивидуумов? То есть, как
подобрать начальные значения генов? Часто для этого используют датчик случайных
чисел и просто записывают то число, которое получилось на выходе этого датчика.
В результате, получим множество самых разных особей, что очень хорошо для
дальнейшего процесса эволюционной адаптации всей популяции.
Функция приспособленности (целевая функция)
Как мы знаем, в
процессе эволюционного отбора в популяции, как правило, остаются наиболее
приспособленные особи. И нам нужно уметь определять эту степень
приспособленности, чтобы имитировать процесс эволюции. Но что определяет
приспособленность в задачах генетического алгоритма? В природе – это фактор
выживаемости, а что у нас? У нас – это получение лучшего решения. То есть, те
особи, которые представляют лучшее решение поставленной задачи, считаются более
приспособленными. А чтобы оценивать качество решения для каждого конкретного
индивидуума, необходимо задать функцию приспособленности (или, как еще говорят,
- целевую функцию):
Например, в
задаче OneMax, она суммирует
все числа в генах и имеет следующий вид:
Чем больше
значение этой суммы, тем больше единиц в хромосоме и тем лучшее решение
представляет индивид.
Конечно, для
разных задач используется своя функция приспособленности, и ее конкретный
математический вид определяется разработчиком ГА, исходя из поставленной задачи
оптимизации.
Имитация эволюционного процесса
После того, как
у нас сформирована популяция и определена функция, дающая оценку
приспособленности каждой конкретной особи, мы готовы к имитации эволюционного
процесса. То есть, будем воспроизводить изменение популяции от поколения к
поколению в надежде получать все более и более приспособленных особей, а значит
идти по пути улучшения решения поставленной задачи.
Согласно Чарльзу
Дарвину движущая сила эволюции определяется следующими тремя процессами:
- отбор наиболее приспособленных
особей;
- скрещивание
родителей для получения новых индивидуумов;
- мутация –
случайное изменение отдельных генов.
В итоге, схему
ГА можно представить в следующем виде:
Отбор
Отбор – это
первое действие, выполняемое в ГА при имитации эволюционного процесса. Цель
этого оператора – с одной стороны оставить в популяции наиболее приспособленных
особей, но с другой – сохранить популяционное разнообразие. Например, если
оставлять только наиболее приспособленных, то можно потерять важные фрагменты
хромосом у менее приспособленных особей. Возможно, оптимальное решение
достигается скрещиванием одного из наиболее приспособленного родителя с другим
– наименее приспособленным. Если же на этапе отбора второй родитель окажется
утерянным, то оптимальное решение, возможно, будет достигаться за большее число
шагов работы ГА. А может быть даже потеряется навсегда. Чтобы уменьшить
вероятность такого исхода в следующем поколении следует оставлять не только
самых лучших, но и давать возможность менее конкурентным оставаться в
популяции.
Вообще
существует множество способов реализации механизма отбора. В рамках задачи OneMax мы
воспользуемся идеей турнирного отбора, который довольно часто используется на
практике.
Вначале во всей
популяции случайным образом отбирается n индивидуумов (допустим
три), а затем, среди них выбирается наиболее приспособленный:
Победитель
проходит отбор и будет использован как родитель в операции скрещивания. Соответственно,
этот турнирный отбор повторяется с исходной популяцией до тех пор, пока не
будет сформирован новый список особей того же числа, что и исходная популяция.
Позже, мы с вами
подробнее рассмотрим и другие способы отбора индивидуумов из популяции, а пока
перейдем к следующему этапу – скрещивание.
Скрещивание
Этап скрещивания
в научной литературе называют кроссинговером или кроссовером (от англ. crossing – скрещивание).
На этом этапе происходит обмен данными между частями хромосом родителей. Обычно
в популяции перебирают пары родителей, и фрагменты их хромосом перемешивают,
получая новый набор генов в хромосомах их потомков:
В данном случае
представлена схема одноточечного скрещивания, когда случайным образом
выбирается точка разреза хромосом у родителей, а затем, осуществляется их
обмен. Так появляется два потомка.
Эта операция
выполняется с некоторой (высокой) вероятностью. При этом родители, давшие
потомство, как правило, не переходят в следующее поколение, а не давшие – сохраняются.
В результате, размер популяции после операции скрещивания не меняется.
Существуют и
другие виды скрещивания, о них мы также подробнее будем говорить на следующих
занятиях.
Мутация
Последний
оператор имитации процесса эволюции – это мутация. Она применяется к полученной
популяции и случайным образом с малой вероятностью меняет значения отдельных
генов.
В самом простом
варианте двоичного кодирования генов, мутация выполняет инвертирование бита:
Этот механизм
позволяет расширять область поиска решения задачи и сохранять разнообразие
популяции. Возможно, благодаря полезной мутации, особь приобретет новое
свойство и станет более конкурентно-способной в своей популяции. В дальнейшем у
нее есть все шансы дать потомство и закрепить полезный признак. Так, через
мутацию, происходит улучшение решения. Конечно, может произойти и обратный
эффект – ухудшение приспособленности индивидуума. Но тогда, он не сможет
конкурировать с более приспособленными особями и вскоре будет отсеян в процессе
отбора.
Мутации в
генетических алгоритмах также имеют множество реализаций и мы о них позже еще
будем говорить. А на следующем занятии применим текущие знания для реализации
задачи OneMax с
использованием языка Python и воочию увидим, как работает
ГА.