Этот пример показывает, как минимизировать целевую функцию, удовлетворяющую нелинейным ограничениям неравенства и границам, используя Генетический алгоритм.
Мы хотим минимизировать простую функцию соответствия из двух переменных 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.
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.
x = 1×2
0.8089 12.3626
fval = 1.3708e+04