gaПредположим, что вы хотите минимизировать простую функцию соответствия двух переменных x 1 и x 2,
удовлетворяющее следующим нелинейным ограничениям неравенства и границам
Начните с создания функций соответствия и ограничений. Сначала создайте файл с именем 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_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 function, а также указание количества переменных в качестве второго аргумента. Нижняя и верхняя границы предусмотрены следующим LB и UB соответственно. В сложение, вам также нужно передать указатель на функцию в нелинейную функцию ограничения.
ObjectiveFunction = @simple_fitness; nvars = 2; % Number of variables LB = [0 0]; % Lower bound UB = [1 13]; % Upper bound ConstraintFunction = @simple_constraint; rng(1,'twister') % for reproducibility [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 =
0.8123 12.3137
fval =
1.3581e+04Для задач без целочисленных ограничений решатель генетического алгоритма обрабатывает линейные ограничения и ограничения по-другому по сравнению с нелинейными ограничениями. Все линейные ограничения и ограничения выполняются на протяжении всей оптимизации. Однако, ga может не удовлетворять всем нелинейным ограничениям в каждой генерации. Если ga сходится к решению, нелинейные ограничения будут удовлетворены в этом решении.
Если существуют целочисленные ограничения, ga не применяет допустимость линейных ограничений и вместо этого добавляет любые линейные нарушения ограничений к функции штрафа. См. Целочисленный алгоритм ga.
ga использует функции мутации и кроссовера, чтобы произвести новые индивидуумов в каждой генерации. ga удовлетворяет линейным и связанным ограничениям с помощью мутационных и перекрестных функций, которые только генерируют допустимые точки. Для примера, в предыдущем вызове на ga, функцию мутации mutationguassian не обязательно подчиняется связанным ограничениям. Поэтому, когда существуют связанные или линейные ограничения, значение по умолчанию ga функция мутации mutationadaptfeasible. Если вы предоставляете пользовательскую функцию мутации, эта пользовательская функция должна генерировать только точки, которые допустимы относительно линейных и связанных ограничений. Все включенные функции перекрестия генерируют точки, которые удовлетворяют линейным ограничениям и границам.
Чтобы увидеть прогресс оптимизации, используйте optimoptions функция для создания опций, которые выбирают две функции вывода на функцию построения графика. Первая функция построения графика gaplotbestf, который рисует лучший и средний счет населения на каждой генерации. Вторая функция построения графика gaplotmaxconstr, который строит график максимального нарушения ограничений нелинейных ограничений для каждой генерации. Можно также визуализировать прогресс алгоритма, отобразив информацию в командном окне с помощью 'Display' опция.
options = optimoptions('ga','PlotFcn',{@gaplotbestf,@gaplotmaxconstr},'Display','iter');
Повторно выполните команду ga решатель.
[x,fval] = ga(ObjectiveFunction,nvars,[],[],[],[],...
LB,UB,ConstraintFunction,options) Best Max Stall
Generation Func-count f(x) Constraint Generations
1 2520 13603.6 0 0
2 4982 13578.2 5.718e-06 0
3 7538 14033.9 0 0
4 11116 13573.7 0.0009577 0
Optimization terminated: average change in the fitness value less than options.FunctionTolerance
and constraint violation is less than options.ConstraintTolerance.
x =
0.8122 12.3104
fval =
1.3574e+04
Можно предоставить начальную точку для минимизации ga функция путем определения InitialPopulationMatrix опция. ga функция будет использовать первый индивидуума из InitialPopulationMatrix как начальная точка для ограниченной минимизации.
X0 = [0.5 0.5]; % Start point (row vector)
options = optimoptions('ga',options,'InitialPopulationMatrix',X0);Теперь перезапустите ga решатель.
[x,fval] = ga(ObjectiveFunction,nvars,[],[],[],[],...
LB,UB,ConstraintFunction,options) Best Max Stall
Generation Func-count f(x) Constraint Generations
1 2520 13578.1 0.0005269 0
2 4982 13578.2 1.815e-05 0
3 8008 14031.3 0 0
4 13525 14054.9 0 0
5 17620 13573.5 0.0009986 0
Optimization terminated: average change in the fitness value less than options.FunctionTolerance
and constraint violation is less than options.ConstraintTolerance.
x =
0.8122 12.3103
fval =
1.3573e+04