В этом примере показано, как минимизировать предмет целевой функции к нелинейным ограничениям неравенства и границам с помощью Генетического алгоритма.
Мы хотим минимизировать простую функцию фитнеса двух переменных 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