В этом примере показано, как минимизировать предмет целевой функции к нелинейным ограничениям неравенства и границам с помощью Генетического алгоритма.
Для этой проблемы целевая функция, чтобы минимизировать является простой функцией 2D переменной x
.
simple_objective(x) = (4 - 2.1*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) + (-4 + 4*x(2)^2)*x(2)^2;
Эта функция известна как "бегунок", как описано в L.C.W. Диксон и Г.П. Сзего [1].
Кроме того, проблема имеет нелинейные ограничения и границы.
x(1)*x(2) + x(1) - x(2) + 1.5 <= 0 (nonlinear constraint) 10 - x(1)*x(2) <= 0 (nonlinear constraint) 0 <= x(1) <= 1 (bound) 0 <= x(2) <= 13 (bound)
Создайте файл MATLAB под названием simple_objective.m
содержа следующий код:
type simple_objective
function y = simple_objective(x) %SIMPLE_OBJECTIVE Objective function for PATTERNSEARCH solver % Copyright 2004 The MathWorks, Inc. x1 = x(1); x2 = x(2); y = (4-2.1.*x1.^2+x1.^4./3).*x1.^2+x1.*x2+(-4+4.*x2.^2).*x2.^2;
Решатели, такие как ga
примите один вход x
, где x
имеет столько же элементов сколько количество переменных в проблеме. Целевая функция вычисляет скалярное значение целевой функции и возвращает его в ее одном выходном аргументе y
.
Создайте файл MATLAB под названием simple_constraint.m
содержа следующий код:
type simple_constraint
function [c, ceq] = simple_constraint(x) %SIMPLE_CONSTRAINT Nonlinear inequality constraints. % Copyright 2005-2007 The MathWorks, Inc. c = [1.5 + x(1)*x(2) + x(1) - x(2); -x(1)*x(2) + 10]; % No nonlinear equality constraints: ceq = [];
Ограничительная функция вычисляет значения всех ограничений неравенства и ограничений равенства и возвращает векторы c
и ceq
, соответственно. Значение c
представляет нелинейные ограничения неравенства, которые решатель пытается сделать меньше чем или равным нулю. Значение ceq
представляет нелинейные ограничения равенства, которые решатель пытается сделать равным нулю. Этот пример не имеет никаких нелинейных ограничений равенства, таким образом, ceq = []
. Для получения дополнительной информации смотрите Нелинейные Ограничения.
ga
Задайте целевую функцию как указатель на функцию.
ObjectiveFunction = @simple_objective;
Задайте проблемные границы.
lb = [0 0]; % Lower bounds ub = [1 13]; % Upper bounds
Задайте нелинейную ограничительную функцию как указатель на функцию.
ConstraintFunction = @simple_constraint;
Задайте количество переменных задачи.
nvars = 2;
Вызовите решатель, запросив оптимальную точку x
и значение функции в оптимальной точке fval
.
rng default % For reproducibility [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.3103
fval = 9.1268e+04
Чтобы наблюдать прогресс решателя, задайте опции тот выбор две функции построения графика. Функция построения графика gaplotbestf
строит лучшее значение целевой функции в каждой итерации и функцию построения графика gaplotmaxconstr
строит максимальное нарушение ограничений в каждой итерации. Установите эти две функции построения графика в массиве ячеек. Кроме того, информация об отображении о прогрессе решателя в Командном окне путем установки Display
опция к 'iter'
.
options = optimoptions("ga",'PlotFcn',{@gaplotbestf,@gaplotmaxconstr}, ... 'Display','iter');
Запустите решатель, включая options
аргумент.
[x,fval] = ga(ObjectiveFunction,nvars,[],[],[],[],lb,ub, ...
ConstraintFunction,options)
Single objective optimization: 2 Variable(s) 2 Nonlinear inequality constraint(s) Options: CreationFcn: @gacreationuniform CrossoverFcn: @crossoverscattered SelectionFcn: @selectionstochunif MutationFcn: @mutationadaptfeasible Best Max Stall Generation Func-count f(x) Constraint Generations 1 2524 91986.8 7.786e-09 0 2 4986 94677.4 0 0 3 10362 96929.2 0 0 4 16067 96006.3 0 0 5 23405 91267.6 0.0009898 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 = 9.1268e+04
С итеративным отображением, тем ga
предоставляет подробную информацию о проблемном типе и создании, перекрестном соединении, мутации и операторах выбора.
Нелинейные ограничения вызывают ga
решить много подпроблем в каждой итерации. Как показано и в графиках и в итеративном отображении, процесс решения имеет немного итераций. Однако Func-count
столбец в итеративном отображении показывает много вычислений функции на итерацию.
ga
решатель обрабатывает линейные ограничения и границы по-другому по сравнению с нелинейными ограничениями. Всем линейным ограничениям и границам удовлетворяют в течение оптимизации. Однако ga
может не удовлетворить всем нелинейным ограничениям при каждой генерации. Если ga
сходится к решению, нелинейным ограничениям удовлетворят в том решении.
ga
использует мутацию и перекрестные функции, чтобы произвести новых индивидуумов при каждой генерации. Путем ga
удовлетворяет линейные и связанные ограничения должен использовать мутацию и перекрестные функции, которые только генерируют допустимые точки. Например, в предыдущем вызове ga
, функция мутации по умолчанию (для неограниченных проблем) mutationgaussian
не удовлетворяет линейным ограничениям и так ga
использует mutationadaptfeasible
функционируйте вместо этого по умолчанию. Если вы обеспечиваете пользовательскую функцию мутации, эта пользовательская функция должна только сгенерировать точки, которые выполнимы относительно линейных и связанных ограничений. Все перекрестные функции в тулбоксе генерируют точки, которые удовлетворяют линейным ограничениям и границам.
Однако, когда ваша проблема содержит целочисленные ограничения, ga
осуществляет это все, итерации удовлетворяют границам и линейным ограничениям. Эта выполнимость происходит для всей мутации, перекрестного соединения и операторов создания, к в маленьком допуске.
Чтобы ускорить решатель, можно обеспечить начальную генеральную совокупность в InitialPopulationMatrix
опция. ga
использует начальную генеральную совокупность, чтобы запустить ее оптимизацию. Задайте вектор-строку или матрицу, где каждая строка представляет одну стартовую точку.
X0 = [0.8 12.5]; % Start point (row vector) options.InitialPopulationMatrix = X0; [x,fval] = ga(ObjectiveFunction,nvars,[],[],[],[],lb,ub, ... ConstraintFunction,options)
Single objective optimization: 2 Variable(s) 2 Nonlinear inequality constraint(s) Options: CreationFcn: @gacreationuniform CrossoverFcn: @crossoverscattered SelectionFcn: @selectionstochunif MutationFcn: @mutationadaptfeasible Best Max Stall Generation Func-count f(x) Constraint Generations 1 2500 91507.4 0 0 2 4950 91270.4 0.0009621 0 3 7400 91270.4 0.0009621 1 4 9850 91269.2 0.0009958 0 5 12300 91269.2 0.0009958 1 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 = 9.1269e+04
В этом случае обеспечение стартовой точки существенно не изменяет прогресс решателя.
[1] Диксон, L. C. W. и G.P. Szego (редакторы).. К глобальной оптимизации 2. Северная Голландия: Elsevier Science Ltd., Амстердам, 1978.