Uploaded by kvsimonova

Лабораторная работа. Генетический алгоритм

advertisement
Лабораторная работа №1
Тема: генетические алгоритмы (ГА).
Цель работы: научиться решать задачи оптимизации с помощью генетического алгоритма.
Задача. Комплектация автомобиля.
Имеется заготовка автомобиля и множество «улучшателей» - магнитола, радио,
освежитель воздуха, кожаный салон и т. д. (табл. 1). Каждая деталь имеет стоимость и
коэффициент, повышающий качество жизни водителя. Собрать самую лучшую машину из
запчастей, уложившись в определенный бюджет.
Таблица 1. Входные данные
Модификация комплектации
автомобиля
Стоимость (Ci)
Коэффициент
качества (Ki)
Климат-контроль
102500
0,09
Электро стеклоподъемники
12500
0,02
Электро регулировка сидений
11200
0,03
Подогрев сидений
11600
0,02
Кожаная обивка руля
15000
0,04
Круиз-контроль
100500
0,11
Бортовой компьютер
110500
0,15
Усилитель руля
94300
0,09
Навигация
55000
0,09
Люк
9000
0,02
CD-чейнджер
16000
0,05
Автоматическая коробка передач
160000
0,15
Антиблокировочная система
120000
0,14
Сумма на выполнение комплектации (S): 350000.
Решение.
Решение задачи оптимизации возможно с помощью различных методов. Осуществим
решение с помощью ГА. Самой лучшей машиной будет являться машина с минимальной
стоимостью, но с максимально предоставляемым комплектацией качеством и комфортностью.
Таким образом, функция приспособленности примет вид:
𝑓(𝑥) = ∑𝑛𝑖=0 𝐾𝑖 𝑥𝑖 → 𝑚𝑎𝑥∀𝑥 ∈ [0,1]
𝑓(𝑥) = 0,09𝑥1 + 0,02𝑥2 + 0,03𝑥3 + 0,02𝑥4 + 0,04𝑥5 + 0,11𝑥6 + 0,15𝑥7
+0,09𝑥8 + 0,09𝑥9 + 0,02𝑥10 + 0,05𝑥11 + 0,15𝑥12 + 0,14𝑥13 → 𝑚𝑎𝑥
Единственным ограничением функции приспособленности выступает сумма, требуемая
на выполнение комплектации, и представлена следующей функцией:
𝐹(𝑥) = ∑𝑛𝑖=0 𝐶𝑖 𝑥𝑖 ≤ 𝑆∀𝑥 ∈ [0,1]
𝐹(𝑥) = 102500𝑥1 + 12500𝑥2 + 11200𝑥3 + 11600𝑥4 + 15000𝑥5 + 100500𝑥6 + 110500𝑥7
+94300𝑥8 + 55000𝑥9 + 9000𝑥10 + 16000𝑥11 + 160000𝑥12 + 120000𝑥13 ≤ 350000
Алгоритм решения поставленной задачи с помощью ГА, блок-схема которого изображена
на рис. 1, состоит из следующих этапов. Листинг программы приведен в конце.
Рис. 1. Блок схема генетического алгоритма.
Инициализация начальной популяции. Процесс выполнения ГА начинается с создания
новой популяции (набора хромосом), состоящей из генов количеством, равному количеству
модификаций комплектации автомобиля (табл. 1). Каждая хромосома представлена в случайно
выбранном двоичном виде, причем, применение конкретной модификаций обозначается
цифрой 1, в противном случае — 0. Таким образом заполняется определенное количество
хромосом. Пример созданной начальной популяции приведен в табл. 2.
Оценка приспособленности. На данном этапе осуществляется расчет функции
приспособленности и функции ограничений для каждой хромосомы.
Селекция. Следующим шагом выполняется селекция. Предположим использовать отбор
методом рулетки. Особи располагаются на колесе рулетки так, что размер сектора каждой
особи пропорционален ее приспособленности. Требуемое количество особей для записи в
промежуточную популяцию выбирается несколько раз. В отобранные особи попадают те,
которые имеют большую приспособленность и удовлетворяют условиям ограничений.
Применение генетических операций. Особи промежуточной популяции случайным
образом разбиваются на пары и с некоторой вероятностью обмениваются генами, в результате
чего получаются два потомка, которые записываются в новое поколение. Для решения задачи
используем скрещивание, использующее разбросанное смешение генов хромосом. После
смешения генов, полученные потомки подвергаются мутации, необходимой для «выбивания»
популяции из локального экстремума и способствующий защите от преждевременной
сходимости. Достаточно выставить мутацию популяции, равную 5%.
Таблица 2. Заполненная начальная популяция.
Хромосома
№1
Хромосома
№2
Климат-контроль
1
1
0
Электро стеклоподъемники
0
0
1
Электро регулировка сидений
0
1
0
Подогрев сидений
0
0
0
Кожаная обивка руля
0
1
0
Круиз-контроль
1
1
1
Бортовой компьютер
0
0
Усилитель руля
1
0
1
Навигация
0
0
1
Люк
1
1
0
CD-чейнджер
1
0
0
Автоматическая коробка передач
1
1
1
Антиблокировочная система
0
0
1
Модификация
...
...
Хромосома n
1
Завершение выполнения ГА происходит после того, как пройдет определенное
количество итераций или в случае, если дальнейшее выполнение алгоритма не приводит к
изменению функции приспособленности популяций. Результат выполнения приведенного
выше алгоритма представлен ниже десятком итераций.
>> Initial population has formed...
>> Current population...
C#001 >> 1101111011111 FF >> 0.88 P >> no
C#002 >> 1000110101111 FF >> 0.69 P >> no
C#003 >> 1111101001011 FF >> 0.66 P >> no
C#004 >> 1101001111010 FF >> 0.63 P >> no
C#005 >> 1000100111011 FF >> 0.62 P >> no
C#006 >> 1001010100011 FF >> 0.6 P >> no
C#007 >> 1000001111010 FF >> 0.59 P >> no
C#008 >> 1111101110100 FF >> 0.58 P >> no
C#009 >> 1110001011010 FF >> 0.55 P >> no
C#010 >> 1110011000001 FF >> 0.54 P >> no
C#011 >> 1010001011001 FF >> 0.52 P >> no
C#012 >> 0010100101011 FF >> 0.47 P >> no
C#013 >> 0010111010100 FF >> 0.47 P >> yes
C#014 >> 1100000000111 FF >> 0.45 P >> no
C#015 >> 1001100101001 FF >> 0.4 P >> no
C#016 >> 0110100100001 FF >> 0.32 P >> yes
C#017 >> 0000100010001 FF >> 0.27 P >> yes
C#018 >> 0100100000101 FF >> 0.25 P >> yes
C#019 >> 0110010001000 FF >> 0.18 P >> yes
C#020 >> 0000010001000 FF >> 0.13 P >> yes
>> Selection complete...
>> Crossover finished...
>> Mutation executed...
>> Current population...
C#001 >> 1010101110001 FF >> 0.63 P >> no
C#002 >> 0010111000101 FF >> 0.52 P >> no
C#003 >> 0110110010101 FF >> 0.48 P >> yes
C#004 >> 0000110010101 FF >> 0.43 P >> yes
C#005 >> 0110111000100 FF >> 0.4 P >> yes
C#006 >> 0110110111000 FF >> 0.4 P >> yes
C#007 >> 0110110000101 FF >> 0.39 P >> yes
C#008 >> 1000010001010 FF >> 0.37 P >> no
C#009 >> 0110100100101 FF >> 0.37 P >> yes
C#010 >> 0010011000100 FF >> 0.34 P >> yes
C#011 >> 0000101010100 FF >> 0.33 P >> yes
C#012 >> 0010101010000 FF >> 0.31 P >> yes
C#013 >> 0100010001010 FF >> 0.3 P >> yes
C#014 >> 0110010011000 FF >> 0.27 P >> yes
C#015 >> 0110100110000 FF >> 0.27 P >> yes
C#016 >> 0100010000001 FF >> 0.27 P >> yes
C#017 >> 0000101000100 FF >> 0.24 P >> yes
C#018 >> 0110100000001 FF >> 0.23 P >> yes
C#019 >> 0100100000001 FF >> 0.2 P >> yes
C#020 >> 0100100001100 FF >> 0.13 P >> yes
>> Selection complete...
>> Crossover finished...
>> Mutation executed...
>> Current population...
C#001 >> 1110111000101 FF >> 0.63 P >> no
C#002 >> 0100011000110 FF >> 0.48 P >> no
C#003 >> 0100110010101 FF >> 0.45 P >> yes
C#004 >> 1100100000011 FF >> 0.44 P >> no
C#005 >> 0010111010000 FF >> 0.42 P >> yes
C#006 >> 0110100110001 FF >> 0.41 P >> yes
C#007 >> 0110111000100 FF >> 0.4 P >> yes
C#008 >> 0110100000011 FF >> 0.38 P >> yes
C#009 >> 0110110110000 FF >> 0.38 P >> yes
C#010 >> 0100100110001 FF >> 0.38 P >> yes
C#011 >> 0010110000101 FF >> 0.37 P >> yes
C#012 >> 0010110000101 FF >> 0.37 P >> yes
C#013 >> 0100010010001 FF >> 0.36 P >> yes
C#014 >> 0110110010100 FF >> 0.34 P >> yes
C#015 >> 0110010110000 FF >> 0.34 P >> yes
C#016 >> 0110010011100 FF >> 0.32 P >> yes
C#017 >> 0110010101100 FF >> 0.32 P >> yes
C#018 >> 0110000001101 FF >> 0.26 P >> yes
C#019 >> 0110100000001 FF >> 0.23 P >> yes
C#020 >> 0110110001000 FF >> 0.22 P >> yes
>> Selection complete...
>> Crossover finished...
>> Mutation executed...
>> Current population...
C#001 >> 0110101110001 FF >> 0.56 P >> no
C#002 >> 0110110110001 FF >> 0.52 P >> no
C#003 >> 0110100111101 FF >> 0.48 P >> yes
C#004 >> 1110110110000 FF >> 0.47 P >> no
C#005 >> 0010111010000 FF >> 0.42 P >> yes
C#006 >> 0110000001111 FF >> 0.41 P >> yes
C#007 >> 0110111000100 FF >> 0.4 P >> yes
C#008 >> 0110111000100 FF >> 0.4 P >> yes
C#009 >> 0110110110000 FF >> 0.38 P >> yes
C#010 >> 0110000110001 FF >> 0.37 P >> yes
C#011 >> 0010110000101 FF >> 0.37 P >> yes
C#012 >> 0110010000101 FF >> 0.35 P >> yes
C#013 >> 1110100001010 FF >> 0.35 P >> yes
C#014 >> 0100110110000 FF >> 0.35 P >> yes
C#015 >> 0110110010100 FF >> 0.34 P >> yes
C#016 >> 0110010011100 FF >> 0.32 P >> yes
C#017 >> 0110110010000 FF >> 0.29 P >> yes
C#018 >> 0010011000000 FF >> 0.29 P >> yes
C#019 >> 0100010101100 FF >> 0.29 P >> yes
C#020 >> 0100010010100 FF >> 0.27 P >> yes
>> Selection complete...
>> Crossover finished...
>> Mutation executed...
>> Current population...
C#001 >> 1110110101010 FF >> 0.55 P >> no
C#002 >> 0010111110000 FF >> 0.51 P >> no
C#003 >> 0110110011101 FF >> 0.5 P >> yes
C#004 >> 0110001010101 FF >> 0.48 P >> yes
C#005 >> 1100010000110 FF >> 0.42 P >> no
C#006 >> 0010111010000 FF >> 0.42 P >> yes
C#007 >> 0110111000100 FF >> 0.4 P >> yes
C#008 >> 0110010110100 FF >> 0.39 P >> yes
C#009 >> 0110110110000 FF >> 0.38 P >> yes
C#010 >> 0110010001110 FF >> 0.38 P >> yes
C#011 >> 0110110110000 FF >> 0.38 P >> yes
C#012 >> 0100111000100 FF >> 0.37 P >> yes
C#013 >> 0010110000101 FF >> 0.37 P >> yes
C#014 >> 0100110110000 FF >> 0.35 P >> yes
C#015 >> 0110100010001 FF >> 0.32 P >> yes
C#016 >> 0110110101000 FF >> 0.31 P >> yes
C#017 >> 0110110011000 FF >> 0.31 P >> yes
C#018 >> 0110000111100 FF >> 0.3 P >> yes
C#019 >> 0010011000000 FF >> 0.29 P >> yes
C#020 >> 0100010010100 FF >> 0.27 P >> yes
>> Selection complete...
>> Crossover finished...
>> Mutation executed...
>> Current population...
C#001 >> 1010111110000 FF >> 0.6 P >> no
C#002 >> 0110001110101 FF >> 0.57 P >> no
C#003 >> 0110010110001 FF >> 0.48 P >> no
C#004 >> 0110110101001 FF >> 0.45 P >> no
C#005 >> 0010011000010 FF >> 0.44 P >> no
C#006 >> 0110111010000 FF >> 0.44 P >> yes
C#007 >> 0110111010000 FF >> 0.44 P >> yes
C#008 >> 0110110000110 FF >> 0.4 P >> yes
C#009 >> 1010010001010 FF >> 0.4 P >> no
C#010 >> 0110110110000 FF >> 0.38 P >> yes
C#011 >> 0110101010100 FF >> 0.38 P >> yes
C#012 >> 0100111000100 FF >> 0.37 P >> yes
C#013 >> 0110100010101 FF >> 0.37 P >> yes
C#014 >> 0110110011100 FF >> 0.36 P >> yes
C#015 >> 0110111000000 FF >> 0.35 P >> yes
C#016 >> 0110110100100 FF >> 0.34 P >> yes
C#017 >> 0110110101000 FF >> 0.31 P >> yes
C#018 >> 0110000011001 FF >> 0.3 P >> yes
C#019 >> 0110000111100 FF >> 0.3 P >> yes
C#020 >> 0100110011000 FF >> 0.28 P >> yes
>> Selection complete...
>> Crossover finished...
>> Mutation executed...
>> Current population...
C#001 >> 1100110111010 FF >> 0.61 P >> no
C#002 >> 0110110000111 FF >> 0.54 P >> no
C#003 >> 0110111000010 FF >> 0.5 P >> no
C#004 >> 0110011110000 FF >> 0.49 P >> no
C#005 >> 0110111101000 FF >> 0.46 P >> no
C#006 >> 0110000111110 FF >> 0.45 P >> no
C#007 >> 0110111010000 FF >> 0.44 P >> yes
C#008 >> 0100110011001 FF >> 0.42 P >> yes
C#009 >> 1110100000110 FF >> 0.38 P >> yes
C#010 >> 0110101010100 FF >> 0.38 P >> yes
C#011 >> 0100111000100 FF >> 0.37 P >> yes
C#012 >> 0110110100100 FF >> 0.34 P >> yes
C#013 >> 0110110010100 FF >> 0.34 P >> yes
C#014 >> 0110100111100 FF >> 0.34 P >> yes
C#015 >> 0110110011000 FF >> 0.31 P >> yes
C#016 >> 0110110100000 FF >> 0.29 P >> yes
C#017 >> 0110110010000 FF >> 0.29 P >> yes
C#018 >> 0110110000100 FF >> 0.25 P >> yes
C#019 >> 0110100010100 FF >> 0.23 P >> yes
C#020 >> 0110000101000 FF >> 0.16 P >> yes
>> Selection complete...
>> Crossover finished...
>> Mutation executed...
>> Current population...
C#001 >> 0100111010101 FF >> 0.6 P >> no
C#002 >> 1110100010110 FF >> 0.47 P >> no
C#003 >> 1110100100110 FF >> 0.47 P >> no
C#004 >> 0110111100000 FF >> 0.44 P >> yes
C#005 >> 1100110011100 FF >> 0.42 P >> yes
C#006 >> 0100111010000 FF >> 0.41 P >> yes
C#007 >> 0110110000110 FF >> 0.4 P >> yes
C#008 >> 0100110110100 FF >> 0.4 P >> yes
C#009 >> 0110110011100 FF >> 0.36 P >> yes
C#010 >> 0110110001001 FF >> 0.36 P >> yes
C#011 >> 0110100011010 FF >> 0.35 P >> yes
C#012 >> 1110110000100 FF >> 0.34 P >> yes
C#013 >> 0100110000001 FF >> 0.31 P >> yes
C#014 >> 0110110010000 FF >> 0.29 P >> yes
C#015 >> 0110110100000 FF >> 0.29 P >> yes
C#016 >> 0110110001100 FF >> 0.27 P >> yes
C#017 >> 0100110010000 FF >> 0.26 P >> yes
C#018 >> 0110110000100 FF >> 0.25 P >> yes
C#019 >> 0110110000000 FF >> 0.2 P >> yes
C#020 >> 0100110001000 FF >> 0.19 P >> yes
>> Selection complete...
>> Crossover finished...
>> Mutation executed...
>> Current population...
C#001 >> 0110110001111 FF >> 0.56 P >> no
C#002 >> 1100111010100 FF >> 0.55 P >> no
C#003 >> 0110110000011 FF >> 0.49 P >> no
C#004 >> 1100110110100 FF >> 0.49 P >> no
C#005 >> 1110110001010 FF >> 0.46 P >> no
C#006 >> 0110111011000 FF >> 0.46 P >> yes
C#007 >> 0110111100000 FF >> 0.44 P >> yes
C#008 >> 1100110011100 FF >> 0.42 P >> yes
C#009 >> 0110110000110 FF >> 0.4 P >> yes
C#010 >> 0100110110100 FF >> 0.4 P >> yes
C#011 >> 0110110010100 FF >> 0.34 P >> yes
C#012 >> 0110110010100 FF >> 0.34 P >> yes
C#013 >> 0110110010100 FF >> 0.34 P >> yes
C#014 >> 0110110011000 FF >> 0.31 P >> yes
C#015 >> 0110110100000 FF >> 0.29 P >> yes
C#016 >> 0110110010000 FF >> 0.29 P >> yes
C#017 >> 0110110100000 FF >> 0.29 P >> yes
C#018 >> 0110110001100 FF >> 0.27 P >> yes
C#019 >> 0100110000100 FF >> 0.22 P >> yes
C#020 >> 0110110000000 FF >> 0.2 P >> yes
>> Selection complete...
>> Crossover finished...
>> Mutation executed...
>> Current population...
C#001 >> 1100110100110 FF >> 0.55 P >> no
C#002 >> 0110110101110 FF >> 0.51 P >> no
C#003 >> 0100111110000 FF >> 0.5 P >> no
C#004 >> 0100111010100 FF >> 0.46 P >> yes
C#005 >> 1110110011100 FF >> 0.45 P >> yes
C#006 >> 0110111010000 FF >> 0.44 P >> yes
C#007 >> 0110110110100 FF >> 0.43 P >> yes
C#008 >> 1110110010100 FF >> 0.43 P >> yes
C#009 >> 0100110111100 FF >> 0.42 P >> yes
C#010 >> 0110111000000 FF >> 0.35 P >> yes
C#011 >> 0110110100100 FF >> 0.34 P >> yes
C#012 >> 0100110011100 FF >> 0.33 P >> yes
C#013 >> 0110110011000 FF >> 0.31 P >> yes
C#014 >> 0110110010000 FF >> 0.29 P >> yes
C#015 >> 0110110010000 FF >> 0.29 P >> yes
C#016 >> 0100110011000 FF >> 0.28 P >> yes
C#017 >> 0110110001100 FF >> 0.27 P >> yes
C#018 >> 0100110100000 FF >> 0.26 P >> yes
C#019 >> 0110110000100 FF >> 0.25 P >> yes
C#020 >> 0110110000000 FF >> 0.2 P >> yes
>> Selection complete...
>> Crossover finished...
>> Mutation executed...
>> Current population...
C#001 >> 1110111010100 FF >> 0.58 P >> no
C#002 >> 1110111010000 FF >> 0.53 P >> no
C#003 >> 1110110001110 FF >> 0.51 P >> no
C#004 >> 0110111010100 FF >> 0.49 P >> yes
C#005 >> 1110110110000 FF >> 0.47 P >> no
C#006 >> 1110110011100 FF >> 0.45 P >> yes
C#007 >> 0110111010000 FF >> 0.44 P >> yes
C#008 >> 0110110110100 FF >> 0.43 P >> yes
C#009 >> 1110110010100 FF >> 0.43 P >> yes
C#010 >> 0100110110100 FF >> 0.4 P >> yes
C#011 >> 0100110111000 FF >> 0.37 P >> yes
C#012 >> 0110110000010 FF >> 0.35 P >> yes
C#013 >> 0110110010100 FF >> 0.34 P >> yes
C#014 >> 0100110101100 FF >> 0.33 P >> yes
C#015 >> 0100110011100 FF >> 0.33 P >> yes
C#016 >> 0110110011000 FF >> 0.31 P >> yes
C#017 >> 0100110010100 FF >> 0.31 P >> yes
C#018 >> 0110110100000 FF >> 0.29 P >> yes
C#019 >> 0100110001000 FF >> 0.19 P >> yes
C#020 >> 0100110000000 FF >> 0.17 P >> yes
Результатом выполнения алгоритма будет следующее.
>> Genetic algorithm finished on step 25...
>> Cause: Fitness function has no more increment...
>> Result: best chromosome is...
C### >> 0110110011101 FF >> 0.5
Вывод: я научился решать задачи оптимизации с помощью генетического алгоритма.
В результате применения генетического алгоритма к поставленной задаче было
проведено 25 итераций эволюции популяции. Причиной остановки эволюции было отсутствие
прогресса в развитии популяции. Итогом применения генетического алгоритма послужило
следующее решение о возможной комплектации автомобиля.
Модификация комплектации
автомобиля
Стоимость
Коэффициент
качества
Электро стеклоподъемники
12500
0,02
Электро регулировка сидений
11200
0,03
Кожаная обивка руля
15000
0,04
Круиз-контроль
100500
0,11
Навигация
55000
0,09
Люк
9000
0,02
CD-чейнджер
16000
0,05
Антиблокировочная система
120000
0,14
Итого:
339200
0,5
Download