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