Este repositório implementa e compara algoritmos de busca meta-heurística aplicados a problemas de otimização contínua e discreta, desenvolvidos com NumPy, Matplotlib e Seaborn, sem uso de frameworks de otimização de alto nível.
| Parte | Problema | Algoritmo(s) |
|---|---|---|
| 1 | Otimização Contínua — 6 funções objetivo 2D | Hill Climbing · LRS · GRS |
| 2.1 | 8 Rainhas — combinatória discreta | Têmpera Simulada (SA) |
| 2.2 | Caixeiro Viajante 3D — roteamento de drone | Algoritmo Genético (GA) |
| 2.3 | Rastrigin 50D — comparação em alta dimensão | GA não canônico vs. LRS |
metaheuristic-search-optimization/
│
├── 1_OTIMIZACAO_CONTINUA.py # Hill Climbing, LRS e GRS nas 6 funções objetivo
├── 2_DOMINIO_DISCRETO.py # Têmpera Simulada, GA caixeiro, GA não canônico
│
├── data/
│ └── CaixeiroGruposGA.csv # Pontos 3D distribuídos em 4 regiões + origem
│
└── report/
└── relatorio.pdf # PDF
pip install numpy matplotlib seabornVersões utilizadas: Python 3.8+ · NumPy · Matplotlib · Seaborn
Encontrar mínimos ou máximos de seis funções objetivo bidimensionais com características distintas — unimodais, multimodais, com múltiplos ótimos locais e regiões de platô — comparando três estratégias de busca em R = 100 rodadas independentes com seed = 42.
| Algoritmo | Ponto inicial | Geração de candidato | Hiperparâmetro |
|---|---|---|---|
| Hill Climbing (HC) | Limite inferior do domínio | Perturbação uniforme em$[-\varepsilon, \varepsilon]$ | ε |
| Local Random Search (LRS) | Uniforme no domínio | Ruído gaussiano$\mathcal{N}(0, \sigma)$ somado a |
σ |
| Global Random Search (GRS) | Uniforme no domínio | Nova amostra uniforme independente a cada iteração | — |
Critério de parada (todos): máximo de 1000 iterações ou 100 iterações consecutivas sem melhoria em
| # | Expressão | Domínio | Tipo | Ótimo conhecido |
|---|---|---|---|---|
| f1 | mín |
|
||
| f2 | máx |
|
||
| f3 | Ackley | mín |
|
|
| f4 | Rastrigin 2D | mín |
|
|
| f5 | máx |
|
||
| f6 | máx | múltiplos máx. locais |
| Problema | ε (HC) | σ (LRS) |
|---|---|---|
| f1 | 0.80 | 0.50 |
| f2 | 0.05 | 0.20 |
| f3 (Ackley) | 0.99 | 0.70 |
| f4 (Rastrigin) | 0.99 | 0.80 |
| f5 | 0.10 | 0.50 |
| f6 | 0.02 | 0.10 |
| Problema | Tipo | Hill Climbing | LRS | GRS |
|---|---|---|---|---|
| f1 | mín | 0.0006 | 0.0004 | 59.5697 |
| f2 | máx | 1.0064 | 2.0026 | 1.9946 |
| f3 (Ackley) | mín | 15.9621 | 0.2880 | 2.0298 |
| f4 (Rastrigin) | mín | 27.5147 | 5.1522 | 3.1319 |
| f5 | máx | 1.4369 | 0.5298 | 1.3568 |
| f6 | máx | 1.0000 | 2.2516 | 5.0674 |
Conclusão: O LRS apresentou melhor equilíbrio em funções unimodais (f1, f3). O GRS destacou-se em funções fortemente multimodais (f4, f6). O HC mostrou-se sensível ao ponto de partida fixo, ficando preso em ótimos locais em 4 dos 6 problemas.
Posicionar 8 rainhas em um tabuleiro 8×8 sem que nenhuma ataque outra.
-
Representação: vetor
$x \in {1,\ldots,8}^8$ — índice = coluna, valor = linha -
Função objetivo:
$f(x) = 28 - h(x)$ , onde$h(x)$ é o número de pares atacantes · maximização - Perturbação: troca a linha de uma única coluna aleatória (busca local controlada)
-
Parâmetros:
$T_0 = 50$ ·$\alpha = 0.995$ (decaimento geométrico) · máx. 5000 iterações -
Parada antecipada: quando
$f(x) = 28$ (zero ataques)
Resultado em execução única:
| Métrica | Valor |
|---|---|
| Execuções para encontrar as 92 soluções distintas | 650 |
| Custo médio por solução nova | ~7,1 execuções |
Drone percorrendo 160 pontos tridimensionais (40 por região + origem), minimizando a distância euclidiana total da rota.
| Parâmetro | Valor |
|---|---|
| Pontos por região | 40 (total: 161 com origem) |
| Tamanho da população | N = 80 |
| Máx. gerações | 300 |
| Seleção | Torneio (k = 3) |
| Recombinação | Order Crossover — OX (sem repetição de cidades) |
| Mutação | Swap entre dois genes (pm = 1%) |
| Elitismo | Ne = 5 melhores preservados por geração |
| Parada antecipada | 15 gerações consecutivas sem variação > ε = 1.0 |
| Métrica (10 rodadas) | Valor |
|---|---|
| Moda de gerações até convergência | 78 |
| Distância média | 7169,77 |
| Desvio padrão | 462,33 |
GA não canônico: codificação real · torneio (k=3) · SBX (η=1) · mutação gaussiana (σ=0.1, pm=10%) · elitismo Ne=5 · 300 gerações
Efeito do tamanho de população (5 rodadas cada):
| N | Média f(x) | Desvio padrão |
|---|---|---|
| 30 | 264.01 | 29.55 |
| 60 | 230.70 | 22.11 |
| 100 | 187.45 | 10.84 |
Comparação GA (N=100) vs. LRS — 10 rodadas:
| Método | Melhor | Média | Desvio padrão |
|---|---|---|---|
| GA não canônico | 174.53 | 207.34 | 32.98 |
| LRS | 421.07 | 538.18 | 68.25 |
Conclusão: O GA não canônico superou o LRS em todas as métricas — o melhor valor encontrado é ~2,4× menor e a média ~2,6× menor. Em 50 dimensões, a manutenção de uma população com SBX e mutação gaussiana permite explorar simultaneamente múltiplas regiões do espaço, enquanto o LRS fica preso em mínimos locais da paisagem altamente multimodal da Rastrigin.
python 1_OTIMIZACAO_CONTINUA.pySaídas geradas:
- Histogramas de distribuição de
$f(x^*)$ para cada função e algoritmo (100 rodadas) - Linhas de moda e melhor valor em cada histograma
- Tabela de modas impressa no terminal
Antes de executar, ajuste o caminho do CSV na primeira linha de 2_DOMINIO_DISCRETO.py:
CAMINHO_CSV = "data/CaixeiroGruposGA.csv"python 2_DOMINIO_DISCRETO.pySaídas geradas:
- Solução das 8 rainhas e contagem de execuções para as 92 soluções distintas
- Melhor distância e geração de parada do caixeiro viajante
- Tabela comparativa GA não canônico vs. LRS na Rastrigin 50D
Atenção: todos os experimentos utilizam
seed = 42para garantir reprodutibilidade.
- Todos os algoritmos foram implementados manualmente com NumPy — sem uso de bibliotecas de otimização prontas.
- O critério de parada por estagnação (100 iterações sem melhoria na Parte 1, 15 gerações na Parte 2) evita desperdício computacional e garante convergência prática.
- O HC parte sempre do limite inferior do domínio, o que o torna sensível ao ponto de partida em funções multimodais.
- O operador OX garante que cada filho seja uma permutação válida das cidades, essencial no TSP.
- O elitismo com Ne = 5 é fundamental no GA do caixeiro: sem ele, o critério de estagnação perderia a referência de melhoria ao longo das gerações.
- A Rastrigin da Parte 2.3 usa
$\cos(\pi x_i)$ , conforme o enunciado — diferente da f4 2D que usa$\cos(2\pi x_i)$ (formulação clássica padrão).
O arquivo report/relatorio.pdf contém o relatório completo no formato de artigo científico (template IEEE), incluindo:
- Resumo — síntese dos métodos e principais resultados
- Metodologia — decisões de hiperparâmetros e critérios de parada
- Resultados — tabelas de modas, histogramas e análise comparativa
- Conclusões — análise crítica do desempenho de cada algoritmo por tipo de problema
RUSSELL, Stuart J.; NORVIG, Peter. Artificial intelligence: a modern approach. London, 2010.