[PYTHON] Ermitteln Sie den Mindestwert der Funktion mithilfe der Partikelgruppenoptimierungsmethode (PSO).

Überblick

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.

Probe

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.

Erklärung der Partikelgruppenoptimierungsmethode

Siehe den folgenden Artikel. (Ist der Index in §2 teilweise falsch?) Partikelgruppenoptimierung und nichtlineares System

Lassen Sie uns §2 dieses Artikels implementieren.

Quellcode

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

Ergebnis


{'y': 0.00390598718159734, 'x': -0.0018420875049243782}
1.86500222386e-05

Visualisierung

Es sieht so aus, als ob $ N (= 100) $ Partikel auf $ (x, y) = (0, 0) $ konzentriert sind. B2psHNqCMAAIXcf.png

Andere

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.

Verlauf bearbeiten

Recommended Posts

Ermitteln Sie den Mindestwert der Funktion mithilfe der Partikelgruppenoptimierungsmethode (PSO).
Suchen Sie den Index des Maximalwerts (Minimalwerts) eines mehrdimensionalen Arrays
Finden Sie den optimalen Wert der Funktion mit einem genetischen Algorithmus (Teil 2)
Informationen zu Parametern der Partikelgruppenoptimierung (PSO)
Ich lernte auch + init, Klasse, die versuchte, den Minimalwert der quadratischen Funktion zu finden, indem sie die Optimierungsmethode (SGD, Momentum, AdaGrad) in Deep Learning selbst machte.
Finden Sie die Definition des Wertes von errno
So ermitteln Sie die Speicheradresse des Pandas-Datenrahmenwerts
Finden Sie den optimalen Wert der Funktion mit einem genetischen Algorithmus (Teil 1)
[Python] Eine einfache Funktion zum Ermitteln der Mittelkoordinaten eines Kreises
Versuchen Sie, das Problem der Funktionsminimierung mithilfe der Partikelgruppenoptimierung zu lösen
Die Hand von "Millijan" durch Kombinationsoptimierung finden
[Circuit x Python] So ermitteln Sie die Übertragungsfunktion eines Schaltkreises mit Lcapy
Holen Sie sich den Aufrufer einer Funktion in Python
[Wissenschaftlich-technische Berechnung von Python] Numerische Berechnung zur Ermittlung des Ableitungswerts (Differential)
Finden Sie die Anzahl der Tage in einem Monat
Finden Sie den Bruchteil des in Python eingegebenen Werts heraus
Minimieren Sie die Anzahl der Polierungen, indem Sie die Kombination optimieren
Beurteilung des Endes von Mahjong durch Kombinationsoptimierung
Suchen Sie nach dem Wert der Instanz in der Liste
Rückgabewert von quit () - Gibt es etwas, das von der "Funktion, die alles beendet" zurückgegeben wird?
Kündigen Sie die Wettervorhersage (Regen usw.) von DM als Teil der Funktion des Bots an
Fügen Sie eine Funktion hinzu, um dem Wetter heute mitzuteilen, dass der Bot locker ist (hergestellt von Python).
Finden Sie die kumulative Verteilungsfunktion durch Sortieren (Python-Version)
○○ Probleme im Fachbereich Mathematik mit Optimierung lösen
#Eine Funktion, die den Zeichencode einer Zeichenfolge zurückgibt
[Linux] [C / C ++] So ermitteln Sie den Wert der Rücksprungadresse einer Funktion und den Funktionsnamen des Aufrufers
Lassen Sie uns die Vorlesung der PyCon JP 2016 durch Kombinationsoptimierung entscheiden
Finden Sie die scheinbare Breite einer Zeichenfolge in Python heraus
Erben Sie die Standardbibliothek, um den Durchschnittswert der Warteschlange zu ermitteln
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
So ermitteln Sie den Skalierungskoeffizienten eines bipolaren Wavelets
Ermitteln Sie den Durchmesser des Diagramms anhand der Suche nach Breitenpriorität (Python-Speicher).
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Extrahieren Sie den Wert von dict oder list als Zeichenfolge
Finden Sie die Eigenwerte einer reellen symmetrischen Matrix in Python
Beweisen wir den Additionssatz einer Dreiecksfunktion, indem wir die Funktion durch eine Funktion in SymPy ersetzen (≠ Substitution).
[Python] Wert des Funktionsobjekts (?)
Beim Inkrementieren des Werts eines Schlüssels, der nicht vorhanden ist
Finden Sie mit PythonControl die Übertragungsfunktion des Systems mit einem Freiheitsgrad.
Visualisieren Sie, indem Sie dem "Box-Bart-Diagramm" (Boxen / Schwarm / Violine) "einen Biss" hinzufügen.
Finden Sie die mysteriöse Veränderung der Pokemon-Bilderbuchbeschreibung nach Levenstein-Entfernung heraus
Wenn Sie eine Liste mit dem Standardargument der Funktion angeben ...
Lesen Sie die Standardausgabe eines Unterprozesses zeilenweise in Python
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
[Python3] Definition eines Dekorators, der die Ausführungszeit einer Funktion misst
Finden Sie den Rang der Matrix in der XOR-Welt (Rang der Matrix auf F2)
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen
Eine Klasse, die den SPS-Wert durch Socket-Kommunikation frei ändert
Finden Sie das Verhältnis der Fläche des Biwa-Sees nach der Monte-Carlo-Methode
Finden Sie den Schnittpunkt eines Kreises und einer geraden Linie (Sympymatrix)