[PYTHON] Versuchen Sie, das Problem der Funktionsminimierung mithilfe der Partikelgruppenoptimierung zu lösen

Partikelgruppenoptimierung

Die Partikelschwarmoptimierung (PSO) ist eine Art von Gruppenintelligenz und wird für Kombinationsoptimierungsprobleme als Lösungssuchmethode verwendet. Es ist ein Fluss, mit der Suche fortzufahren, indem die Aktualisierung von zwei Informationen, der Geschwindigkeit und Position des Partikels, wiederholt wird. Die folgende Abbildung zeigt die Partikelgruppenoptimierung. pso2.png

Algorithmus

Der Algorithmus zur Partikelgruppenoptimierung ist wie folgt. スクリーンショット 2019-11-25 15.33.15.png

Erneuerungsformel

Die Geschwindigkeit und Position der Partikel werden durch die folgende Aktualisierungsformel aktualisiert. Einfach ausgedrückt repräsentiert die Geschwindigkeit die Richtung, in die sich das Partikel entwickelt, und die Position repräsentiert die Parameter des Partikels selbst. スクリーンショット 2019-11-25 15.35.13.png

Experiment

Lösen wir das Optimierungsproblem. Diesmal

x^2 + y^2

Lösen wir das Minimierungsproblem. Daher ist (x, y) = (0,0) die optimale Lösung. Der verwendete Code lautet wie folgt.

# -*- coding: utf-8 -*-
import numpy as np
import random

#Bewertungsfunktion
def evaluate(particle):
    z = 0
    for i in range(len(particle)):
        z += particle[i] ** 2
    return z

#Positionsaktualisierung
def update_position(particle, velocity):
    new_particle = particle + velocity
    return new_particle

#Geschwindigkeitsaktualisierung
def update_velocity(particle, velocity, pbest, gbest, w=0.5, max=0.15):
    new_velocity = np.array([0.0 for i in range(len(particle))])
    #new_velocity = [0.0 for i in range(len(particle))]
    r1 = random.uniform(0, max)
    r2 = random.uniform(0, max)
    for i in range(len(particle)):
        new_velocity[i] = (w * float(velocity[i]) + r1 * (float(pbest[i]) - float(particle[i])) + r2 * (float(gbest[0]) - float(particle[i])))

    return new_velocity

def main():
    N = 100 #Anzahl der Partikel
    length = 2  #Anzahl der Dimensionen
    para_max = 100  #Maximalwert des Parameters
    #Initialisierung der Partikelposition
    ps = [[random.uniform(-para_max, para_max) for j in range(length)] for i in range(N)]
    vs = [[0.0 for j in range(length)] for i in range(N)]
    #Persönlicher Rekord
    personal_best_position = ps
    #Persönliche Bestbewertung
    personal_best_scores = [evaluate(p) for p in ps]
    #Index des Partikels mit dem niedrigsten Bewertungswert
    best_particle = np.argmin(personal_best_scores)
    #Weltweit am besten
    global_best_position = personal_best_position[best_particle]

    generation = 30 #Maximale Anzahl von Generationen
    #Schleife für mehrere Generationen
    for t in range(generation):
        file = open("data/pso/pso" + str(t+1) + ".txt", "w")
        #Schleife für ein paar Minuten
        for n in range(N):
            #Datei schreiben
            file.write(str(ps[n][0]) + " " + str(ps[n][1]) + "\n")
            #Aktualisierung der Partikelgeschwindigkeit
            vs[n] = update_velocity(ps[n], vs[n], personal_best_position[n], global_best_position)
            #Partikelposition aktualisieren
            ps[n] = update_position(ps[n], vs[n])

            #Berechnen Sie den Bewertungswert und finden Sie die persönliche Bestleistung
            score = evaluate(ps[n])
            if score < personal_best_scores[n]:
                personal_best_scores[n] = score
                personal_best_position[n] = ps[n]
        #Aktualisieren Sie die weltweit besten
        best_particle = np.argmin(personal_best_scores)
        global_best_position = personal_best_position[best_particle]
        file.close()

    print(global_best_position)
    print(min(personal_best_scores))

if __name__ == '__main__':
    main()

Versuchsergebnis

