Volare verso la soluzione del problema: gli algoritmi Particle Swarm Optimization (PSO)

Volare verso la soluzione del problema: gli algoritmi Particle Swarm Optimization (PSO)

Condividi con i tuoi amici...

Il comportamento degli uccelli in uno stormo è un fenomeno che ha affascinato gli studiosi per molti anni. Gli uccelli in uno stormo sembrano muoversi in modo coordinato e sincronizzato, creando pattern complessi e spettacolari nel loro volo. Questo comportamento è conosciuto come “volo a stormo” o “volo sincronizzato”.

La teoria prevalente per spiegare il comportamento degli uccelli in uno stormo è quella dell’interazione locale. Secondo questa teoria, gli uccelli nel volo a stormo si basano su semplici regole di interazione tra vicini per mantenere la coesione del gruppo. Queste regole possono includere l’allineamento, l’attrazione e la separazione.

Per esempio, l’allineamento si verifica quando gli uccelli si orientano nella stessa direzione dei loro vicini più vicini. L’attrazione si riferisce alla tendenza degli uccelli ad avvicinarsi agli altri del gruppo. La separazione, invece, riguarda il desiderio di evitare collisioni e di mantenere una distanza minima dagli altri uccelli.

Numerosi studi hanno cercato di esplorare la dinamica del volo a stormo utilizzando modelli matematici e simulazioni al computer. Uno studio condotto da Hemelrijk e Hildenbrandt ha dimostrato, tramite simulazioni, che le regole di allineamento, attrazione e separazione sono sufficienti a spiegare il volo a stormo e possono essere utilizzate per riprodurre modelli di stormi in volo. Lo studio ha dimostrato che le varie regole di interazione locale possono creare fenomeni come l’allineamento dei voli e la separazione degli individui all’interno dello stormo.

È stato riscontrato che il rapido trasferimento di informazioni tra gli individui di un gruppo può essere molto vantaggioso per la sopravvivenza. Un esempio di questo è ciò che succede quando un gruppo di animali viene attaccato da un predatore. Gli animali, come ad esempio gli uccelli che vivono in stormi come gli storni, hanno sviluppato una strategia di difesa chiamata “onda di agitazione“. Questo comporta che tutti gli animali nel gruppo reagiscano allo stesso modo, comunicando velocemente l’informazione dell’attacco agli altri membri del gruppo. In questo modo, i predatori trovano molto più difficile selezionare e catturare una preda specifica.

Per capire meglio questo fenomeno, sono stati condotti degli studi sia sul comportamento degli animali che sugli aspetti tecnici di come avviene il trasferimento di informazioni nel gruppo. Ad esempio, uno studio recente ha utilizzato un modello computazionale chiamato StarDisplay per simulare il comportamento degli stormi di storni. Il modello ha dimostrato che le onde di agitazione degli stormi di storni derivano dai cambiamenti nella direzione delle mosse degli uccelli, piuttosto che dai cambiamenti nella densità del gruppo. Questo significa che l’onda di agitazione si propaga attraverso il gruppo semplicemente con cambiamenti nella direzione dei movimenti degli uccelli, anziché con un aumento o una diminuzione del numero di uccelli nello stormo.

I risultati dello studio hanno dimostrato che le simulazioni del modello erano molto simili al comportamento vero degli stormi di storni, sia dal punto di vista visivo che nella velocità con cui si propagano le onde di agitazione attraverso lo stormo. La velocità delle onde di agitazione dipende da vari fattori, come il numero di uccelli vicini che imitano o ripetono un movimento, la distanza tra gli uccelli e il tempo necessario per identificare il tipo di movimento da imitare.

Questi risultati sono molto importanti perché ci aiutano a capire meglio come gli animali comunicano e si difendono all’interno di un gruppo. Inoltre, possono essere utilizzati come base per futuri studi empirici per confermare e approfondire queste previsioni ottenute mediante simulazioni.

Durante la ricerca del cibo gli uccelli possono mostrare comportamenti coordinati simili a quelli degli stormi. Questo tipo di comportamento è conosciuto come “foraggiamento di gruppo” o “foraggiamento sociale”, in cui gli uccelli si uniscono per trovare e sfruttare risorse alimentari.

Durante il foraggiamento di gruppo, gli uccelli possono seguire principi di coordinamento come l’allineamento, l’attrazione e la separazione, simili a quelli osservati negli stormi. Ad esempio, quando un uccello individua una fonte di cibo, può attrarre gli altri membri del gruppo a unirsi alla ricerca. Inoltre, gli uccelli possono allinearsi nella stessa direzione o mantenersi a una distanza minima l’uno dall’altro per massimizzare l’efficienza nella ricerca di cibo.

Gli storni mostrano un comportamento coordinato nel cercare il cibo durante la migrazione. Utilizzando dati GPS e modelli matematici, lo studio ha evidenziato come gli storni si coordinino insieme durante il foraggiamento per massimizzare l’efficienza nella ricerca di cibo.

Lo studio Coordinated Movements Prevent Jamming in an Emperor Penguin Huddle descrive come gli uccelli in una colonia di pinguini imperatore si coordinano nel cambiare posizione all’interno del gruppo per evitare situazioni di sovraffollamento.

