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

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

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

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

Вышеупомянутая функция фитнеса известна как 'бегунок', как описано в Л.К.В. Диксоне и Г.П. Сзего (редакторы)., К Глобальной Оптимизации 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           2674       13578.5            0      0
    2           5286       13578.2    1.485e-05      0
    3           7898       13883.3            0      0
    4          14148       13573.6     0.000999      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.8123   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           2670       13578.1    0.0005448      0
    2           5282       13578.2    8.021e-06      0
    3           8394       14034.4            0      0
    4          16256       14052.7            0      0
    5          18856       13573.5    0.0009913      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.3573e+04
Для просмотра документации необходимо авторизоваться на сайте