Одним из важнейших факторов, определяющих производительность выполняемого генетического алгоритма, является разнообразие популяции. Если среднее расстояние между особями велико, разнообразие велико; если среднее расстояние невелико, разнесение является низким. Получение нужного количества разнообразия является вопросом проб и ошибок. Если разнообразие слишком высокое или слишком низкое, генетический алгоритм может работать плохо.
В этом разделе объясняется, как контролировать разнообразие путем установки начального диапазона населения. Установка величины мутации описывает, как величина мутации влияет на разнообразие.
В этом разделе также объясняется, как установить размер населения.
По умолчанию ga создает случайное начальное заполнение с помощью функции создания. Можно указать диапазон векторов в начальной совокупности в InitialPopulationRange вариант.
Примечание.Начальный диапазон ограничивает диапазон точек в начальной совокупности, указывая нижнюю и верхнюю границы. Последующие поколения могут содержать точки, записи которых не лежат в начальном диапазоне. Установите верхние и нижние границы для всех поколений с помощью lb и ub входные аргументы.
Если вы знаете приблизительно, где находится решение проблемы, укажите начальный диапазон, чтобы он содержал ваше предположение для решения. Однако генетический алгоритм может найти решение, даже если оно не лежит в начальном диапазоне, если популяция обладает достаточным разнообразием.
В этом примере показано, как начальный диапазон влияет на производительность генетического алгоритма. В примере используется функция Растригина, описанная в разделе Минимизировать функцию Растригина. Минимальное значение функции равно 0, что происходит в начале координат.
rng(1) % For reproducibility fun = @rastriginsfcn; nvar = 2; options = optimoptions('ga','PlotFcn',{'gaplotbestf','gaplotdistance'},... 'InitialPopulationRange',[1;1.1]); [x,fval] = ga(fun,nvar,[],[],[],[],[],[],[],options)
Optimization terminated: average change in the fitness value less than options.FunctionTolerance.

x = 1×2
0.9942 0.9950
fval = 1.9900
Верхний график, который показывает лучший фитнес в каждом поколении, показывает небольшой прогресс в снижении значения фитнеса. На нижнем графике показано среднее расстояние между особями у каждого поколения, что является хорошей мерой разнообразия популяции. Для этой установки начального диапазона слишком мало разнесения, чтобы алгоритм мог прогрессировать.
Затем попробуйте установить InitialPopulationRange на [1; 100]. На этот раз результаты являются более переменными. Текущая настройка случайных чисел приводит к довольно типичному результату.
options.InitialPopulationRange = [1;100]; [x,fval] = ga(fun,nvar,[],[],[],[],[],[],[],options)
Optimization terminated: average change in the fitness value less than options.FunctionTolerance.

x = 1×2
0.9344 -1.0792
fval = 4.0889
На этот раз генетический алгоритм прогрессирует, но поскольку среднее расстояние между индивидуумами так велико, лучшие индивидуумы далеки от оптимального решения.
Теперь установите InitialPopulationRange на [1; 2]. Этот параметр хорошо подходит для этой проблемы.
options.InitialPopulationRange = [1;2]; [x,fval] = ga(fun,nvar,[],[],[],[],[],[],[],options)
Optimization terminated: average change in the fitness value less than options.FunctionTolerance.

x = 1×2
0.0013 0.0020
fval = 0.0011
Подходящее разнообразие обычно вызывает ga вернуть лучший результат, чем в двух предыдущих случаях.
gaВ этом примере показано, как @gacreationlinearfeasible, функция создания по умолчанию для проблем с линейным ограничением, создает заполнение для ga. Население хорошо рассредоточено и склонно лежать на границах ограничения. В примере используется пользовательская функция печати.
Фитнес-функция
Фитнес функция lincontest6, входит в состав вашего программного обеспечения. Это квадратичная функция двух переменных:

