exponenta event banner

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

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

Связанные темы