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

Этот пример показывает, как оптимизировать использование решателя 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.391079 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.762698 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.

Похожие темы