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

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