Выполнение многоцелевой оптимизации Используя генетический алгоритм

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

Похожие темы