Кодирование и минимизация функции соответствия с помощью генетического алгоритма

Этот пример показывает, как создать и минимизировать функцию соответствия для решателя генетического алгоритма ga используя три метода:

  • Основной

  • Включая дополнительные параметры

  • Векторизовано для скорости

Базовая функция соответствия

Основной функцией соответствия является функция Розенбрка, общая тестовая функция для оптимизаторов. Функция является суммой квадратов:

f(x)=100(x12-x2)2+(1-x1)2.

Функция имеет минимальное значение нуля в точке [1,1]. Поскольку функция Розенброка довольно крутая, постройте график логарифма единицы плюс функция.

fsurf(@(x,y)log(1 + 100*(x.^2 - y).^2 + (1 - x).^2),[0,2])
title('log(1 + 100*(x(1)^2 - x(2))^2 + (1 - x(1))^2)')
view(-13,78)
hold on
h1 = plot3(1,1,0.1,'r*','MarkerSize',12);
legend(h1,'Minimum','Location','best');
hold off

Код функции фитнеса

The simple_fitness файл функции реализует функцию Розенбрка.

type simple_fitness
function y = simple_fitness(x)
%SIMPLE_FITNESS fitness function for GA

%   Copyright 2004 The MathWorks, Inc. 

  y = 100 * (x(1)^2 - x(2)) ^2 + (1 - x(1))^2;

Функция соответствия должна взять один вход x где x - вектор-строка с таким количеством элементов, как количество переменных в задаче. Функция соответствия вычисляет значение функции и возвращает это скалярное значение в своем одном возвращаемом аргументе y.

Минимизируйте использование ga

Чтобы минимизировать функцию соответствия с помощью ga, передайте указатель на функцию в функцию соответствия, а также количество переменных в задаче. Иметь ga исследуйте соответствующую область, включите ограничения -3 <= x(i) <= 3. Передайте границы как пятый и шестой аргументы после numberOfVariables. Для ga подробные сведения о синтаксисе см. в ga.

ga является случайным алгоритмом. Для повторяемости установите поток случайных чисел.

rng default % For reproducibility
FitnessFunction = @simple_fitness;
numberOfVariables = 2;
lb = [-3,-3];
ub = [3,3];
[x,fval] = ga(FitnessFunction,numberOfVariables,[],[],[],[],lb,ub)
Optimization terminated: maximum number of generations exceeded.
x = 1×2

    1.5083    2.2781

fval = 0.2594

The x возвращенная решателем - лучшая точка в итоговом населении, вычисляемой ga. The fval - значение функции simple_fitness вычисляется в точке x. ga не нашел особенно хорошего решения. Для способов улучшить решение, смотрите Эффекты опций генетического алгоритма.

Функция фитнеса с дополнительными параметрами

Иногда ваша функция соответствия имеет дополнительные параметры, которые действуют как константы во время оптимизации. Для примера обобщенная функция Розенбрка может иметь дополнительные параметры, представляющие константы 100 и 1:

f(x,a,b)=a(x12-x2)2+(b-x1)2.

a и b являются параметрами функции соответствия, которые действуют как константы во время оптимизации (они не варьируются как часть минимизации). The parameterized_fitness.m файл реализует эту параметризованную функцию соответствия.

type parameterized_fitness
function y = parameterized_fitness(x,p1,p2)
%PARAMETERIZED_FITNESS fitness function for GA

%   Copyright 2004 The MathWorks, Inc.        
 
y = p1 * (x(1)^2 - x(2)) ^2 + (p2 - x(1))^2;

Минимизируйте использование дополнительных параметров

Используйте анонимную функцию, чтобы захватить значения дополнительных аргументов, а именно константы a и b. Создайте указатель на функцию FitnessFunction анонимной функции, которая принимает один вход x, и вызовы parameterized_fitness с x, a, и b. Анонимная функция содержит значения a и b, которые существуют при создании указателя на функцию.

a = 100;
b = 1; % define constant values
FitnessFunction = @(x) parameterized_fitness(x,a,b);
[x,fval] = ga(FitnessFunction,numberOfVariables,[],[],[],[],lb,ub)
Optimization terminated: maximum number of generations exceeded.
x = 1×2

    1.3198    1.7434

fval = 0.1025

См. «Передача дополнительных параметров».

Векторизованная функция соответствия

Чтобы увеличить скорость, векторизируйте функцию соответствия. Векторизованная функция соответствия вычисляет соответствие набора точек сразу, что обычно экономит время на оценке этих точек индивидуально. Чтобы записать векторизованную функцию соответствия, пусть ваша функция принимает матрицу, где каждая строка матрицы представляет одну точку, и имеет функцию соответствия, возвращающую вектор-столбец с значениями функций соответствия.

Как изменить parameterized_fitness файл функции в векторизованную форму:

  • Измените каждую переменную x(i) на x(:,i), что означает вектор-столбец переменных, соответствующих x(i).

  • Измените каждое векторное умножение * на .* и каждой степени ^ на .^ указывает, что операции поэлементны. В этом коде нет векторных умножений, поэтому просто измените экспоненты.

type vectorized_fitness
function y = vectorized_fitness(x,p1,p2)
%VECTORIZED_FITNESS fitness function for GA

%   Copyright 2004-2010 The MathWorks, Inc.  

y = p1 * (x(:,1).^2 - x(:,2)).^2 + (p2 - x(:,1)).^2;

Эта векторизованная версия функции соответствия принимает матрицу x с произвольным числом точек, значением и произвольным количеством строк и возвратов вектора-столбца y с одинаковым числом строк, как и x.

Сообщите решателю, что функция соответствия векторизирована в 'UseVectorized' опция.

options = optimoptions(@ga,'UseVectorized',true);

Включите опции в качестве последнего аргумента в ga.

VFitnessFunction = @(x) vectorized_fitness(x,100,1);
[x,fval] = ga(VFitnessFunction,numberOfVariables,[],[],[],[],lb,ub,[],options)
Optimization terminated: maximum number of generations exceeded.
x = 1×2

    1.6219    2.6334

fval = 0.3876

В чем различие в скорости? Время оптимизации как с векторизацией, так и без.

tic
[x,fval] = ga(VFitnessFunction,numberOfVariables,[],[],[],[],lb,ub,[],options);
Optimization terminated: maximum number of generations exceeded.
v = toc;
tic
[x,fval] = ga(FitnessFunction,numberOfVariables,[],[],[],[],lb,ub);
Optimization terminated: maximum number of generations exceeded.
nv = toc;
fprintf('Using vectorization took %f seconds. No vectorization took %f seconds.\n',v,nv)
Using vectorization took 0.153337 seconds. No vectorization took 0.212880 seconds.

В этом случае улучшение путем векторизации не было большим, потому что вычисление функции соответствия занимает очень мало времени. Однако для более длительных функций соответствия векторизация может быть полезной. См. Векторизация функции соответствия.

Похожие темы