В этом примере показано, как выполнить многоцелевую оптимизацию с помощью многоцелевой функции генетического алгоритма 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, i.e., 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.