
Wir untersuchen weiterhin die Methoden der mehrdimensionalen Optimierung, und die nächste in der Reihe ist die Partikelschwarmmethode, die nach einem globalen Minimum sucht.
Theorie
Der Algorithmus ist ziemlich einfach:

Die Position jedes Partikels zu einem bestimmten Zeitpunkt wird nach folgender Formel berechnet:
Wo - Koordinate der besten Lösung für ein bestimmtes Partikel, - die Koordinate der besten Lösung für alle Partikel für diese Ära, und - Gewichtungsfaktoren (ausgewählt für ein bestimmtes Modell), Ist der Trägheitskoeffizient, kann er von der Anzahl einer Ära abhängig gemacht werden, dann ändern sich die Teilchengeschwindigkeiten reibungslos.
Testfunktionen
Da es sehr schön ist, die Arbeit der Methode zu betrachten, erhalten wir weitere Testfunktionen:
Verstecktparabol(x) = sum(u->u*u, x)
Und in der Tat das MRC selbst:
function mdpso(; nparts = 50, ndimes = 2, ages = 50,
Bei Zeichnungen dauert die Berechnung zwar länger, ist aber schöner:
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)


Was wirklich deprimiert, ist die Aufregung mit Parametern und einem Element der Zufälligkeit: Wenn ein Teilchen nicht in der Nähe des globalen Minimums fliegt, kann das Ganze in ein lokales fallen:
fun = rastrigin mdpso(mdpso(C1 = [0.1 0.1], C2 = [1 1], Ac = [0.08 0.08], lover = low, upper = up, ages = 30))


Ja und alt nicht sehr Der gute Rosenbrock lässt sich immer noch nicht verstehen:
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


Wie ich bereits sagte, können Sie mit dem FDM nach einer guten Annäherung an das globale Minimum suchen und dann beispielsweise Nelder-Mead angeben:
Simplex-Methode 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
Bei der klassischen MFC ist mit dem Stoppkriterium nicht alles klar: Der beste Punkt kann die Position mehrerer Epochen halten, die Abstände zwischen einigen Partikeln können sich auch lange nicht ändern. Daher wird eine Begrenzung der Anzahl von Epochen verwendet. Um die Chancen zu erhöhen, ein globales Minimum zu finden, ist es notwendig, die Anzahl der Partikel und Epochen zu erhöhen, was in Bezug auf Speicher und insbesondere Zeit sehr kostspielig ist (kein Scherz, 50 Aufrufe der Zielfunktion für jede Dimension bei jeder Iteration).
Moral
- Wenn Sie keine komplexen und modernen Methoden verwenden möchten oder können, können Sie einfachere Methodenkompositionen verwenden
- Sehr oft gibt es für ein Problem eine eng geschärfte Methode (zum Beispiel für Schluchtfunktionen)
- Für einen konsistenten Vergleich ist es ratsam, mehrere verschiedene MOs zur Hand zu haben
- Es ist nicht immer möglich, Ihre Aufgabe in die Methode zu integrieren und sofort die richtige Antwort zu erhalten. Sie sollten Zeit mit Nachforschungen verbringen und die Parameter variieren. Wenn Sie das Relief nicht sehen können, sollten Sie zumindest die Zwischenberechnungen ausdrucken, um die Konvergenz zu verfolgen.
Das ist alles für heute, danke für Ihre Aufmerksamkeit und wünsche Ihnen allen eine gute Optimierung!