exponenta event banner

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

В этом примере показано, как оптимизировать использование 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.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. output.hybridflag поле показывает, что fmincon останавливается с флагом выхода 1, указывающим, что x является истинным локальным минимумом.

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