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