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.