В этом примере показано, как использовать выходную функцию в 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]
. Но промежуток роя не сходился, чтобы обнулить.