Пользовательская функция печати
Сохраните следующий код в файле в пути MATLAB ® gaplotshowpopulation2.
function state = gaplotshowpopulation2(~,state,flag,fcn) %gaplotshowpopulation2 Plots the population and linear constraints in 2-d. % STATE = gaplotshowpopulation2(OPTIONS,STATE,FLAG) plots the population % in two dimensions. % % Example: % fun = @lincontest6; % options = gaoptimset('PlotFcn',{{@gaplotshowpopulation2,fun}}); % [x,fval,exitflag] = ga(fun,2,A,b,[],[],lb,[],[],options); % This plot function works in 2-d only if size(state.Population,2) > 2 return; end if nargin < 4 fcn = []; end % Dimensions to plot dimensionsToPlot = [1 2]; switch flag % Plot initialization case 'init' pop = state.Population(:,dimensionsToPlot); plotHandle = plot(pop(:,1),pop(:,2),'*'); set(plotHandle,'Tag','gaplotshowpopulation2') title('Population plot in two dimension','interp','none') xlabelStr = sprintf('%s %s','Variable ', num2str(dimensionsToPlot(1))); ylabelStr = sprintf('%s %s','Variable ', num2str(dimensionsToPlot(2))); xlabel(xlabelStr,'interp','none'); ylabel(ylabelStr,'interp','none'); hold on; % plot the inequalities plot([0 1.5],[2 0.5],'m-.') % x1 + x2 <= 2 plot([0 1.5],[1 3.5/2],'m-.'); % -x1 + 2*x2 <= 2 plot([0 1.5],[3 0],'m-.'); % 2*x1 + x2 <= 3 % plot lower bounds plot([0 0], [0 2],'m-.'); % lb = [ 0 0]; plot([0 1.5], [0 0],'m-.'); % lb = [ 0 0]; set(gca,'xlim',[-0.7,2.2]) set(gca,'ylim',[-0.7,2.7]) axx = gcf; % Contour plot the objective function if ~isempty(fcn) range = [-0.5,2;-0.5,2]; pts = 100; span = diff(range')/(pts - 1); x = range(1,1): span(1) : range(1,2); y = range(2,1): span(2) : range(2,2); pop = zeros(pts * pts,2); values = zeros(pts,1); k = 1; for i = 1:pts for j = 1:pts pop(k,:) = [x(i),y(j)]; values(k) = fcn(pop(k,:)); k = k + 1; end end values = reshape(values,pts,pts); contour(x,y,values); colorbar end % Show the initial population ax = gca; fig = figure; copyobj(ax,fig);colorbar % Pause for three seconds to view the initial plot, then resume figure(axx) pause(3); case 'iter' pop = state.Population(:,dimensionsToPlot); plotHandle = findobj(get(gca,'Children'),'Tag','gaplotshowpopulation2'); set(plotHandle,'Xdata',pop(:,1),'Ydata',pop(:,2)); end
Пользовательская функция графика строит графики линий, представляющих линейные неравенства и связанные ограничения, строит графики кривых уровня фитнес-функции и строит графики совокупности по мере ее развития. Эта функция графика предполагает наличие не только обычных входных данных (options,state,flag), а также дескриптор функции для функции фитнеса, @lincontest6 в этом примере. Для создания кривых уровня пользовательской функции графика требуется функция фитнеса.
Ограничения проблемы
Включить границы и линейные зависимости.
A = [1,1;-1,2;2,1]; b = [2;2;3]; lb = zeros(2,1);
Опции для включения функции печати
Задание опций для включения функции печати при ga бежит.
options = optimoptions('ga','PlotFcns',... {{@gaplotshowpopulation2,@lincontest6}});
Выполнение задачи и наблюдение за численностью населения
Начальное заполнение на первом графике содержит множество элементов на границах линейной зависимости. Население достаточно хорошо рассредоточено.
rng default % for reproducibility [x,fval] = ga(@lincontest6,2,A,b,[],[],lb,[],[],options);
Optimization terminated: average change in the fitness value less than options.FunctionTolerance.


ga быстро сходится к одной точке, решение.
Поле Размер населения в параметрах Население определяет размер населения в каждом поколении. Увеличение размера популяции позволяет генетическому алгоритму искать больше точек и тем самым получать лучший результат. Тем не менее, чем больше размер популяции, тем дольше генетический алгоритм вычисляет каждое поколение.
Примечание
Необходимо задать для параметра «Размер совокупности» значение не ниже значения параметра «Количество переменных», чтобы отдельные элементы в каждой популяции охватывали искомое пространство.
Можно поэкспериментировать с различными настройками размера совокупности, которые возвращают хорошие результаты, не затрачивая слишком много времени на выполнение.