Vectorize
как
On
.
Примечание.
Для корректного использования опции
Vectorize
необходимо, что бы функция пригодности допускала
использованиепроизвольного числа строк.
С помощью следующего сравнения, выполненного из командной
строки, можно увидеть эффект увеличения скорости выполнения,
достигаемого с помощью установки опции
Vectorize
.
tic;ga(@rastriginsfcn,20);toc
elapsed_time =
4.3660
options=gaoptimset('Vectorize','on');
tic;ga(@rastriginsfcn,20,options);toc
elapsed_time =
0.5810
6.6.16. Минимизация при наличии ограничений с использованием
функции ga
Пусть необходимо найти минимум простой функции пригодности с
двумя переменными x1 and x2
А.Е. Кононюк Дискретно-непрерывная математика
409
При условии выполнения следующих нелинейных неравенств и
ограничений
Начнем с создания функций пригодности и ограничений. В первую
очередь, создадим следующий М-файл под именем simple_fitness.m
function y = simple_fitness(x)
y = 100 * (x(1)^2 - x(2)) ^2 + (1 - x(1))^2;
В функции Генетического алгоритма, ga, предполагается, что функция
пригодности имеет только одно обращение к x, где x имеет столько же
элементов, что и число переменных решаемой задачи. Функция
пригодности вычисляет значение функции и возвращает скалярное
значение в виде одного выходного аргумента y.
Далее создадим следующий М-файл под именем simple_fitness.m,
который включал бы в себя вводимые в задачу ограничения
function [c, ceq] = simple_constraint(x)
c = [1.5 + x(1)*x(2) + x(1) - x(2);
-x(1)*x(2) + 10];
ceq = [];
Предполагается, что функция ga имеет функцию ограничений с одним
входом x, где x имеет столько же элементов, что и число переменных
решаемой задачи. В функции ограничений вычисляются значения всех
ограничений типа равенств и неравенств и возвращаются два вектора,
ceq и c, соответственно.
Для минимизации функции пригодности, необходимо передать
указатель функции в функцию пригодности на месте первого аргумент
функции ga, а так же как определить число переменных на месте
А.Е. Кононюк Дискретно-непрерывная математика
410
второго аргумента. Нижние и верхние границы задаются на месте
параметров LB и UB соответственно. Кроме того, также необходимо
передать указатель функции и в функцию нелинейных ограничений.
ObjectiveFunction = @simple_fitness;
nvars = 2; % Number of variables
LB = [0 0]; % Lower bound
UB = [1 13]; % Upper bound
ConstraintFunction = @simple_constraint;
[x,fval] =
ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,Constr
aintFunction)
Warning: 'mutationgaussian' mutation function is
for unconstrained minimization only;
using @mutationadaptfeasible mutation function.
Set @mutationadaptfeasible as MutationFcn options
using GAOPTIMSET.
Optimization terminated: current tolerance on f(x)
1e-007 is less than options.TolFun
and constraint violation is less than
options.TolCon.
x =
0.8122 12.3122
fval =
1.3578e+004
Примечание для задачи минимизации при наличии ограничений
функция ga изменила мутационную функцию на новую
@mutationadaptfeasible. Принимаемая по умолчанию функция мутации
@mutationgaussian подходит только для задач минимизации без
наличия ограничений
Решатель Генетического алгоритма обращается с линейными
ограничениями и границами несколько отличным образом по
сравнению со случаем с нелинейными ограничениями. Все линейные
А.Е. Кононюк Дискретно-непрерывная математика
411
ограничения и границы выполняются по всему ходу оптимизации.
Однако функция ga применительно к части поколений может и не
соблюдать все необходимые нелинейные ограничения. Как только ga
будет сходиться к некоему решению, то и нелинейные ограничения
будут выполняться в этом случае.
Функция ga использует функции мутации и кроссовера в каждом
поколении для новых индивидуализированных объектов. Функция ga
выполняет все линейные и связанные ограничения при помощи
функций мутации и кроссовера, которые генерируют только
допустимые точки. Например, в предыдущем обращении к команде ga,
принимаемая по умолчанию функция мутации mutationguassian не
соблюдает линейные ограничения и, таким образом, вместо нее
используется функция мутации mutationadaptfeasible. Если принимать
произвольную функцию мутации, то эта произвольная функция
мутации должна генерировать только такие точки, которые являются
допустимыми относительно линейных ограничений и пределов. Все
кроссоверные функции данного инструментария генерируют такие
точки, которые удовлетворяют линейным ограничениям и пределам за
исключением случая с выбором функции crossoverheuristic.
С помощью функции gaoptimset зададим mutationadaptfeasible в
качестве функции мутации для выбранной задачи минимизации
options =
gaoptimset('MutationFcn',@mutationadaptfeasible);
Далее запустим решатель ga.
[x,fval] =
ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,Constr
aintFunction,options)
Optimization terminated: current tolerance on f(x)
1e-007 is less than options.TolFun
and constraint violation is less than
options.TolCon.
x =
А.Е. Кононюк Дискретно-непрерывная математика
412
0.8122 12.3122
fval =
1.3578e+004
Теперь с помощью функции gaoptimset построим структуру опций,
которая будет отбирать функции для двух графических зависимостей.
Первой функцией графической зависимости будет gaplotbestf, которая
отображает наилучшую и среднюю оценку семества для каждого
поколения. Второй функцией графической зависимости будет
gaplotmaxconstr, которая отображает максимальное нарушение
заданного ограничения в виде нелинейных ограничений для каждого
поколения. Так же имеется возможность с помощью опции 'Display'
получить визуализацию прогресса алгоритма путем отображения
информации в окне команд.
options =
gaoptimset(options,'PlotFcns',{@gaplotbestf,@gaplot
maxconstr},'Display','iter');
Перезапустим решатель ga, что даст:
[x,fval] =
ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,Constr
aintFunction,options)
Best max
Stall
Generation f-count f(x) constraint
Generations
1 849 14915.8 0 0
2 1567 13578.3 0 0
3 2334 13578.3 0 1
4 3043 13578.3 0 2
5 3752 13578.3 0 3
Optimization terminated: current tolerance on f(x)
1e-009 is less than options.TolFun
А.Е. Кононюк Дискретно-непрерывная математика
413
and constraint violation is less than
options.TolCon.
x =
0.8122 12.3123
fval =
1.3578e+004
Имеется возможность с помощью опции InitialPopulation задать
стартовую точку минимизации для функции ga. Таким образом,
функция ga будет использовать индивидуализированный объект из
опции InitialPopulation в качестве стартовой точки минимизации при
наличии ограничений.
X0 = [0.5 0.5]; % Start point (row vector)
А.Е. Кононюк Дискретно-непрерывная математика
414
options =
gaoptimset(options,'InitialPopulation',X0);
Далее перезапустим решатель ga.
[x,fval] =
ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,Constr
aintFunction,options)
Best max
Stall
Generation f-count f(x) constraint
Generations
1 965 13579.6 0 0
2 1728 13578.2 1.776e-015 0
3 2422 13578.2 0 0
Optimization terminated: current tolerance on f(x)
1e-007 is less than options.TolFun
and constraint violation is less than
options.TolCon.
x =
0.8122 12.3122
fval =
1.3578e+004
Do'stlaringiz bilan baham: |