exponenta event banner

Нелинейные зависимости с помощью ga

Предположим, что вы хотите минимизировать простую функцию пригодности двух переменных x1 и x2,

minxf (x) = 100 (x12 x2) 2 + (1 − x1) 2

с учетом следующих нелинейных ограничений и ограничений неравенства

x1⋅x2+x1−x2+1.5≤0 ( нелинейное ограничение) 10−x1⋅x2≤0 ( нелинейное ограничение) 0≤x1≤1 (ограничение) 0≤x2≤13 (ограничение)

Начните с создания функций фитнеса и ограничения. Сначала создайте файл с именем 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

Связанные темы