Ограниченная минимизация Используя генетический алгоритм

В этом примере показано, как минимизировать предмет целевой функции к нелинейным ограничениям неравенства и границам с помощью Генетического алгоритма.

Ограниченная проблема минимизации

Мы хотим минимизировать простую функцию фитнеса двух переменных 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.099e-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