Altri studi hanno dimostrato come oche selvatiche e cormorani utilizzino il foraggiamento di gruppo per migliorare il successo nella ricerca del cibo. Questi uccelli possono comunicare tra loro attraverso segnali visivi e vocalizzazioni, e utilizzano sia l’attrazione reciproca che la separazione per organizzare e coordinare i loro movimenti durante la ricerca del cibo.

È importante notare che il comportamento di foraggiamento di gruppo può variare tra le diverse specie di uccelli. Alcuni uccelli possono formare gruppi più strutturati e gerarchici in cui gli individui più esperti o più dominanti guidano la ricerca del cibo, mentre altri possono adottare strategie più flessibili e basate su segnali di comunicazione reciproca. (Vedi lo studio Inferring influence and leadership in moving animal groups)

L’algoritmo PSO (Particle Swarm Optimization)

Gli scienziati hanno da tempo cercato di comprendere le dinamiche degli stormi di uccelli e di trasporre queste caratteristiche nella progettazione di algoritmi per risolvere problemi complessi, come ad esempio l’ottimizzazione. Uno dei modelli più popolari derivati dagli stormi di uccelli è l’algoritmo PSO (Particle Swarm Optimization).

L’algoritmo PSO è un algoritmo intelligente proposto da Eberhart e Kennedy nel 1995, che risolve i problemi di ottimizzazione simulando il comportamento di ricerca del cibo degli uccelli.

Per comprendere meglio il concetto, possiamo immaginare di avere un gruppo di uccelli che cerca il cibo in una vasta area. Ogni uccello ha la capacità di muoversi e cercare il cibo in modo indipendente dagli altri. L’obiettivo degli uccelli è massimizzare l’assunzione di cibo e minimizzare la quantità di energia spesa nella ricerca.

L’algoritmo PSO prende ispirazione da questo comportamento degli uccelli e lo utilizza per risolvere problemi di ottimizzazione.

Nell’algoritmo, ogni “particella” rappresenta una possibile soluzione al problema di ottimizzazione. Le particelle si muovono in uno spazio di ricerca e cercano la soluzione ottimale.

Nel dettaglio tecnico, ogni particella ha una posizione e una velocità nello spazio di ricerca. La posizione rappresenta una possibile soluzione al problema, mentre la velocità rappresenta la direzione e l’entità dello spostamento della particella nello spazio di ricerca. Le particelle si spostano iterativamente verso le posizioni migliorative, in base alle informazioni ottenute dalle altre particelle e da un fattore di attrazione verso la migliore soluzione trovata fino a quel momento.

Quando una particella trova una soluzione migliore, condivide queste informazioni con le altre particelle vicine. Questo permette alle particelle di scambiarsi informazioni ed esplorare l’intero spazio di ricerca in modo più efficiente. Attraverso questo processo iterativo, le particelle convergono gradualmente verso la soluzione ottimale del problema di ottimizzazione.

L’algoritmo PSO ha dimostrato di essere efficace nella risoluzione di una vasta gamma di problemi di ottimizzazione, come il problema del commesso viaggiatore, il problema di programmazione lineare e altri. La sua efficacia deriva dal fatto che sfrutta i principi delle intelligenze collettive, in cui diverse entità interagiscono tra loro per ottenere risultati migliori di quanto potrebbero fare individualmente.

L’algoritmo PSO si basa su tre principi fondamentali:

  1. Movimento degli individui: ogni particella si sposta attraverso lo spazio delle soluzioni possibili in base alla sua posizione e velocità corrente. La velocità influisce sulla direzione e sull’ampiezza del movimento di ciascuna particella. La posizione di una particella è influenzata da due componenti: la sua posizione precedente e la posizione migliore raggiunta dalla particella stessa o da altre particelle nell’insieme di soluzioni.
  2. Feedback sociale: le particelle in PSO comunicano tra loro attraverso il concetto di “best global position” (miglior posizione globale) e “best local position” (miglior posizione locale). La miglior posizione globale è la soluzione di ottimo globale trovata finora da qualsiasi particella del gruppo, mentre la miglior posizione locale è la soluzione di ottimo locale trovata da una particella vicina.
  3. Esplorazione ed esercizio: l’algoritmo PSO promuove sia l’esplorazione dello spazio delle soluzioni, cercando di trovare nuovi punti di interesse, sia l’esercizio della soluzione trovata finora, cercando di ottimizzarla ulteriormente.

Guardiamo “dentro” l’algoritmo

Inizializzazione: Si inizializzano casualmente la posizione e la velocità di ogni particella.

Valutazione: Si valuta la funzione obiettivo per ogni particella.

V = f(X(t))

Aggiornamento della Velocità e della Posizione: Ogni particella aggiorna la sua velocità e la sua posizione in base alla sua migliore posizione conosciuta e alla migliore posizione conosciuta dell’intero stormo.

Terminazione: Il processo si ripete fino a che non si raggiunge un criterio di terminazione, come un numero massimo di iterazioni o una tolleranza sull’errore.

