
- •Лабораторная работа № 2. Изучение основных операторов кроссинговера
- •4. Содержание отчета по лабораторной работе
- •Контрольные вопросы
- •Лабораторная работа № 3. Изучение основных операторов мутации (4 часа)
- •1. Цель работы
- •2. Порядок выполнения лабораторной работы
- •2.1. Изучить теоретическое введение.
- •3. Задания к лабораторной работе
- •4. Содержание отчета по лабораторной работе
- •4.1. Название и цель работы.
- •Контрольные вопросы
- •Лабораторная работа № 4. Изучение операторов селекции и отбора (2 часа)
- •1. Цель работы
- •2. Порядок выполнения лабораторной работы
- •2.1. Изучить теоретическое введение.
- •3. Задания к лабораторной работе
- •4. Содержание отчета по лабораторной работе
- •4.1. Название и цель работы.
- •Контрольные вопросы
- •Лабораторная работа № 5. Построение простого генетического алгоритма (4 часа)
- •1. Цель работы
- •2. Порядок выполнения лабораторной работы
- •2.1. Изучить теоретическое введение.
- •3. Задания к лабораторной работе
- •4. Содержание отчета по лабораторной работе
- •4.1. Название и цель работы.
- •4.4. Примеры решений. Контрольные вопросы
- •2. Стратегии создания начальной популяции
- •3. Механизм передачи наследственной информации
- •4. Оператор кроссинговера
- •2 → 1(1); → 4(4); → 2(Цикл);
- •5. Оператор мутации
- •6. Операторы селекции и отбора
- •7. Структура генетического алгоритма
4. Оператор кроссинговера
Оператор кроссинговера (ОК) используется для получения новых решений на базе уже имеющихся. Известно достаточно много различных типов ОК, но наиболее часто используются следующие:
Стандартный оператор кроссинговера. Может применяться для бинарных, векторных и гомологичных числовых хромосом. Существуют его одноточечная, двухточечная и многоточечная модификации.
Для проведения скрещивания по одной точке случайно выбирается точка внутри хромосомы. Затем часть первого родителя, расположенная левее точки скрещивания, и часть второго родителя, расположенная правее точки скрещивания, копируются в первого потомка. Второй потомок формируется из правой части первого родителя и левой части второго родителя.
Таким образом, путем перекомпоновки двух старых (родительских) решений генерируются два качественно новых решения (потомство).
Родительские хромосомы перед операцией кроссинговера будут выглядеть, как показано на рис. 2, причем точка скрещивания выделена двойной линией. После выполнения одноточечного кроссинговера получается новый вариант распределения ребер по полуплоскостям, закодированный в хромосомах потомков.
ОДНОТОЧЕЧНЫЙ КРОССИНГОВЕР
0 |
0 |
0 |
0 |
0 |
Родитель 1 |
|
|
|
|
|
|
1 |
1 |
1 |
1 |
1 |
Родитель 2 |
|
|
|
|
|
|
0 |
0 |
0 |
1 |
1 |
Потомок 1 |
|
|
|
|
|
|
1 |
1 |
1 |
0 |
0 |
Потомок 2 |
Рис. 2
При двухточечном кроссинговере в хромосоме случайно выбираются уже две точки скрещивания. Левую точку будем считать первой, а правую - второй. Первый потомок получается из частей первого потомка, расположенных левее первой точки скрещивания и правее второй точки, и части второго потомка, расположенной между первой и второй точкой скрещивания. Второй потомок получается из левой и правой частей второго потомка и центральной части первого потомка. Пример работы этого оператора для аналогичной задачи показан на рис. 3.
ДВУХТОЧЕЧНЫЙ КРОССИНГОВЕР
0 |
0 |
0 |
1 |
1 |
Родитель 1 |
|
|
|
|
|
|
1 |
1 |
1 |
0 |
0 |
Родитель 2 |
|
|
|
|
|
|
0 |
0 |
1 |
1 |
1 |
Потомок 1 |
|
|
|
|
|
|
1 |
1 |
0 |
0 |
0 |
Потомок 2 |
Рис. 3
Помимо одноточечного ОК в ГА также широко применяются многоточечные ОК. Пример трехточечного ОК показан на рис. 4.
ТРЕХТОЧЕЧНЫЙ КРОССИНГОВЕР
0 |
0 |
0 |
1 |
1 |
1 |
Родитель 1 |
|
|
|
|
|
|
|
1 |
1 |
1 |
0 |
0 |
0 |
Родитель 2 |
|
|
|
|
|
|
|
0 |
1 |
1 |
1 |
1 |
0 |
Потомок 1 |
|
|
|
|
|
|
|
1 |
0 |
0 |
0 |
0 |
1 |
Потомок 2 |
Рис. 4
Универсальный оператор кроссинговера. Может применяться для бинарных, гомологичных числовых и векторных хромосом.
Этот ОК позволяет при скрещивании обмениваться не сплошными участками хромосом, а генами, расположенными в различных местах. Для этого случайно или другим способом генерируется маска, по которой производится скрещивание. В маске для каждого гена задается число 0 или 1. Ноль подразумевает, что первому потомку достанется ген первого родителя, а второму - ген второго родителя. Для значения 1 в маске применяется обратный порядок обмена. Такой ОК удобно применять в том случае, когда уже получены индивиды с хорошими наследственными признаками и их необходимо закрепить в текущей популяции.
Пример выполнения универсального ОК показан на рис. 5.
УНИВЕРСАЛЬНЫЙ КРОССИНГОВЕР
0 |
0 |
1 |
1 |
1 |
Родитель 1 |
|
|
|
|
|
|
1 |
1 |
0 |
0 |
0 |
Родитель 2 |
|
|
|
|
|
|
0 |
0 |
0 |
0 |
1 |
Маска |
|
|
|
|
|
|
0 |
0 |
1 |
1 |
0 |
Потомок 1 |
|
|
|
|
|
|
1 |
1 |
0 |
0 |
1 |
Потомок 2 |
Рис. 5
В некоторых задачах любой символ кода хромосомы (стринга) является уникальным (негомологичные хромосомы), а значит при выполнении ОК необходимо избежать выпадения отдельных элементов (кодов) строки решения
Классическая схема кроссинговера, позаимствованная у естественного аналога, не может быть применена в данной категории задач, поскольку в стринге после ее применения могут появиться повторяющиеся коды.
В этих случаях применяют комплексные ОК.
Упорядочивающий оператор кроссинговера (Order crossover, OX) был предложен Д. Дэвисом в 1985 году для негомологичных числовых хромосом. Скрещивание может производиться по одной или по двум точкам. Точки скрещивания выбираются случайно.
При одноточечном кроссинговере в хромосому первого потомка копируется хромосома первого родителя, а затем гены потомка, расположенные правее точки скрещивания переупорядочиваются в последовательность, соответствующую второму родителю. При этом второй родитель просматривается от начала до конца, слева направо, и элементы, которых не хватает в потомке, добавляются, начиная от точки кроссинговера, по порядку. Для создания второго потомка применяется обратный порядок действий. Пример работы упорядочивающего кроссинговера показан на рис. 6. Причем в данном случае каждая хромосома представляет собой упорядоченную последовательность чисел и применение стандартных операторов кроссинговера неминуемо привело бы к образованию нелегальных решений.
УПОРЯДОЧИВАЮЩИЙ ОДНОТОЧЕЧНЫЙ КРОССИНГОВЕР
1 |
2 |
3 |
4 |
5 |
Родитель 1 |
|
|
|
|
|
|
5 |
4 |
3 |
2 |
1 |
Родитель 2 |
|
|
|
|
|
|
1 |
2 |
3 |
5 |
4 |
Потомок 1 |
|
|
|
|
|
|
5 |
4 |
3 |
1 |
2 |
Потомок 2 |
Рис. 6
При двухточечном упорядочивающем кроссинговере изменяется часть хромосомы, которая находится между точками скрещивания (рис. 7).
УПОРЯДОЧИВАЮЩИЙ ДВУХТОЧЕЧНЫЙ КРОССИНГОВЕР
1 |
2 |
3 |
4 |
5 |
6 |
Родитель 1 |
|
|
|
|
|
|
|
2 |
4 |
5 |
1 |
6 |
3 |
Родитель 2 |
|
|
|
|
|
|
|
1 |
2 |
4 |
3 |
5 |
6 |
Потомок 1 |
|
|
|
|
|
|
|
2 |
4 |
1 |
5 |
6 |
3 |
Потомок 2 |
Рис. 7
Частично соответствующий оператор кроссинговера (Partially matched crossover - PMX) был разработан Д. Гольдбергом и Р. Линглом в 1985 году для негомологичных числовых хромосом.
Скрещивание может производиться по одной или по двум точкам. Точки скрещивания выбираются случайно.
При одноточечном ОК в хромосому первого потомка копируется хромосома первого родителя. Затем просматривают гены потомка, расположенные правее точки скрещивания, находят элемент, занимающий то же место во втором родителе, и обменивают местами эти элементы в потомке. Второй потомок формируется аналогичным образом. Порядок выполнения частично соответствующего кроссинговера для негомологичных числовых хромосом показан на рис. 8.
ЧАСТИЧНО СООТВЕТСТВУЮЩИЙ ОДНОТОЧЕЧНЫЙ КРОССИНГОВЕР
1 |
2 |
3 |
4 |
5 |
Родитель 1 |
|
|
|
|
|
|
4 |
3 |
5 |
1 |
2 |
Родитель 2 |
|
|
|
|
|
|
4 |
5 |
3 |
1 |
2 |
Потомок 1 |
|
|
|
|
|
|
1 |
3 |
2 |
4 |
5 |
Потомок 2 |
Рис. 8
В двухточечном ОК обмен производится между центральными частями хромосом (рис. 9).
ЧАСТИЧНО СООТВЕТСТВУЮЩИЙ ДВУХТОЧЕЧНЫЙ КРОССИНГОВЕР
1 |
2 |
3 |
4 |
5 |
Родитель 1 |
|
|
|
|
|
|
4 |
3 |
5 |
1 |
2 |
Родитель 2 |
|
|
|
|
|
|
1 |
3 |
5 |
4 |
2 |
Потомок 1 |
|
|
|
|
|
|
4 |
2 |
3 |
1 |
5 |
Потомок 2 |
Рис. 9
Циклический оператор кроссинговера (Cycle crossover, CX) разработали Оливер, Смит и Холланд в 1985 году. Оператор выполняет перестановки в соответствии с циклами, которые отображают установленные соответствия между элементами (генами) первого и второго родителей. Пример работы циклического ОК показан на рис. 10.
ЦИКЛИЧЕСКИЙ КРОССИНГОВЕР
1 |
2 |
3 |
4 |
5 |
6 |
Родитель 1 |
(1-1) |
(1-2) |
(2-1) |
(1-3) |
(2-3) |
(2-2) |
|
2 |
4 |
5 |
1 |
6 |
3 |
Родитель 2 |
|
|
|
|
|
|
|
1 |
2 |
5 |
4 |
6 |
5 |
Потомок 1 |
Рис. 10
При выполнении оператора потомок заполняется, начиная с первой позиции, в которую копируется элемент из первого разряда первого родителя. Элементу 1 в первом родителе соответствует элемент 2 во втором. Таким образом, получаем первую подстановку в первом цикле (1-1). Элементу 2 родителя 1 соответствует элемент 4 родителя 2. Получаем вторую подстановку цикла (1-2). И, наконец, элементу 4 в родителе 1 соответствует элемент 1 в родителе 2. Цепочка замкнулась, следовательно, мы получили первый цикл (1 2; 2 4; 4 1).
Сформируем теперь второй цикл. Элемент 3 в родителе 1 соответствует элементу 5 в родителе 2, т.е. получена первая подстановка (2-1). Продолжая аналогично, получим второй цикл (5 3; 3 6; 6 5).
Надо заметить, что в отличие от стандартных операторов кроссинговера, схема работы специальных операторов не является жестко регламентированной и может быть безболезненно модифицирована в зависимости от условий и ограничений решаемой задачи. Поэтому приведенные выше схемы выполнения специальных операторов можно рассматривать как один, из множества вариантов реализации некоторой идеи.
Жадный оператор кроссинговера был предложен в 1988 году Грифенстеттом в соавторстве с другими учеными для решения задачи коммивояжера. Это эвристический оператор кроссинговера, ориентированный на использование знаний об объекте.
Идея построения “жадного” алгоритма заключается в следующем. На каждом шаге последовательно выбираются лучшие элементы из множества имеющихся, т.е. решения, улучшающие целевую функцию, причем таким образом, чтобы не нарушать действующих ограничений. Генерация потомков происходит за счет выбора лучших участков родительских хромосом и их последующего сопряжения.
В то же время схема работы “жадного” ОК может изменяться в зависимости от характера решаемых задач.
Например, для задачи минимизации пересечений схема выполнения “жадного” ОК может быть следующей. В каждой родительской хромосоме, кодирующей взаиморасположение ребер на полуплоскостях, выбирают по одному ребру, имеющему наибольшее число пересечений в данной полуплоскости и производят обмен. После этого среди оставшихся ребер снова выбираются два ребра, имеющие наибольшее число пересечений, и меняются местами и так далее, до тех пор, пока не будут просмотрены все ребра.
Покажем работу “жадного” ОК на примере решения задачи коммивояжера. Пусть задан граф G и его матрица смежности R.
|
|
1 |
2 |
3 |
4 |
|
1 |
0 |
2 |
3 |
4 |
R = |
2 |
1 |
0 |
2 |
3 |
|
3 |
1 |
2 |
0 |
5 |
|
4 |
3 |
7 |
6 |
0 |
Для данной задачи алгоритм работы “жадного” ОК будет следующим:
1. Случайным образом генерируются два варианта пути коммивояжера (родительские хромосомы). Например, 1-й вариант 4 - 2 - 3 - 1; 2-й вариант 1 - 4 - 3 - 2. Подсчитываем целевую функцию полученных решений: f(1) = 7 + 2 + 1 + 4 = 14; f(1) = 4 + 6 + 2 + 1 = 13.
2. Случайным образом выбирают начальную точку для генерации нового пути (хромосомы потомка). Например, пункт 4.
3. Сравниваем длину путей, выходящих из вершины 4 в родительских хромосомах, и выбираем более короткий. В нашем примере из пункта 4 имеются пути в пункты 2 и 3:
1-й потомок 4 → 2(7);
4 → 3 (6).
4. Продолжаем строить новый вариант пути, выбирая наиболее короткие пути из двух возможных:
1-й потомок 4 → 2(7);
4 → 3 (6); → 1(1); → 4(цикл);
→ 2(2).
5. Если выбранное кратчайшее ребро приводит к преждевременному замыканию цикла, то путь увеличивается за счет включения пункта, выбранного случайным образом из числа еще не пройденных:
1-й потомок 4 → 2(7);
4 → 3 (6); → 1(1); → 4(цикл); → 2(2)
→ 2(2).
6. Процесс продолжается до тех пор, пока не построен полный путь коммивояжера. В нашем примере такой путь уже построен: 1-й потомок 4 → 3 → 1 → 2 → 4; f(1п) = 6 + 1 + 2 + 3 = 12.
Аналогичным образом получаем второго потомка:
Выбираем в качестве начальной точки пункт 2.
2-й потомок 2 → 3(2);