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

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

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

Похожие темы