Выходная функция роя частицы

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

Выходная функция выполняется после каждой итерации решателя. Для получения дополнительной информации синтаксиса, и для доступных данных к выходной функции, смотрите particleswarm страницы с описанием опций.

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

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

Скопируйте следующий код в файл с именем pswplotranges.m на вашем пути MATLAB®. Кодовые наборы nplot подграфики, где nplot количество размерностей в проблеме.

function stop = pswplotranges(optimValues,state)

stop = false; % This function does not stop the solver
switch state
    case 'init'
        nplot = size(optimValues.swarm,2); % Number of dimensions
        for i = 1:nplot % Set up axes for plot
            subplot(nplot,1,i);
            tag = sprintf('psoplotrange_var_%g',i); % Set a tag for the subplot
            semilogy(optimValues.iteration,0,'-k','Tag',tag); % Log-scaled plot
            ylabel(num2str(i))
        end
        xlabel('Iteration','interp','none'); % Iteration number at the bottom
        subplot(nplot,1,1) % Title at the top
        title('Log range of particles by component')
        setappdata(gcf,'t0',tic); % Set up a timer to plot only when needed
    case 'iter'
        nplot = size(optimValues.swarm,2); % Number of dimensions
        for i = 1:nplot
            subplot(nplot,1,i);
            % Calculate the range of the particles at dimension i
            irange = max(optimValues.swarm(:,i)) - min(optimValues.swarm(:,i));
            tag = sprintf('psoplotrange_var_%g',i);
            plotHandle = findobj(get(gca,'Children'),'Tag',tag); % Get the subplot
            xdata = plotHandle.XData; % Get the X data from the plot
            newX = [xdata optimValues.iteration]; % Add the new iteration
            plotHandle.XData = newX; % Put the X data into the plot
            ydata = plotHandle.YData; % Get the Y data from the plot
            newY = [ydata irange]; % Add the new value
            plotHandle.YData = newY; % Put the Y data into the plot
        end
        if toc(getappdata(gcf,'t0')) > 1/30 % If 1/30 s has passed
          drawnow % Show the plot
          setappdata(gcf,'t0',tic); % Reset the timer
        end
    case 'done'
        % No cleanup necessary
end

Целевая функция

multirosenbrock функция является обобщением функции Розенброка к любому четному числу размерностей. Это имеет глобальный минимум 0 в точке [1,1,1,1,...].

function F = multirosenbrock(x)
% This function is a multidimensional generalization of Rosenbrock's
% function. It operates in a vectorized manner, assuming that x is a matrix
% whose rows are the individuals.

% Copyright 2014 by The MathWorks, Inc.

N = size(x,2); % assumes x is a row vector or 2-D matrix
if mod(N,2) % if N is odd
    error('Input rows must have an even number of elements')
end

odds  = 1:2:N-1;
evens = 2:2:N;
F = zeros(size(x));
F(:,odds)  = 1-x(:,odds);
F(:,evens) = 10*(x(:,evens)-x(:,odds).^2);
F = sum(F.^2,2);

Настройте и запущенная проблема

Установите multirosenbrock функционируйте как целевую функцию. Пользователь четыре переменные. Установите нижнюю границу -10 и верхняя граница 10 на каждой переменной.

fun = @multirosenbrock;
nvar = 4; % A 4-D problem
lb = -10*ones(nvar,1); % Bounds to help the solver converge
ub = -lb;

Установите опции использовать выходную функцию.

options = optimoptions(@particleswarm,'OutputFcn',@pswplotranges);

Установите генератор случайных чисел получать восстанавливаемый выход. Затем вызовите решатель.

rng default % For reproducibility
[x,fval,eflag] = particleswarm(fun,nvar,lb,ub,options)
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.

x =

    0.9964    0.9930    0.9835    0.9681


fval =

   3.4935e-04


eflag =

     1

Результаты

Решатель возвратил точку около оптимального [1,1,1,1]. Но промежуток роя не сходился, чтобы обнулить.

Похожие темы