
Nous continuons d' étudier les méthodes d'optimisation multidimensionnelle, et la prochaine en ligne est la méthode de l'essaim de particules, qui recherche un minimum global.
Théorie
L'algorithme est assez simple:

La position de chaque particule à un certain moment est calculée par la formule:
O Where - coordonnées de la meilleure solution pour une particule particulière, - les coordonnées de la meilleure solution pour toutes les particules de cette époque, et - facteurs de pondération (sélectionnés pour un modèle spécifique), Est le coefficient d'inertie, il peut être rendu dépendant du nombre d'une époque, puis les vitesses des particules changeront en douceur.
Fonctions de test
Puisqu'il est très agréable de regarder le travail de la méthode, nous aurons plus de fonctions de test:
Nichéparabol(x) = sum(u->u*u, x)
Et, en fait, la MRC elle-même:
function mdpso(; nparts = 50, ndimes = 2, ages = 50,
Avec les dessins, cependant, le calcul prend plus de temps, mais il est plus joli:
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)


Ce qui déprime vraiment, ce sont les paramètres et un élément aléatoire: si une particule ne vole pas près du minimum global, alors tout cela peut tomber en local:
fun = rastrigin mdpso(mdpso(C1 = [0.1 0.1], C2 = [1 1], Ac = [0.08 0.08], lover = low, upper = up, ages = 30))


Oui et vieux pas très bon Rosenbrock ne permet toujours pas de se comprendre:
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


Mais comme je l'ai dit plus tôt, vous pouvez utiliser le FDM pour rechercher une bonne approximation du minimum global, puis spécifier, par exemple, Nelder-Mead:
Méthode 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
Pour le MFC classique, tout n'est pas clair avec le critère d'arrêt: le meilleur point peut tenir la position de plusieurs époques, les distances entre certaines particules ne peuvent pas non plus changer longtemps. Par conséquent, une limite sur le nombre d'époques est utilisée. Pour augmenter les chances de trouver un minimum global, il faut augmenter le nombre de particules et d'époques, ce qui est très coûteux en mémoire et, en plus, en temps (pas de blague, 50 appels de la fonction objectif pour chaque dimension à chaque itération).
Moral
- Si vous ne voulez pas ou ne pouvez pas utiliser des méthodes complexes et modernes, vous pouvez utiliser des compositions de méthodes plus simples
- Très souvent, pour un problème, il existe une méthode étroitement affûtée (par exemple, pour les fonctions de ravin)
- Il est conseillé d'avoir plusieurs OM différents sous la main pour une comparaison cohérente
- Il n'est pas toujours possible de mettre votre tâche dans la méthode et d'obtenir la bonne réponse tout de suite - vous devriez passer du temps à rechercher, à varier les paramètres, si vous ne pouvez pas voir le relief, vous devez au moins imprimer les calculs intermédiaires afin de suivre la convergence.
C'est tout pour aujourd'hui, merci de votre attention et je vous souhaite à tous une bonne optimisation!