EstevezAlvarez
OtimizaçãoPython

Guloso e busca local: construir rápido e melhorar com critério

Como funcionam decisões imediatas, movimentos de vizinhança e o ótimo local na alocação capacitada.

Série: dos dados à decisão logística
  1. Dos pedidos à rede logística: um projeto de otimização e machine learning
  2. MILP: transformar uma decisão logística em um modelo verificável
  3. Relaxação linear: quanto uma solução ainda pode melhorar
  4. Guloso e busca local: construir rápido e melhorar com critério
  5. LNS: reorganizar parte da rede para escapar do ótimo local
  6. Prever demanda: de uma referência populacional a Poisson e boosting
  7. Previsão populacional: tendências, amortecimento e teste temporal
  8. K-means: descobrir perfis municipais sem inventar categorias naturais
  9. Scoring de candidatos: aprender a filtrar sem perder boas decisões
  10. Cenários e SAA: decidir antes de conhecer a demanda

A primeira solução não precisa ser a última

O guloso do projeto ordena as regiões por demanda decrescente e atribui cada uma ao centro de menor custo unitário que ainda tenha capacidade. Atender primeiro os blocos grandes tenta evitar que o espaço restante fique fragmentado. É parecido com colocar primeiro as caixas grandes em prateleiras limitadas; a comparação se refere à capacidade, não às dimensões físicas, que o modelo não representa.

Esta implementação não inclui o custo fixo de abrir um centro na escolha imediata, nem compara economicamente atender com pagar a penalidade. Por isso pode abrir instalações demais. Sua utilidade é fornecer rapidamente uma solução inicial e uma referência compreensível. Pergunte se o custo de abertura domina o transporte: nesse caso, a regra do centro mais barato por unidade pode ser especialmente limitada.

Melhorar examinando alternativas próximas

A busca local pega essa solução e testa realocar uma região, trocar duas ou fechar um centro redistribuindo sua demanda. Avalia a mudança no custo total e aceita melhorias que respeitam capacidade. Uma transferência isolada pode ser impossível porque o destino está cheio, enquanto uma troca libera simultaneamente o espaço necessário. Por isso ampliar o conjunto de movimentos muda o que o algoritmo consegue encontrar.

from alocacao_capacitada.analysis.study import tiny_instance
from alocacao_capacitada.solvers.greedy import NearestFeasibleGreedy
from alocacao_capacitada.solvers.local_search import LocalSearch
from alocacao_capacitada.domain.evaluation import evaluate

inst = tiny_instance()
for solver in [NearestFeasibleGreedy(),
               LocalSearch(NearestFeasibleGreedy())]:
    result = solver.solve(inst, 5.0)
    ev = evaluate(inst, result.solution)
    print(solver.name, ev.total_cost, ev.fixed_cost, ev.transport_cost)

Ler a decomposição do custo

No exemplo pequeno, o guloso custa 232: abertura 106 e transporte 126. A busca local chega a 210: abertura 68 e transporte 142. Transportar custa mais, mas fechar uma instalação compensa esse aumento. A solução ótima de 203 usa outra combinação, com abertura 73 e transporte 130. Olhar apenas quilômetros ou apenas quantidade de centros esconderia essa compensação.

Ótimo local significa que não foi encontrada uma melhoria entre os movimentos examinados, depois de completar a busca daquela vizinhança. Não prova que inexista outra rede melhor. Se o algoritmo terminar por tempo, nem mesmo se deve presumir que a vizinhança foi esgotada. Use essas heurísticas quando precisa de resposta rápida ou inicialização; compare várias instâncias e preserve sempre o custo total, a demanda não atendida e o estado de término.

Decomposição do custo do exemplo: abrir menos centros pode aumentar o transporte e ainda reduzir o total.
Decomposição do custo do exemplo: abrir menos centros pode aumentar o transporte e ainda reduzir o total.

Um exercício para conferir a intuição

Duplique somente os custos fixos do exemplo e repita a comparação. Antes de executar, escreva o que espera que aconteça com o número de centros. Depois verifique se o transporte adicional compensa o fechamento e se aparece demanda não atendida. A resposta depende do conjunto completo de custos e capacidades; o exercício ensina por que uma regra intuitiva precisa ser confrontada com uma avaliação independente.

Fontes e evidências

Próximo: LNS: reorganizar parte da rede para escapar do ótimo local

Voltar ao índice do blog