ga
Иногда цель оптимизации состоит в том, чтобы найти глобальный минимум или максимум функции — точка, где значение функции меньше или больше в любой другой точке в пространстве поиска. Однако алгоритмы оптимизации иногда возвращают локальный минимум — точка, где значение функции меньше, чем в соседних точках, но возможно больше, чем в удаленной точке в пространстве поиска. Генетический алгоритм может иногда преодолевать этот дефицит с правильными настройками.
Как пример, рассмотрите следующую функцию.
Постройте функцию.
t = -10:.1:103; for ii = 1:length(t) y(ii) = two_min(t(ii)); end plot(t,y)
Функция имеет два локальных минимума, один в , где значение функции –1, и другой в , где значение функции . Поскольку последнее значение меньше, глобальный минимум происходит в .
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.
x = -0.0688
fval = -1.0000
Генетический алгоритм возвращает точку очень близко к локальному минимуму в . Обратите внимание на то, что все индивидуумы находятся между –60 и 60. Население никогда не исследует точки около глобального минимума в .
Один способ заставить генетический алгоритм исследовать более широкую область значений точек — то есть, увеличить разнообразие популяций — состоит в том, чтобы увеличить начальную область значений. Начальная область значений не должна включать точку 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.
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