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

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

Ограниченная задача минимизации

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

Указанная выше функция соответствия известна как 'cam', как описано в L.C.W. Dixon and G.P. Szego (eds.), To Global Optimization 2, North-Holland, Amsterdam, 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 = [];

The 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 Операторы для ограниченной минимизации

The 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 опция. The 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

Похожие темы