В этом примере показано, как выполнить мультиобъективную оптимизацию с использованием функции мультиобъективного генетического алгоритма gamultiobj на панели инструментов глобальной оптимизации.
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.
X возвращает решатель матрица, в которой каждая строка является точкой на фронте Парето для целевых функций. FVAL - матрица, в которой каждая строка содержит значение целевых функций, оцениваемых в соответствующей точке в X.
size(x) size(fval)
ans =
18 1
ans =
18 2
gamultiobj может обрабатывать задачи оптимизации с линейным неравенством, равенством и простыми связанными ограничениями. Здесь мы хотим добавить связанные ограничения на простую многообъективную задачу, решенную ранее.
min F(x) = [objective1(x); objective2(x)]
xsubject to -1.5 <= x <= 0 (bound constraints)
where, objective1(x) = (x+2)^2 - 10, and
objective2(x) = (x-2)^2 + 20gamultiobj принимает линейные ограничения неравенства в форме 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 может принимать одну или несколько функций печати с помощью аргумента options. Эта функция полезна для визуализации производительности решателя во время выполнения. Функции печати можно выбрать с помощью 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около- 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.