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

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

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

Похожие темы