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