Лабораторное занятие Поиск экстремумов функции нескольких переменных с помощью генетических алгоритмов Задание № 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