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

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

Смотрите передающие дополнительные параметры (Optimization Toolbox).

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

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

Изменить файл функции 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.154365 seconds. No vectorization took 0.220625 seconds.

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