Contenido principal

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

Optimizar mediante el uso de enjambre de partículas

Este ejemplo muestra cómo optimizar utilizando el solucionador particleswarm.

La función objetivo en este ejemplo es la quinta función de De Jong, que está disponible cuando ejecuta este ejemplo.

dejong5fcn

Figure contains an axes object. The axes object contains 2 objects of type surface, contour.

Esta función tiene 25 mínimos locales.

Intente encontrar el mínimo de la función utilizando la configuración predeterminada particleswarm.

fun = @dejong5fcn;
nvars = 2;
rng default % For reproducibility
[x,fval,exitflag] = particleswarm(fun,nvars)
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
x = 1×2

  -31.9521  -16.0176

fval = 
5.9288
exitflag = 
1

¿Es la solución x el óptimo global? No está claro en este momento. Al observar el gráfico de la función se ve que la función tiene mínimos locales para los componentes en el rango [-50,50]. Por lo tanto, restringir el rango de las variables a [-50,50] ayuda al solucionador a localizar un mínimo global.

lb = [-50;-50];
ub = -lb;
[x,fval,exitflag] = particleswarm(fun,nvars,lb,ub)
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
x = 1×2

  -16.0079  -31.9697

fval = 
1.9920
exitflag = 
1

Esto parece prometedor: la nueva solución tiene menos fval que la anterior. Pero ¿es x realmente una solución global? Intente minimizar nuevamente con más partículas, para buscar mejor la región.

options = optimoptions('particleswarm','SwarmSize',100);
[x,fval,exitflag] = 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.
x = 1×2

  -31.9781  -31.9784

fval = 
0.9980
exitflag = 
1

Esto parece aún más prometedor. Pero ¿es esta respuesta una solución global y qué tan precisa es? Vuelva a ejecutar el solucionador con una función híbrida. particleswarm llama a la función híbrida después de que particleswarm finalice sus iteraciones.

options.HybridFcn = @fmincon;
[x,fval,exitflag] = 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.
x = 1×2

  -31.9783  -31.9784

fval = 
0.9980
exitflag = 
1

particleswarm encontró esencialmente la misma solución que antes. Esto le da cierta confianza de que particleswarm informa un mínimo local y que el x final es la solución global.

Consulte también

Temas