exponenta event banner

Ограниченная минимизация с помощью генетического алгоритма

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

Проблема минимизации с ограничениями

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

Figure Genetic Algorithm contains 2 axes. Axes 1 with title Best: 13573.1 Mean: 13573.6 contains 2 objects of type line. These objects represent Best fitness, Mean fitness. Axes 2 with title Max constraint: 0.000992792 contains an object of type line.

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.

Figure Genetic Algorithm contains 2 axes. Axes 1 with title Best: 13576.2 Mean: 13579.4 contains 2 objects of type line. These objects represent Best fitness, Mean fitness. Axes 2 with title Max constraint: 0.000167405 contains an object of type line.

x = 1×2

    0.8089   12.3626

fval = 1.3708e+04

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