Этот пример показывает, как выполнить мультиобъективную оптимизацию с помощью функции мультиобъективного генетического алгоритма gamultiobj
в Global Optimization Toolbox.
gamultiobj
может использоваться, чтобы решить мультиобъективные задачи оптимизации в нескольких переменных. Здесь мы хотим минимизировать две цели, каждая из которых имеет одну переменную решения.
min F(x) = [objective1(x); objective2(x)] x
where, objective1(x) = (x+2)^2 - 10, and objective2(x) = (x-2)^2 + 20
% Plot two objective functions on the same axis x = -10:0.5:10; f1 = (x+2).^2 - 10; f2 = (x-2).^2 + 20; plot(x,f1); hold on; plot(x,f2,'r'); grid on; title('Plot of objectives ''(x+2)^2 - 10'' and ''(x-2)^2 + 20''');
Две цели имеют свои минимумы в x = -2
и x = +2
соответственно. Однако в мультиобъективной задаче x = -2
, x = 2
и любое решение в области значений -2 <= x <= 2
одинаково оптимально. Нет единого решения этой мультиобъективной задачи. Цель мультиобъективного генетического алгоритма состоит в том, чтобы найти набор решений в этой области значений (в идеале с хорошим распространением). Набор решений также известен как фронт Парето. Все решения на фронте Парето оптимальны.
Создадим файл MATLAB с именем simple_multiobjective.m
:
function y = simple_multiobjective(x) y(1) = (x+2)^2 - 10; y(2) = (x-2)^2 + 20;
Решатель Генетического алгоритма предполагает, что функция соответствия примет один вход x
, где x
- вектор-строка с таким количеством элементов, как количество переменных в задаче. Функция соответствия вычисляет значение каждой целевой функции и возвращает эти значения в одном векторном выходе y
.
gamultiobj
Как использовать gamultiobj
функция, нам нужно предоставить как минимум два входных параметров, функцию соответствия и количество переменных в задаче. Первые два выходных аргументов возвращены gamultiobj
являются X
, точки на фронте Парето и FVAL
, значения целевой функции в значениях X
. Третий выходной аргумент, exitFlag
, рассказывает вам причину, по которой gamultiobj
остановлен. Четвертый аргумент, OUTPUT
, содержит информацию о эффективности решателя. gamultiobj
можно также вернуть пятый аргумент, POPULATION
, который содержит население, когда gamultiobj
завершен и шестой аргумент, SCORE
, который содержит значения функций всех целей для POPULATION
когда gamultiobj
завершен.
FitnessFunction = @simple_multiobjective; numberOfVariables = 1; [x,fval] = gamultiobj(FitnessFunction,numberOfVariables);
Optimization terminated: maximum number of generations exceeded.
The X
возвращенная решателем матрица, в которой каждая строка является точкой на фронте Парето для целевых функций. The FVAL
- матрица, в которой каждая строка содержит значение целевых функций, вычисленных в соответствующей точке X
.
size(x) size(fval)
ans = 18 1 ans = 18 2
gamultiobj
может справиться с задачами оптимизации с линейным неравенством, равенством и простыми связанными ограничениями. Здесь мы хотим добавить ограничения на простую мультиобъективную задачу, решенную ранее.
min F(x) = [objective1(x); objective2(x)] x
subject to -1.5 <= x <= 0 (bound constraints)
where, objective1(x) = (x+2)^2 - 10, and objective2(x) = (x-2)^2 + 20
gamultiobj
принимает линейные ограничения неравенства в форме A*x <= b
и линейные ограничения равенства в форме Aeq*x = beq
и связанные ограничения в форме lb <= x <= ub
. Проходим A
и Aeq
как матрицы и b
, beq
, lb
, и ub
как векторы. Поскольку у нас нет линейных ограничений в этом примере, мы проходим []
для этих входов.
A = []; b = []; Aeq = []; beq = []; lb = -1.5; ub = 0; x = gamultiobj(FitnessFunction,numberOfVariables,A,b,Aeq,beq,lb,ub);
Optimization terminated: maximum number of generations exceeded.
Все решения в X
(каждая строка) удовлетворяет всем линейным и связанным ограничениям в пределах допуска, заданного в options.ConstraintTolerance
. Однако, если вы используете свой собственный кроссовер или функцию мутации, убедитесь, что новые индивидуумы допустимы относительно линейных и простых связанных ограничений.
gamultiobj
может принять одну или несколько функций построения графика через аргумент опции. Эта функция полезна для визуализации эффективности решателя во время исполнения. Функции построения графика могут быть выбраны с помощью optimoptions
.
Здесь мы используем optimoptions
для выбора двух функций построения графика. Первая функция построения графика gaplotpareto
, который изображает фронт Парето (ограничиваясь любыми тремя целями) на каждой генерации. Вторая функция построения графика gaplotscorediversity
, который строит график разнообразия счетов для каждой цели. Опции передаются как последний аргумент решателю.
options = optimoptions(@gamultiobj,'PlotFcn',{@gaplotpareto,@gaplotscorediversity});
gamultiobj(FitnessFunction,numberOfVariables,[],[],[],[],lb,ub,options);
Optimization terminated: maximum number of generations exceeded.
Рассмотрим предыдущие функции соответствия снова:
objective1(x) = (x+2)^2 - 10, and objective2(x) = (x-2)^2 + 20
По умолчанию в gamultiobj
решатель переходит только в одной точке за раз к функции соответствия. Однако, если функция соответствия векторизована, чтобы принять набор точек и вернуть набор значений функции, вы можете ускорить решение.
Например, если решателю нужно вычислить пять точек в одном вызове этой функции соответствия, то он вызовет функцию с матрицей размера 5 на 1, т.е. 5 строк и 1 столбец (напомним, что 1 - это количество переменных).
Создайте файл MATLAB с именем vectorized_multiobjective.m
:
function scores = vectorized_multiobjective(pop) popSize = size(pop,1); % Population size numObj = 2; % Number of objectives % initialize scores scores = zeros(popSize, numObj); % Compute first objective scores(:,1) = (pop + 2).^2 - 10; % Compute second objective scores(:,2) = (pop - 2).^2 + 20;
Эта векторизованная версия функции соответствия принимает матрицу pop
с произвольного числа точек, строки pop
, и возвращает матрицу размера populationSize
-by- numberOfObjectives
.
Нам нужно указать, что функция соответствия векторизирована с помощью опций, созданных с помощью optimoptions
. Опции передаются как девятый аргумент.
FitnessFunction = @(x) vectorized_multiobjective(x);
options = optimoptions(@gamultiobj,'UseVectorized',true);
gamultiobj(FitnessFunction,numberOfVariables,[],[],[],[],lb,ub,options);
Optimization terminated: average change in the spread of Pareto solutions less than options.FunctionTolerance.