В этом примере показано, как минимизировать целевую функцию, подверженную нелинейным ограничениям неравенства и ограничениям с помощью генетического алгоритма.
Мы хотим минимизировать простую функцию пригодности двух переменных x1 и x2
min f(x) = 100 * (x1^2 - x2) ^2 + (1 - x1)^2;
x
для выполнения следующих двух нелинейных ограничений и ограничений
x1*x2 + x1 - x2 + 1.5 <=0, (nonlinear constraint) 10 - x1*x2 <=0, (nonlinear constraint) 0 <= x1 <= 1, and (bound) 0 <= x2 <= 13 (bound)
Вышеуказанная функция пригодности известна как «кулачок», как описано в L.C.W. Диксон и Г.П. Сего (ред.), на пути к глобальной оптимизации 2, Северо-Голландия, Амстердам, 1978.
Создадим файл MATLAB с именем simple_fitness.m со следующим кодом в нем:
function y = simple_fitness(x)
y = 100 * (x(1)^2 - x(2)) ^2 + (1 - x(1))^2;
Функция генетического алгоритма ga предполагает, что функция фитнеса займет один вход x где x имеет столько элементов, сколько переменных в проблеме. Функция пригодности вычисляет значение функции и возвращает это скалярное значение в одном аргументе возврата y.
Создадим файл MATLAB с именем simple_constraint.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 имеет столько элементов, сколько переменных в проблеме. Функция ограничения вычисляет значения всех ограничений неравенства и равенства и возвращает два вектора c и ceq соответственно.
gaЧтобы минимизировать нашу функцию фитнеса с помощью ga функция, нам нужно передать дескриптор функции в функцию пригодности, а также указать количество переменных в качестве второго аргумента. Нижние и верхние границы предусмотрены в виде 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, ... ConstraintFunction)
Optimization terminated: average change in the fitness value less than options.FunctionTolerance and constraint violation is less than options.ConstraintTolerance.
x = 1×2
0.8122 12.3104
fval = 1.3574e+04
Обратите внимание, что для нашей проблемы ограниченной минимизации, ga функция изменила мутационную функцию на mutationadaptfeasible. Функция мутации по умолчанию, mutationgaussian, подходит только для неограниченных проблем минимизации.
ga Операторы для ограниченной минимизации ga решатель обрабатывает линейные ограничения и границы, отличающиеся от нелинейных ограничений. Все линейные ограничения и границы удовлетворяются на протяжении всей оптимизации. Однако ga может не удовлетворять всем нелинейным ограничениям в каждом поколении. Если ga сходится к решению, нелинейные ограничения будут удовлетворены в этом решении.
ga использует функции мутации и кроссовера для получения новых индивидуумов в каждом поколении. Путь ga удовлетворяет линейным и связанным ограничениям, заключается в использовании мутационных и перекрестных функций, которые генерируют только возможные точки. Например, в предыдущем вызове ga, функция мутации по умолчанию mutationgaussian не будет удовлетворять линейным ограничениям, и поэтому mutationadaptfeasible используется вместо него. Если предусмотрена пользовательская функция мутации, эта пользовательская функция должна генерировать только те точки, которые возможны в отношении линейных и связанных ограничений. Все перекрестные функции панели инструментов создают точки, удовлетворяющие линейным ограничениям и границам.
Уточняем mutationadaptfeasible в качестве MutationFcn для нашей проблемы минимизации путем создания опций с помощью optimoptions функция.
options = optimoptions(@ga,'MutationFcn',@mutationadaptfeasible); % Next we run the GA solver. [x,fval] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB, ... ConstraintFunction,options)
Optimization terminated: average change in the fitness value less than options.FunctionTolerance and constraint violation is less than options.ConstraintTolerance.
x = 1×2
0.8122 12.3103
fval = 1.3573e+04
Далее мы используем optimoptions для выбора двух функций печати. Первая функция графика - gaplotbestf, который строит график лучшего и среднего балла населения в каждом поколении. Вторая функция графика - gaplotmaxconstr, которая отображает максимальное нарушение ограничений нелинейных ограничений в каждом поколении. Мы также можем визуализировать ход выполнения алгоритма, отображая информацию в окне команд с помощью Display вариант.
options = optimoptions(options,'PlotFcn',{@gaplotbestf,@gaplotmaxconstr}, ... 'Display','iter'); % Next we run the GA solver. [x,fval] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB, ... ConstraintFunction,options)
Best Max Stall
Generation Func-count f(x) Constraint Generations
1 2524 13579.8 2.1e-07 0
2 4986 13578.2 1.686e-05 0
3 7918 14031 0 0
4 17371 13573.5 0.0009928 0
Optimization terminated: average change in the fitness value less than options.FunctionTolerance
and constraint violation is less than options.ConstraintTolerance.

x = 1×2
0.8122 12.3103
fval = 1.3574e+04
Начальная точка для минимизации может быть предоставлена ga путем указания InitialPopulationMatrix вариант. ga функция будет использовать первого человека из InitialPopulationMatrix в качестве начальной точки для ограниченной минимизации. Описание указания начального заполнения см. в документации ga.
X0 = [0.5 0.5]; % Start point (row vector) options.InitialPopulationMatrix = X0; % Next we run the GA solver. [x,fval] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB, ... ConstraintFunction,options)
Best Max Stall
Generation Func-count f(x) Constraint Generations
1 2520 13578.1 0.000524 0
2 4982 13578.2 1.024e-05 0
3 7914 14030.5 0 0
4 17379 13708.4 0.0001674 0
Optimization terminated: average change in the fitness value less than options.FunctionTolerance
and constraint violation is less than options.ConstraintTolerance.

x = 1×2
0.8089 12.3626
fval = 1.3708e+04