🎯 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
- Kennedy, J.; Eberhart, R. Particle Swarm Optimization. Proceedings of ICNN’95 — International Conference on Neural Networks, IEEE, 1995. DOI: 10.1109/ICNN.1995.488968
- Shi, Y.; Eberhart, R. A modified particle swarm optimizer. IEEE International Conference on Evolutionary Computation, 1998.
- Particle swarm optimization – Wikipedia