Personen der 1., 10., 20. und 30. Generation sind farblich gekennzeichnet und in der Abbildung dargestellt. Sie können sehen, dass die Partikel im Verlauf der Generierung gegen (0,0) konvergieren. PSO.png

Recommended Posts

Versuchen Sie, das Problem der Funktionsminimierung mithilfe der Partikelgruppenoptimierung zu lösen
Versuchen Sie, das Problem der Python-Klassenvererbung zu lösen
Versuchen Sie die Funktionsoptimierung mit Hyperopt
Versuchen Sie, das Problem der Zuweisung von Schulungsärzten mit Python zu lösen
Versuchen Sie, das N Queen-Problem mit SA von PyQUBO zu lösen
So lösen Sie das Problem beim Verpacken des Behälters
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus zu lösen (Theorie)
Ermitteln Sie den Mindestwert der Funktion mithilfe der Partikelgruppenoptimierungsmethode (PSO).
Lösen Sie Rucksackprobleme mit pyomo und glpk
Versuchen Sie, das Mensch-Maschine-Diagramm mit Python zu lösen
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus zu lösen (Ausführungsergebnis)
Versuchen Sie, das Programmier-Herausforderungsbuch mit Python3 zu lösen
[Python] Versuchen Sie, die coole Antwort auf das FizzBuzz-Problem zu lesen
Versuchen Sie, die Probleme des "Matrix-Programmierers" zu lösen (Kapitel 1).
So lösen Sie die rekursive Funktion, die abc115-D gelöst hat
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Versuchen Sie, Sudoku mit explosiver Geschwindigkeit mit Numpy zu lösen
Versuchen Sie, die Funktionsliste des Python> os-Pakets abzurufen
Ich habe versucht, die Anzeigenoptimierung mithilfe des Banditenalgorithmus zu simulieren
Ich habe versucht, das Problem der Kombinationsoptimierung mit Qiskit zu lösen
Versuchen Sie, die Probleme / Probleme des "Matrix-Programmierers" zu lösen (Kapitel 0-Funktion)
Lösen Sie das japanische Problem, wenn Sie das CSV-Modul in Python verwenden.
Das Problem wird je nach Formulierungsmethode leichter zu lösen
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren (Re-Challenge)
Versuchen Sie die Funktionsoptimierung mit Optuna
Lösen Sie das Monty Hall-Problem
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit der Twitter-API
Informationen zu Parametern der Partikelgruppenoptimierung (PSO)
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Versuchen Sie, ein neues Bild mit dem trainierten StyleGAN2-Modell zu bearbeiten
Versuchen Sie, die Datenbank mit Peewee von ORM of Python (Version August 2019) zu betreiben.
Ich wollte das ABC164 A ~ D-Problem mit Python lösen
Ich habe versucht, das Schichtplanungsproblem mit verschiedenen Methoden zu lösen
Versuchen Sie, den kürzesten Weg mit Python + NetworkX + Social Data zu lösen
Lösen Sie multivariate Optimierungsprobleme mit sagemath
Verwendung der Zip-Funktion
Versuchen Sie, Nagios mit pynag zu konfigurieren
Vorsichtsmaßnahmen bei Verwendung der Funktion urllib.parse.quote
Versuchen Sie, Statistiken mit e-Stat abzurufen
Versuchen Sie es mit dem Python Cmd-Modul
Probieren Sie Cython in kürzester Zeit aus
Der schnellste Weg, EfficientNet auszuprobieren
Der einfachste Weg, PyQtGraph auszuprobieren
Teilen und Verarbeiten eines Datenrahmens mithilfe der Groupby-Funktion
Das 16. Offline-Echtzeit-Schreiben eines Referenzproblems zur Lösung mit Python
Versuchen Sie es mit Pythons Webframework Django (1) - Von der Installation bis zum Serverstart
Versuchen Sie, den Zustand der Straßenoberfläche mithilfe von Big Data des Straßenoberflächenmanagements zu ermitteln
Versuchen Sie, mit n die von Ihnen installierte Version von Node.js herunterzustufen
Das 19. Offline-Echtzeit-Schreiben eines Referenzproblems zur Lösung mit Python
Versuchen Sie, ein festgelegtes Problem der High-School-Mathematik mit Python zu lösen