Лабораторное занятие Поиск экстремумов функции нескольких

advertisement
Лабораторное занятие
Поиск экстремумов функции нескольких переменных с помощью
генетических алгоритмов
Задание № 1
Минимизировать функцию одной переменной
f ( x)  2 x 2  8 x  6
Решение.
Напишем M-file для данной функции и сохраним его в текущей папке
под именем my_fun.m.
function y=my_fun(x)
y=2*x^2+8*x-6;
Вызовем окно тулбокса с помощью gatool.
В поле fitness function введем имя целевой функции @ my_fun(x)
Установим значения параметров ГА: количество особей в популяции =
10, количество поколений = 50 (в окне критерия остановки алгоритма),
начальный отрезок = [-3; 0]. В разделе plots установим флажки для best
fitness, best individual, distance. Щелкнем по кнопке start.
В результате завершения процесса в окне final point появится значение
переменной x, соответствующее минимуму функции, а в окне status and result
можно увидеть найденное минимальное значение целевой функции.
Для данной задачи результаты получились следующие минимум
функции достигается в точке x =-2.01 и f(-2.01) = -13.9998.
Best: -13.9998 Mean: -13.9867
Fitness value
Best fitness
Mean fitness
-10
-15
20
30
40
50
Generation
Average Distance Between Individuals
3
Avergae Distance
0
Current Best Individual
Current best individual
-5
10
0
-1
-2
-3
1
Number of variables (1)
2
1
0
10
20
30
Generation
40
50
Первый рисунок отображает изменение значение целевой функции.
Для каждого поколения приведены значения среднего (по всем особям
поколения) значения целевой функции (верхняя последовательность точек) и
наилучшие
(минимальные)
значения
в
поколениях
(нижняя
последовательность точек). Вверху первого графика приведены наилучшее
(best) и среднее (Mean) значения для последнего поколения. Видно, что,
начиная с 40 популяции, алгоритм сошелся к решению. На втором рисунке
изображена наилучшая особь. Третий рисунок соответствует изменению
расстояния между особями в поколениях. Особи становятся одинаковыми
(хеммингово расстояние = 0) в последних поколениях. ГА нужно запустить
несколько раз, а потом выбрать оптимальное решение. Это связано с тем, что
начальная популяция формируется с использованием генератора случайных
чисел.
Убедиться в правильности решения можно, построив график функции
(рис. 2).
300
250
200
150
100
50
0
-50
-10
-8
-6
-4
-2
0
2
4
6
8
10
Рис. 2. График функции f ( x)  2 x 2  8x  6
То же самое можно было бы получить, используя функции gaoptimset и
ga. Чтобы посмотреть M-File выберете в меню «File» окна «Genetic Algoritm
Tool» команду «Generate M-file», сохраните файл под другим именем и
просмотрите код. Для данной задачи получили:
fitnessFunction = @ my_fun;
nvars = 1;
options = gaoptimset;
options = gaoptimset(options,'PopInitRange',[-3;0]);
options = gaoptimset(options,'PopulationSize',10);
options = gaoptimset(options,'MutationFcn', {@mutationgaussian 1 1});
options = gaoptimset(options,'Display','off');
options = gaoptimset(options,'PlotFcns', {@gaplotbestf @gaplotbestindiv
@gaplotdistance });
[X,FVAL,REASON,OUTPUT,POPULATION,SCORES]=ga(fitnessFunctio
n,nvars,options);
Best: -13.9995 Mean: -13.31
Fitness value
Best fitness
10
Mean fitness
0
-10
-20
50
100
Generation
Average Distance Between Individuals
4
Avergae Distance
Current Best Individual
Current best individual
20
0
0
-0.5
-1
-1.5
-2
1
Number of variables (1)
3
2
1
0
20
40
60
Generation
80
100
Задание № 2
Найти максимум функции:
z ( x, y ) 
sin x
.
x 2  y 2  0.3
Решение.
Тулбокс по ГА решает только задачи минимизации, для нахождения
максимума функции z(x,y) следует минимизировать функцию -z(x,y).
Напишем M-file для функции -z(x,y) и сохраним его в текущей папке под
именем my_fun2.m:
function z = my_fun2(x)
z=-sin(x(1))./(x(1).^2+x(2).^2+0.3);
Вызовем окно тулбокса с помощью gatool.
В поле fitness function введем имя целевой функции @ my_fun2.
Установим значения параметров ГА: количество переменных = 2, количество особей в популяции = 10 (по умолчанию), количество поколений =
50 (в окне критерия остановки алгоритма), начальный отрезок – по
умолчанию = [0; 1]. Для построения графиков в разделе plots установим
флажки для best fitness, best individual, distance. Щелкнем по кнопке start.
В результате завершения процесса в окне final point появится значение
переменной x, соответствующее минимуму функции, а в окне status and result
можно увидеть найденное минимальное значение целевой функции z(x).
Best: -0.87137 Mean: -0.87082
Fitness value
Best fitness
-0.4
Mean fitness
-0.6
-0.8
-1
20
30
40
50
Generation
Average Distance Between Individuals
1.5
Avergae Distance
0
Current Best Individual
Current best individual
-0.2
10
0.8
0.6
0.4
0.2
0
1
2
Number of variables (2)
1
0.5
0
10
20
30
Generation
40
50
Для данной задачи результаты получились следующие: максимум
функции достигается в точке x=0.51, y=0.012, -z(0.474;0.014)=-0.87137. Т.е.
максимум функции z ( x, y ) 
sin x
приблизительно равен 0.87137 и
x  y 2  0.3
2
достигается приблизительно в точке x=0.51, y=0.012.
Поверхность функции представлена на рис. 27.
>> [X,Y]=meshgrid([-3:0.1:3]);
>> Z=sin(X)./(X.^2+Y.^2+0.3);
>> surfc(X,Y,Z)
1
0.5
0
-0.5
-1
4
2
0
-2
-4
-4
-2
0
2
4
Download