В этом примере показано, как оптимизировать с помощью 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.
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.
disp(output.hybridflag)
1
В то время как гибридная функция улучшила результат, функция построения графика показывает то же окончательное значение, что и ранее. Это потому, что функция построения графика показывает только итерации алгоритма роя частиц, а не вычисления гибридной функции. Гибридная функция привела к тому, что окончательное значение функции было очень близко к истинному минимальному значению 0. The output.hybridflag
поле показывает, что fmincon
останавливается с выходным флагом 1, что указывает на то, что x
является истинным локальным минимумом.