
Continuamos estudiando los métodos de optimización multidimensional, y el siguiente en la línea es el método de enjambre de partículas, que busca un mínimo global.
Teoría
El algoritmo es bastante simple:

La posición de cada partícula en un momento determinado se calcula mediante la fórmula:
Vi,t+1=AcVi,t+Cprp(pi−xi,t)+Cgrg(gi−xi,t)
xi,t+1=xi,t+Vi,t+1
Donde pi - coordenada de la mejor solución para una partícula particular, gi - la coordenada de la mejor solución para todas las partículas para esta era, Cp y Cg - factores de ponderación (seleccionados para un modelo específico), Ac Es el coeficiente de inercia, puede hacerse dependiente del número de una era, luego las velocidades de las partículas cambiarán suavemente.
Funciones de prueba
Dado que es muy agradable ver el trabajo del método, obtendremos más funciones de prueba:
Escondidoparabol(x) = sum(u->u*u, x)
Y, de hecho, el propio MRC:
function mdpso(; nparts = 50, ndimes = 2, ages = 50,
Sin embargo, con los dibujos, el cálculo lleva más tiempo, pero es más bonito:
using Plots pyplot() function ploter(l, u, xy, z, n_age ) contour(Xs, Ys, Zs, fill = true);

mdpso(C1 = [1.2 1.2], C2 = [1.1 1.1], Ac = [0.08 0.08], lower = [-4 -4], upper = [4 4], ages = 30)

fun = ekly mdpso(C1 = [1.7 1.7], C2 = [1.7 1.7], Ac = [0.07 0.07], lower = [-5 -5], upper = [5 5], ages = 15)


fun = himmelblau mdpso(C1 = [1.1 1.1], C2 = [1.0 1.0], Ac = [0.09 0.09], lower = [-5 -5], upper = [5 5], ages = 20, parts = 50)


fun = holdertable mdpso(C1 = [1.1 1.1], C2 = [1.0 1.0], Ac = [0.09 0.09], lower = [-10 -10], upper = [10 10], ages = 20, parts = 50)


fun = levy13 mdpso(C1 = [1.1 1.1], C2 = [1.0 1.0], Ac = [0.09 0.09], lower = [-10 -10], upper = [10 10], ages = 20, parts = 50)


fun = shaffer4 mdpso(C1 = [1.1 1.1], C2 = [1.0 1.0], Ac = [0.09 0.09], lower = [-100 -100], upper = [100 100], ages = 20, parts = 50)


Lo que realmente deprime es preocuparse por los parámetros y un elemento de aleatoriedad: si una partícula no vuela cerca del mínimo global, entonces todo esto puede caer en uno local:
fun = rastrigin mdpso(mdpso(C1 = [0.1 0.1], C2 = [1 1], Ac = [0.08 0.08], lover = low, upper = up, ages = 30))


Si y viejo no muy bueno Rosenbrock todavía no permite comprenderse a sí mismo:
fun = rosenbrok mdpso(C1 = [1.7 1.7], C2 = [1.5 1.5], Ac = [0.15 0.15], lover = low, upper = up, ages = 20, nparts = 50) ... Age № 20 xbest: 0.37796421341886866 0.12799160066705667 Fmin: 0.409026370833564


Pero como dije antes, puede usar el FDM para encontrar una buena aproximación al mínimo global y luego especificar, por ejemplo, Nelder-Mead:
Método simplex vecl(x) = sqrt( sum(u -> u*u, x) ) function sortcoord(Mx) N = size(Mx,2) f = [fun(Mx[:,i]) for i in 1:N]
ofNelderMid(fit = [0.37796 0.127992]) ... 92 0.00022610400555036366 [1.0, 1.0] 93 0.00015987967588703512 [1.0, 1.0] 94 0.00011305200343052599 [1.0, 1.0] 2-element Array{Float64,1}: 0.9999999996645973 0.9999999995466575
Para el MFC clásico, no todo está claro con el criterio de detención: el mejor punto puede mantener la posición de varias eras, las distancias entre algunas partículas tampoco pueden cambiar durante mucho tiempo. Por lo tanto, se usa un límite en el número de eras. Para aumentar las posibilidades de encontrar un mínimo global, es necesario aumentar el número de partículas y épocas, lo cual es muy costoso en términos de memoria y, especialmente, tiempo (No es broma, 50 llamadas de la función objetivo para cada dimensión en cada iteración).
Moraleja
- Si no quiere o no puede usar métodos complejos y modernos, puede usar composiciones de métodos más simples
- Muy a menudo para un problema hay un método estrechamente afilado (por ejemplo, para funciones de barranco)
- Es aconsejable tener varios MO diferentes a la mano para una comparación consistente.
- No siempre es posible poner su tarea en el método y obtener la respuesta correcta de inmediato: debe pasar tiempo investigando, variando los parámetros, si no puede ver el alivio, al menos debe imprimir los cálculos intermedios para rastrear la convergencia.
Eso es todo por hoy, ¡gracias por su atención y les deseo a todos una buena optimización!