Die Partikelschwarmoptimierung (PSO) ist eine Art von Gruppenintelligenz, die vom Verhalten einer Gruppe von Tieren inspiriert ist. In diesem Artikel werde ich ein einfaches Beispiel für die Methode zur Partikelgruppenoptimierung vorstellen.
Die parabolische Gleichung wird in der folgenden Form angegeben.
\begin{aligned}
z = x^2+y^2
\end{aligned}
Offensichtlich ist der Mindestwert $ z = 0 $, wenn $ (x, y) = (0, 0) $. Dies wird unter Verwendung der Partikelgruppenoptimierungsmethode erhalten.
Siehe den folgenden Artikel. (Ist der Index in §2 teilweise falsch?) Partikelgruppenoptimierung und nichtlineares System
Lassen Sie uns §2 dieses Artikels implementieren.
main.py
# -*- coding: utf-8 -*-
import numpy as np
import random
#Bewertungsfunktion: z = x^2 + y^2
def criterion(x, y):
    z = x * x + y * y
    return z
#Eine Funktion, die die Position von Partikeln aktualisiert
def update_position(x, y, vx, vy):
    new_x = x + vx
    new_y = y + vy
    return new_x, new_y
#Eine Funktion, die die Geschwindigkeit von Partikeln aktualisiert
def update_velocity(x, y, vx, vy, p, g, w=0.5, ro_max=0.14):
    #Der Parameter ro wird zufällig angegeben
    ro1 = random.uniform(0, ro_max)
    ro2 = random.uniform(0, ro_max)
    #Aktualisieren Sie die Partikelgeschwindigkeit
    new_vx = w * vx + ro1 * (p["x"] - x) + ro2 * (g["x"] - x)
    new_vy = w * vy + ro1 * (p["y"] - y) + ro2 * (g["y"] - y)
    return new_vx, new_vy
def main():
    N = 100  #Anzahl der Partikel
    x_min, x_max = -5, 5
    y_min, y_max = -5, 5
    #Partikelposition,Geschwindigkeit,Persönlicher Rekord,Initialisieren Sie das globale Beste
    ps = [{"x": random.uniform(x_min, x_max), 
        "y": random.uniform(y_min, y_max)} for i in range(N)]
    vs = [{"x": 0.0, "y": 0.0} for i in range(N)]
    personal_best_positions = list(ps)
    personal_best_scores = [criterion(p["x"], p["y"]) for p in ps]
    best_particle = np.argmin(personal_best_scores)
    global_best_position = personal_best_positions[best_particle]
    
    T = 30  #Zeitlimit(Anzahl der Schleifen)
    for t in range(T):
        for n in range(N):
            x, y = ps[n]["x"], ps[n]["y"]
            vx, vy = vs[n]["x"], vs[n]["y"]
            p = personal_best_positions[n]
            #Aktualisieren Sie die Position der Partikel
            new_x, new_y = update_position(x, y, vx, vy)
            ps[n] = {"x": new_x, "y": new_y}
            #Aktualisieren Sie die Geschwindigkeit der Partikel
            new_vx, new_vy = update_velocity(
                new_x, new_y, vx, vy, p, global_best_position)
            vs[n] = {"x": new_vx, "y": new_vy}
            #Finden Sie den Bewertungswert,Aktualisieren Sie Ihre persönliche Bestleistung
            score = criterion(new_x, new_y)
            if score < personal_best_scores[n]:
                personal_best_scores[n] = score
                personal_best_positions[n] = {"x": new_x, "y": new_y}
        #Aktualisieren Sie die weltweit besten
        best_particle = np.argmin(personal_best_scores)
        global_best_position = personal_best_positions[best_particle]
    #Optimale Lösung
    print(global_best_position)
    print(min(personal_best_scores))
if __name__ == '__main__':
    main()
Ergebnis
{'y': 0.00390598718159734, 'x': -0.0018420875049243782}
1.86500222386e-05
Es sieht so aus, als ob $ N (= 100) $ Partikel auf $ (x, y) = (0, 0) $ konzentriert sind.

Wie bestimmen Sie einige Parameter wie die Anzahl der Partikel? (Versuch und Irrtum?)
Die Reihenfolge der Positionsaktualisierung, Geschwindigkeitsaktualisierung, persönlichen Bestleistung und globalen Bestleistung ist je nach Literatur nicht in Ordnung ... In diesem Artikel werden wir die Position aktualisieren ⇒ die Geschwindigkeit aktualisieren ⇒ die persönliche Bestzeit aktualisieren ⇒ die globale Bestzeit aktualisieren.