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