Настройте процесс оптимизации роя частицы

В этом примере показано, как оптимизировать использование particleswarm решатель. Алгоритм роя частицы перемещается, население частиц вызвало рой к минимуму целевой функции. Скорость каждой частицы в рое изменяется согласно трем факторам:

  • Эффект инерции (InertiaRange опция)

  • Привлекательность к лучшему расположению частица посетила (SelfAdjustmentWeight опция)

  • Привлекательность к лучшему расположению среди соседних частиц (SocialAdjustmentWeight опция)

Этот пример показывает некоторые эффекты изменяющихся опций роя частицы.

Когда изменить опции

Часто, particleswarm находит хорошее решение при использовании его опций по умолчанию. Например, это оптимизирует rastriginsfcn хорошо с опциями по умолчанию. Эта функция имеет много локальных минимумов и глобальный минимум 0 в точке [0,0].

rng default % for reproducibility
[x,fval,exitflag,output] = particleswarm(@rastriginsfcn,2);
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
formatstring = 'particleswarm reached the value %f using %d function evaluations.\n';
fprintf(formatstring,fval,output.funccount)
particleswarm reached the value 0.000000 using 2560 function evaluations.

Для этой функции вы знаете оптимальное объективное значение, таким образом, вы знаете, что решатель нашел его. Но что, если вы не знаете решения? Один способ оценить качество решения состоит в том, чтобы повторно запустить решатель.

[x,fval,exitflag,output] = particleswarm(@rastriginsfcn,2);
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
fprintf(formatstring,fval,output.funccount)
particleswarm reached the value 0.000000 using 1480 function evaluations.

И решение и количество вычислений функции похожи на предыдущий запуск. Это предполагает, что решатель не испытывает затруднения, находя решение.

Трудная целевая функция Используя параметры по умолчанию

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

rng default % for reproducibility
nvars = 6; % choose any even value for nvars
fun = @multirosenbrock;
[x,fval,exitflag,output] = particleswarm(fun,nvars);
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
fprintf(formatstring,fval,output.funccount)
particleswarm reached the value 3106.436648 using 12960 function evaluations.

Решатель не нашел очень хорошее решение.

Связанный пространство поиска

Попытайтесь ограничить пробел, чтобы помочь решателю определить местоположение положительной стороны.

lb = -10*ones(1,nvars);
ub = -lb;
[xbounded,fvalbounded,exitflagbounded,outputbounded] = particleswarm(fun,nvars,lb,ub);
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
fprintf(formatstring,fvalbounded,outputbounded.funccount)
particleswarm reached the value 0.000006 using 71160 function evaluations.

Решатель нашел намного лучшее решение. Но это взяло очень большое количество вычислений функции, чтобы сделать так.

Измените опции

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

options = optimoptions('particleswarm','MinNeighborsFraction',1);
[xn,fvaln,exitflagn,outputn] = particleswarm(fun,nvars,lb,ub,options);
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
fprintf(formatstring,fvaln,outputn.funccount)
particleswarm reached the value 0.000462 using 30180 function evaluations.

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

Возможно, необходимо повысить SelfAdjustmentWeight опция.

options.SelfAdjustmentWeight = 1.9;
[xn2,fvaln2,exitflagn2,outputn2] = particleswarm(fun,nvars,lb,ub,options);
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
fprintf(formatstring,fvaln2,outputn2.funccount)
particleswarm reached the value 0.000074 using 18780 function evaluations.

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

[xn3,fvaln3,exitflagn3,outputn3] = particleswarm(fun,nvars,lb,ub,options);
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
fprintf(formatstring,fvaln3,outputn3.funccount)
particleswarm reached the value 0.157026 using 53040 function evaluations.

На этот раз количество увеличенных вычислений функции. По-видимому, этот SelfAdjustmentWeight установка не обязательно улучшает производительность.

Обеспечьте начальную точку

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

x0 = zeros(20,6); % set 20 individuals as row vectors
options.InitialSwarmMatrix = x0; % the rest of the swarm is random
[xn3,fvaln3,exitflagn3,outputn3] = particleswarm(fun,nvars,lb,ub,options);
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
fprintf(formatstring,fvaln3,outputn3.funccount)
particleswarm reached the value 0.039015 using 32100 function evaluations.

Число вычислений функции сокращено снова.

Векторизуйте для скорости

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

rng default % do a fair comparison
options.UseVectorized = true;
tic
[xv,fvalv,exitflagv,outputv] = particleswarm(fun,nvars,lb,ub,options);
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
toc
Elapsed time is 0.282957 seconds.
options.UseVectorized = false;
rng default
tic
[xnv,fvalnv,exitflagnv,outputnv] = particleswarm(fun,nvars,lb,ub,options);
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
toc
Elapsed time is 0.672411 seconds.

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

Функция plot

Можно просмотреть прогресс решателя с помощью функции построения графика.

options = optimoptions(options,'PlotFcn',@pswplotbestf);
rng default
[x,fval,exitflag,output] = particleswarm(fun,nvars,lb,ub,options);
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.

fprintf(formatstring,fval,output.funccount)
particleswarm reached the value 0.079755 using 24960 function evaluations.

Используйте больше частиц

Часто, использование большего количества частиц получает более точное решение.

rng default
options.SwarmSize = 200;
[x,fval,exitflag,output] = particleswarm(fun,nvars,lb,ub,options);
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.

fprintf(formatstring,fval,output.funccount)
particleswarm reached the value 0.000424 using 169400 function evaluations.

Гибридная функция

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

rng default
options.HybridFcn = @fmincon;
options.SwarmSize = 60;
[x,fval,exitflag,output] = particleswarm(fun,nvars,lb,ub,options);
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.

fprintf(formatstring,fval,output.funccount)
particleswarm reached the value 0.000000 using 25191 function evaluations.

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

Похожие темы