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