gaПредположим, что вы хотите минимизировать простую функцию пригодности двух переменных x1 и x2,
+ (1 − x1) 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 , а также указание количества переменных в качестве второго аргумента. Нижние и верхние границы предусмотрены в виде 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