Esempio: ricerca del valore minimo di una funzione

Consideriamo il semplice obiettivo di minimizzazione della seguente funzione

f(x) = x2

Ecco il diagramma di flusso che descrive l’algoritmo

CLICCA SULL’IMMAGINE PER INGRANDIRLA

Il codice python corrispondente


import random

class Particle:
    def __init__(self):
        self.position = random.uniform(-10, 10)
        self.velocity = random.uniform(-1, 1)
        self.best_position = self.position
        self.best_value = float('inf')

def pso(objective_function, n_particles=10, n_iterations=1000, w=0.5, c1=1.5, c2=2.0):
    swarm = [Particle() for _ in range(n_particles)]
    g_best_position = None
    g_best_value = float('inf')
    
    for _ in range(n_iterations):
        for particle in swarm:
            value = objective_function(particle.position)
            
            if value < particle.best_value:
                particle.best_value = value
                particle.best_position = particle.position
            
            if value < g_best_value:
                g_best_value = value
                g_best_position = particle.position
            
            particle.velocity = (w * particle.velocity + c1 * random.random() *
                                 (particle.best_position - particle.position) + 
                                 c2 * random.random() * (g_best_position - particle.position))
            particle.position += particle.velocity
    
    return g_best_position, g_best_value

# Definisci la tua funzione obiettivo qui.
def objective_function(x):
    return x ** 2  # Esempio di funzione obiettivo

best_position, best_value = pso(objective_function)
print("Migliore posizione trovata: ", best_position)
print("Valore della funzione in quella posizione: ", best_value)

Di seguito forniamo una spiegazione del codice

CLICCA SULL’IMMAGINE PER INGRANDIRLA

Note sui parametri

  • “w” (weight) è il peso inerziale, che controlla l’importanza attribuita alla velocità precedente della particella nel calcolo della sua nuova velocità. Valori tipici per “w” sono compresi tra 0 e 1, dove un valore più vicino a 1 dà più importanza alla velocità precedente e un valore più vicino a 0 ne dà meno importanza.
  • “c1” è un coefficiente di apprendimento cognitivo, che regola l’importanza data all’intuizione individuale della particella. Questo coefficiente influenza come la particella considera la sua miglior posizione precedente nel determinare la sua prossima posizione. “c1” può essere considerato come un’importanza data all’esperienza personale della particella. Un valore tipico per “c1” è intorno a 2 o 3.
  • “c2” è un coefficiente di apprendimento sociale, che controlla l’importanza data all’intuizione collettiva delle particelle nel calcolo della prossima posizione. Questo coefficiente influenza come la particella considera la migliore posizione globale del gruppo nel determinare la sua prossima posizione. “c2” può essere considerato come un’importanza data all’esperienza collettiva delle particelle. Un valore tipico per “c2” è intorno a 2 o 3.
  • “r1” e “r2” sono valori casuali generati in ogni iterazione dell’algoritmo e sono utilizzati per aggiungere un elemento di casualità nel calcolo della nuova velocità della particella. Questo elemento casuale aiuta la particella a esplorare l’intero spazio di ricerca in modo più efficace. “r1” e “r2” sono solitamente valori compresi tra 0 e 1.

L’effetto combinato di questi parametri determina come le particelle si spostano nello spazio di ricerca e come scambiano informazioni tra di loro per raggiungere la soluzione ottimale del problema di ottimizzazione. Esperimenti con diversi valori di questi parametri possono essere condotti per ottimizzare le prestazioni dell’algoritmo PSO per un determinato problema.

Analogie con il volo degli uccelli

Le “particelle” nell’algoritmo sono analoghe agli “individui” di uno stormo reale.

Ecco alcune similitudini tra le particelle nel PSO e gli individui in uno stormo reale che abbiamo evidenziato in questo articolo:

Nel PSO le particelle si muovono nello spazio delle soluzioni influenzandosi a vicenda.
Nello Stormo reale gli uccelli si muovono insieme, influenzandosi a vicenda nel loro movimento.

Nel PSO Le particelle condividono informazioni sulle loro migliori posizioni, permettendo al gruppo di convergere verso ottimi globali o locali.
Nello Stormo reale gli uccelli comunicano tra loro, permettendo allo stormo di navigare efficacemente verso destinazioni favorevoli.

Nel PSO le particelle aggiustano continuamente la loro traiettoria basandosi sulle proprie esperienze e sulle esperienze delle particelle vicine.
Nello Stormo reale gli uccelli aggiustano continuamente la loro rotta e velocità in base al comportamento degli altri membri dello stormo.

Nel PSO lo stormo di particelle lavora collettivamente per trovare una soluzione ottimale al problema.
Nello stormo reale gli uccelli lavorano insieme per trovare il percorso ottimale durante il volo, ottimizzando l’uso dell’energia e riducendo il rischio di predazione.

Nel PSO le particelle sono in grado di adattarsi e convergere verso nuove soluzioni se il paesaggio delle soluzioni cambia.
Nello stormo reale gli uccelli sono in grado di adattarsi a nuovi ambienti e condizioni durante il volo.