exponenta event banner

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

В этом примере показано, как создать и минимизировать функцию пригодности для решателя генетических алгоритмов 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

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

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

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

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

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

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

a и b - параметры фитнес-функции, которые действуют как константы во время оптимизации (они не изменяются как часть минимизации). 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.

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

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