[PYTHON] Trouvez la valeur minimale de la fonction par la méthode d'optimisation du groupe de particules (PSO)

Aperçu

L'optimisation des essaims de particules (PSO) est un type d'intelligence de groupe inspirée du comportement d'un groupe d'animaux. Dans cet article, je présenterai un exemple simple de la méthode d'optimisation des groupes de particules.

Spécimen

L'équation parabolique est donnée sous la forme suivante.

\begin{aligned}
z = x^2+y^2
\end{aligned}

Évidemment, la valeur minimale est $ z = 0 $ lorsque $ (x, y) = (0, 0) $. Ceci est obtenu en utilisant la méthode d'optimisation des groupes de particules.

Explication de la méthode d'optimisation des groupes de particules

Voir l'article ci-dessous. (L'indice du §2 est-il en partie incorrect?) Optimisation des groupes de particules et système non linéaire

Implémentons le §2 de cet article.

Code source

main.py


# -*- coding: utf-8 -*-

import numpy as np
import random

#Fonction d'évaluation: z = x^2 + y^2
def criterion(x, y):
    z = x * x + y * y
    return z

#Une fonction qui met à jour la position des particules
def update_position(x, y, vx, vy):
    new_x = x + vx
    new_y = y + vy
    return new_x, new_y

#Une fonction qui met à jour la vitesse des particules
def update_velocity(x, y, vx, vy, p, g, w=0.5, ro_max=0.14):
    #Le paramètre ro est donné au hasard
    ro1 = random.uniform(0, ro_max)
    ro2 = random.uniform(0, ro_max)
    #Mettre à jour la vitesse des particules
    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  #Nombre de particules
    x_min, x_max = -5, 5
    y_min, y_max = -5, 5
    #Position des particules,la vitesse,Record personnel,Initialisez le meilleur du monde
    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  #Limite de temps(Nombre de boucles)
    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]
            #Mettre à jour la position des particules
            new_x, new_y = update_position(x, y, vx, vy)
            ps[n] = {"x": new_x, "y": new_y}
            #Mettre à jour la vitesse des particules
            new_vx, new_vy = update_velocity(
                new_x, new_y, vx, vy, p, global_best_position)
            vs[n] = {"x": new_vx, "y": new_vy}
            #Trouvez la valeur d'évaluation,Mettez à jour votre record personnel
            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}
        #Mettez à jour le meilleur du monde
        best_particle = np.argmin(personal_best_scores)
        global_best_position = personal_best_positions[best_particle]
    #Solution optimale
    print(global_best_position)
    print(min(personal_best_scores))

if __name__ == '__main__':
    main()

résultat

résultat


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

Visualisation

Il semble que les particules $ N (= 100) $ sont concentrées sur $ (x, y) = (0, 0) $. B2psHNqCMAAIXcf.png

Autre

Comment déterminez-vous certains paramètres tels que le nombre de particules? (Essai et erreur?)


L'ordre de mise à jour de position, de mise à jour de vitesse, de record personnel, de meilleur global est hors de propos selon la littérature ... Dans cet article, nous mettrons à jour la position ⇒ mettre à jour la vitesse ⇒ mettre à jour le record personnel ⇒ mettre à jour le meilleur mondial.

Modifier l'historique

Recommended Posts

Trouvez la valeur minimale de la fonction par la méthode d'optimisation du groupe de particules (PSO)
Trouver l'index de la valeur maximale (valeur minimale) d'un tableau multidimensionnel
Trouvez la valeur optimale de la fonction à l'aide d'un algorithme génétique (partie 2)
À propos des paramètres d'optimisation des groupes de particules (PSO)
J'ai aussi appris + init, class, qui a essayé de trouver la valeur minimale de la fonction quadratique en faisant la méthode d'optimisation (SGD, momentum, AdaGrad) en apprentissage profond par moi-même.
Trouvez la définition de la valeur de errno
Comment trouver l'adresse mémoire de la valeur de la trame de données Pandas
Trouvez la valeur optimale de la fonction à l'aide d'un algorithme génétique (partie 1)
[Python] Une fonction simple pour trouver les coordonnées du centre d'un cercle
Essayez de résoudre le problème de minimisation des fonctions en utilisant l'optimisation des groupes de particules
Trouver la main de "Millijan" par l'optimisation des combinaisons
[Circuit x Python] Comment trouver la fonction de transfert d'un circuit en utilisant Lcapy
Récupérer l'appelant d'une fonction en Python
[Calcul scientifique / technique par Python] Calcul numérique pour trouver la valeur de la dérivée (différentielle)
Trouvez le nombre de jours dans un mois
Découvrez la fraction de la valeur saisie en python
Minimisez le nombre de polissages en optimisant la combinaison
Juger la finition du mahjong par l'optimisation des combinaisons
Rechercher par la valeur de l'instance dans la liste
Valeur de retour de quit () -Y a-t-il quelque chose retourné par la "fonction qui termine tout"?
Annoncer les prévisions météorologiques (pluie, etc.) par DM dans le cadre de la fonction de bot
Ajouter une fonction pour indiquer la météo d'aujourd'hui au bot slack (fabriqué par python)
Trouver la fonction de distribution cumulative par tri (version Python)
○○ Résolution de problèmes dans le département de mathématiques avec optimisation
#Une fonction qui renvoie le code de caractère d'une chaîne de caractères
[Linux] [C / C ++] Comment obtenir la valeur d'adresse de retour d'une fonction et le nom de fonction de l'appelant
Décidons la conférence de PyCon JP 2016 par optimisation de combinaison
Découvrez la largeur apparente d'une chaîne en python
Hériter de la bibliothèque standard pour trouver la valeur moyenne de Queue
J'ai fait une fonction pour vérifier le modèle de DCGAN
Comment trouver le coefficient de mise à l'échelle d'une ondelette bipolaire
Trouver le diamètre du graphique par recherche de priorité de largeur (mémoire Python)
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
Extraire la valeur de dict ou list sous forme de chaîne de caractères
Trouver les valeurs propres d'une vraie matrice symétrique en Python
Prouvons le théorème d'addition d'une fonction triangulaire en remplaçant la fonction par une fonction dans SymPy (≠ substitution)
[python] Valeur de l'objet fonction (?)
Lors de l'incrémentation de la valeur d'une clé qui n'existe pas
Trouvez la fonction de transfert du système à un degré de liberté avec PythonControl.
Visualisez en ajoutant "une morsure" au "diagramme barbe boîte" (boxen / essaim / violon)
Découvrez le changement mystérieux de la description du livre illustré Pokemon par Levenstein Distance
Si vous donnez une liste avec l'argument par défaut de la fonction ...
Lire la sortie standard d'un sous-processus ligne par ligne en Python
Une fonction qui mesure le temps de traitement d'une méthode en python
[Python3] Définition d'un décorateur qui mesure le temps d'exécution d'une fonction
Trouvez le rang de la matrice dans le monde XOR (rang de la matrice sur F2)
Créez une fonction pour obtenir le contenu de la base de données dans Go
Une classe qui change librement la valeur de l'automate par communication socket
Trouvez le ratio de la superficie du lac Biwa par la méthode de Monte Carlo
Trouver l'intersection d'un cercle et d'une droite (matrice sympy)