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

simple_fitness функциональный файл реализует функцию Розенброка.
type simple_fitnessfunction 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
x возвращается решателем является лучшей точкой в конечной совокупности, вычисленной ga. fval - значение функции simple_fitness оценено в точке x. ga не нашел особенно хорошего решения. Способы улучшения решения см. в разделе Эффекты параметров генетических алгоритмов.
Иногда ваша функция фитнеса имеет дополнительные параметры, которые действуют как константы во время оптимизации. Например, обобщенная функция Розенброка может иметь дополнительные параметры, представляющие константы 100 и 1:
(b-x1) 2.
a и b - параметры фитнес-функции, которые действуют как константы во время оптимизации (они не изменяются как часть минимизации). parameterized_fitness.m файл реализует эту параметризованную функцию фитнеса.
type parameterized_fitnessfunction 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_fitnessfunction 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.
В этом случае улучшение векторизацией не было большим, потому что вычисление функции фитнеса занимает очень мало времени. Однако для более трудоемких фитнес-функций векторизация может быть полезной. См. раздел Векторизация фитнес-функции.