Глобальная и локальная оптимизация с использованием 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. The axes contains an object of type line.

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

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

Код для two_min Функция helper находится в конце этого примера. Выполняйте 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. The axes 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. The axes 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

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте