Глобальная переменная по сравнению с локальной оптимизацией Используя ga

Поиск глобального минимума

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

Как пример, рассмотрите следующую функцию.

f(x)={-exp(-(x100)2)forx100,-exp(-1)+(x-100)(x-102)forx>100.

Постройте функцию.

t = -10:.1:103;
for ii = 1:length(t)
    y(ii) = two_min(t(ii));
end
plot(t,y)

Figure contains an axes object. The axes object contains an object of type line.

Функция имеет два локальных минимума, один в x = 0, где значение функции –1, и другой в x = 101, где значение функции 1  1/e. Поскольку последнее значение меньше, глобальный минимум происходит в x = 101.

Запустите ga Используя параметры по умолчанию

Код для two_min функция помощника в конце этого примера. Запустите ga параметрами по умолчанию, чтобы минимизировать two_min функция. Используйте gaplot1drange функция помощника (включенный в конце этого примера), чтобы построить область значений ga население в каждой итерации.

rng default % For reproducibility
options = optimoptions('ga','PlotFcn',@gaplot1drange);
[x,fval] = ga(@two_min,1,[],[],[],[],[],[],[],options)
Optimization terminated: average change in the fitness value less than options.FunctionTolerance.

Figure Genetic Algorithm contains an axes object. The axes object with title Range of Population, Mean contains an object of type errorbar.

x = -0.0688
fval = -1.0000

Генетический алгоритм возвращает точку очень близко к локальному минимуму в x = 0. Обратите внимание на то, что все индивидуумы находятся между –60 и 60. Население никогда не исследует точки около глобального минимума в x = 101.

Увеличьте начальную область значений

Один способ заставить генетический алгоритм исследовать более широкую область значений точек — то есть, увеличить разнообразие популяций — состоит в том, чтобы увеличить начальную область значений. Начальная область значений не должна включать точку x = 101, но это должно быть достаточно большим так, чтобы алгоритм сгенерировал индивидуумов рядом x = 101. Установите InitialPopulationRange опция к [-10;90] и повторно запущенный решатель.

options.InitialPopulationRange = [-10;90];
[x,fval] = ga(@two_min,1,[],[],[],[],[],[],[],options)
Optimization terminated: maximum number of generations exceeded.

Figure Genetic Algorithm contains an axes object. The axes object with title Range of Population, Mean contains an object of type errorbar.

x = 100.9783
fval = -1.3674

На этот раз пользовательский график показывает намного более широкую область значений индивидуумов. Существуют индивидуумы около 101 с самого начала, и среднее значение населения начинает сходиться к 101.

Функции помощника

Этот код создает two_min функция помощника.

function y = two_min(x)
if x <= 100
    y = -exp(-(x/100)^2);
else
    y = -exp(-1) + (x-100)*(x-102);
end
end

Этот код создает gaplot1drange функция помощника.

function state = gaplot1drange(options,state,flag)
%gaplot1drange Plots the mean and the range of the population.
%   STATE = gaplot1drange(OPTIONS,STATE,FLAG) plots the mean and the range
%   (highest and the lowest) of individuals (1-D only).  
%
%   Example:
%   Create options that use gaplot1drange
%   as the plot function
%     options = optimoptions('ga','PlotFcn',@gaplot1drange);

%   Copyright 2012-2014 The MathWorks, Inc.

if isinf(options.MaxGenerations) || size(state.Population,2) > 1
    title('Plot Not Available','interp','none');
    return;
end
generation = state.Generation;
score = state.Population;
smean = mean(score);
Y = smean;
L = smean - min(score);
U = max(score) - smean;

switch flag

    case 'init'
        set(gca,'xlim',[1,options.MaxGenerations+1]);
        plotRange = errorbar(generation,Y,L,U);
        set(plotRange,'Tag','gaplot1drange');
        title('Range of Population, Mean','interp','none')
        xlabel('Generation','interp','none')
    case 'iter'
        plotRange = findobj(get(gca,'Children'),'Tag','gaplot1drange');
        newX = [get(plotRange,'Xdata') generation];
        newY = [get(plotRange,'Ydata') Y];
        newL = [get(plotRange,'Ldata') L];
        newU = [get(plotRange,'Udata') U];       
        set(plotRange,'Xdata',newX,'Ydata',newY,'Ldata',newL,'Udata',newU);
end
end

Похожие темы