exponenta event banner

Разнообразие населения

Важность разнообразия населения

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

В этом разделе объясняется, как контролировать разнообразие путем установки начального диапазона населения. Установка величины мутации описывает, как величина мутации влияет на разнообразие.

В этом разделе также объясняется, как установить размер населения.

Задать начальный диапазон

По умолчанию 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.

Figure Genetic Algorithm contains 2 axes. Axes 1 with title Best: 1.99002 Mean: 2.1698 contains 2 objects of type line. These objects represent Best fitness, Mean fitness. Axes 2 with title Average Distance Between Individuals contains an object of type line.

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.

Figure Genetic Algorithm contains 2 axes. Axes 1 with title Best: 4.08885 Mean: 2915.48 contains 2 objects of type line. These objects represent Best fitness, Mean fitness. Axes 2 with title Average Distance Between Individuals contains an object of type line.

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.

Figure Genetic Algorithm contains 2 axes. Axes 1 with title Best: 0.00111749 Mean: 5.66579 contains 2 objects of type line. These objects represent Best fitness, Mean fitness. Axes 2 with title Average Distance Between Individuals contains an object of type line.

x = 1×2

    0.0013    0.0020

fval = 0.0011

Подходящее разнообразие обычно вызывает ga вернуть лучший результат, чем в двух предыдущих случаях.

Пользовательская функция печати и линейные зависимости в ga

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

Фитнес-функция

Фитнес функция lincontest6, входит в состав вашего программного обеспечения. Это квадратичная функция двух переменных:

$$f(x) = \frac{x_1^2}{2} + x_2^2 - x_1 x_2 - 2x_1 - 6x_2.$$

Пользовательская функция печати

Сохраните следующий код в файле в пути 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 быстро сходится к одной точке, решение.

Задание размера совокупности

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

Примечание

Необходимо задать для параметра «Размер совокупности» значение не ниже значения параметра «Количество переменных», чтобы отдельные элементы в каждой популяции охватывали искомое пространство.

Можно поэкспериментировать с различными настройками размера совокупности, которые возвращают хорошие результаты, не затрачивая слишком много времени на выполнение.

Связанные темы