L'optimisation des essaims de particules (PSO) est un type d'intelligence de groupe et est utilisée pour les problèmes d'optimisation combinée comme méthode de recherche de solution.
C'est un flux pour procéder à la recherche en répétant la mise à jour de deux informations, la vitesse et la position de la particule.
La figure ci-dessous est une image de l'optimisation des groupes de particules.

L'algorithme d'optimisation des groupes de particules est le suivant.

La vitesse et la position des particules sont mises à jour par la formule de mise à jour suivante.
En termes simples, la vitesse représente la direction dans laquelle la particule évolue et la position représente les paramètres de la particule elle-même.

Résolvons réellement le problème d'optimisation. Cette fois
x^2 + y^2
Résolvons le problème de minimisation. Par conséquent, (x, y) = (0,0) est la solution optimale. Le code utilisé est le suivant.
# -*- coding: utf-8 -*-
import numpy as np
import random
#Fonction d'évaluation
def evaluate(particle):
    z = 0
    for i in range(len(particle)):
        z += particle[i] ** 2
    return z
#Mise à jour de la position
def update_position(particle, velocity):
    new_particle = particle + velocity
    return new_particle
#Mise à jour de la vitesse
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 #Nombre de particules
    length = 2  #Nombre de dimensions
    para_max = 100  #Valeur maximale du paramètre
    #Initialisation de la position des particules
    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)]
    #Record personnel
    personal_best_position = ps
    #Meilleure note personnelle
    personal_best_scores = [evaluate(p) for p in ps]
    #Index de la particule avec la valeur d'évaluation la plus basse
    best_particle = np.argmin(personal_best_scores)
    #Meilleur mondial
    global_best_position = personal_best_position[best_particle]
    generation = 30 #Nombre maximum de générations
    #Boucle depuis plusieurs générations
    for t in range(generation):
        file = open("data/pso/pso" + str(t+1) + ".txt", "w")
        #Boucle pendant quelques minutes
        for n in range(N):
            #Écriture de fichier
            file.write(str(ps[n][0]) + " " + str(ps[n][1]) + "\n")
            #Mise à jour de la vitesse des particules
            vs[n] = update_velocity(ps[n], vs[n], personal_best_position[n], global_best_position)
            #Mettre à jour la position des particules
            ps[n] = update_position(ps[n], vs[n])
            #Calculez la valeur d'évaluation et trouvez le record personnel
            score = evaluate(ps[n])
            if score < personal_best_scores[n]:
                personal_best_scores[n] = score
                personal_best_position[n] = ps[n]
        #Mettez à jour le meilleur du monde
        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()
Les individus des générations 1, 10, 20 et 30 sont codés par couleur et représentés sur la figure.
Vous pouvez voir que les particules convergent vers (0,0) à mesure que la génération progresse.
