🎯 Otimização por enxame de partículas

Em poucas palavras

A otimização por enxame de partículas (PSO) é uma meta-heurística populacional proposta por James Kennedy e Russell Eberhart (1995), inspirada no movimento coletivo de bandos de pássaros e cardumes. Cada partícula é uma solução candidata que ajusta sua velocidade combinando a própria inércia, a melhor posição que já visitou e a melhor posição encontrada pelo enxame.


📝 Notas e Desenvolvimento

  • Intuição: um bando procurando comida não tem um líder central. Cada pássaro lembra onde já encontrou comida e observa onde os vizinhos estão tendo sucesso. A soma dessas decisões simples produz uma busca coletiva eficiente — um caso de inteligência de enxame.
  • Terminologia:
    • Partícula: uma solução candidata, com posição e velocidade no espaço de busca.
    • pbest (): melhor posição já visitada pela própria partícula (memória individual, componente cognitivo).
    • gbest (): melhor posição já encontrada por todo o enxame (componente social).
  • Equações de atualização (versão com peso de inércia, de Shi e Eberhart, 1998):

  • Onde é o peso de inércia, e são os coeficientes cognitivo e social, e são sorteados a cada iteração.
  • Papel de cada parâmetro:
    • alto favorece a exploração (partículas “voam” mais longe); baixo favorece a explotação (refinamento local). Uma estratégia comum é reduzir linearmente ao longo das iterações.
    • torna as partículas mais “individualistas”; acelera a convergência coletiva — e o risco de convergência prematura.
  • Topologias: no modelo gbest todas as partículas se comunicam; no lbest cada uma só enxerga alguns vizinhos (ex.: anel), o que converge mais devagar, mas preserva diversidade.
  • Ciclo do algoritmo:
graph TD
    A([Início]) --> B[Inicializar posições e velocidades aleatórias]
    B --> C[Avaliar a função objetivo de cada partícula]
    C --> D[Atualizar pbest de cada partícula e gbest do enxame]
    D --> E{Critério de parada?}
    E -- Sim --> F([Retornar gbest])
    E -- Não --> G[Atualizar velocidades e posições]
    G --> C
  • Esboço em Python (minimização):
import numpy as np
 
def pso(f, lb, ub, n=30, iters=200, w=0.7, c1=1.5, c2=1.5):
    dim = len(lb)
    x = np.random.uniform(lb, ub, (n, dim))
    v = np.zeros((n, dim))
    pbest, pbest_val = x.copy(), np.apply_along_axis(f, 1, x)
    g = pbest[pbest_val.argmin()]
    for _ in range(iters):
        r1, r2 = np.random.rand(n, dim), np.random.rand(n, dim)
        v = w * v + c1 * r1 * (pbest - x) + c2 * r2 * (g - x)
        x = np.clip(x + v, lb, ub)
        val = np.apply_along_axis(f, 1, x)
        melhor = val < pbest_val
        pbest[melhor], pbest_val[melhor] = x[melhor], val[melhor]
        g = pbest[pbest_val.argmin()]
    return g, pbest_val.min()
  • Vantagens: poucos parâmetros, implementação simples, não exige gradiente e funciona bem em espaços contínuos.
  • Limitações: pode convergir prematuramente em funções multimodais; a versão original é para variáveis contínuas (há variantes binárias e discretas).
  • Comparação com Algoritmos genéticos: o PSO não tem cruzamento nem seleção — as partículas não morrem, apenas se movem, guiadas por memória. No artigo revisado sobre fazendas verticais, PSO, GWO e ACO foram superados pelo algoritmo genético na redução da intensidade energética.

📚 Referências e Fontes

🔗 Conexões do Cofre

🌐 Referências Externas