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

В этом примере показано, как оптимизировать с помощью 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.

Количество вычислений функции снова уменьшилось.

Векторизация для скорости

The 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.200988 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.422534 seconds.

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

Функция построения графика

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

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.

Figure particleswarm contains an axes. The axes with title Best Function Value: 0.0797555 contains an object of type line.

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.

Figure particleswarm contains an axes. The axes with title Best Function Value: 0.000424241 contains an object of type line.

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.

Figure particleswarm contains an axes. The axes with title Best Function Value: 0.0797555 contains an object of type line.

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

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

Похожие темы