Этот пример показывает, как создать и минимизировать функцию соответствия для решателя генетического алгоритма ga
используя три метода:
Основной
Включая дополнительные параметры
Векторизовано для скорости
Основной функцией соответствия является функция Розенбрка, общая тестовая функция для оптимизаторов. Функция является суммой квадратов:
Функция имеет минимальное значение нуля в точке [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:
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.
В этом случае улучшение путем векторизации не было большим, потому что вычисление функции соответствия занимает очень мало времени. Однако для более длительных функций соответствия векторизация может быть полезной. См. Векторизация функции соответствия.