Atualiza documentacao para refletir sessao 2026-06-16 (v0.7)

- LOG.md: entradas para bugs corrigidos (C2 inspeção, C6 removida),
  renomeação Al-Thani, OFRAG, visualização e rodada 50/50
- docs/changelog.md: versão v0.7 com correções, adições e resultado validado
- docs/about.md: seção v3 com rede espaço-tempo, nomenclatura Al-Thani,
  restrições C1-C11 e scripts auxiliares; v1 mantido como referência histórica
- README.md: estado atual aponta oamrp_v3 como modelo ativo, com comandos

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Cesa-V
2026-06-16 01:00:48 -03:00
parent f0d72f8189
commit 4d8554df38
4 changed files with 119 additions and 17 deletions

View File

@@ -49,16 +49,72 @@ db/pre_process/relatorio_ciclo_inspecoes_c105_2805_2026-06-15/relatorio_ciclo_in
db/pre_process/relatorio_ciclo_inspecoes_c105_2805_2026-06-15/relatorio_ciclo_inspecoes_c105_2805_2026-06-15_inspecoes.csv
```
## Modelo OAMRP inicial
## Modelo OAMRP v3 (modelo atual)
O arquivo `software/oamrp_v1.py` contém um protótipo de modelo MIP em PuLP para o Aircraft Routing do Esquadrão Arara. O modelo usa dados sintéticos/substituíveis de aeronaves e missões e busca maximizar o cumprimento ponderado de missões opcionais.
O arquivo `software/oamrp_v3.py` é o modelo principal. Implementa o *Operational Aircraft Maintenance Routing Problem* (Al-Thani, Ben Ahmed, Haouari, 2016, Transportation Research Part C, vol. 72, pp. 2944) sobre uma rede espaço-tempo com arcos de ferry.
Restrições representadas no protótipo:
### Rede espaço-tempo
- continuidade espacial e temporal por aeronave;
- turnaround mínimo entre missões;
- limite de horas de célula até a próxima inspeção;
- base inicial e horas acumuladas reais de cada aeronave como parâmetros de entrada.
A rede tem quatro tipos de nó:
| Tipo | Descrição |
| --- | --- |
| `origem` | Nó de partida de cada aeronave (base inicial, t=0) |
| `missao` | Uma missão específica; `aeronave_id=None` (qualquer aeronave pode voar) |
| `inspecao` | Nó de manutenção; exclusivo de uma aeronave (`aeronave_id=k`) |
| `sumidouro` | Nó de chegada ao fim do horizonte |
Os arcos são: `inicio`, `missao_missao`, `missao_insp`, `insp_missao`, `missao_fim` e `ferry` (quando bases forem distintas). Ferry usa velocidade 430 km/h e distância haversine.
### Nomenclatura (Al-Thani, 2016)
| Símbolo | Significado | Campo no código |
| --- | --- | --- |
| F | Intervalo máximo legal entre manutenções | `InspecaoParam.f_max` |
| f_k | Horas acumuladas no início | `Aeronave.f0` |
| LRT = F f_k | Tempo legal restante (decresce) | `lrt_inicial()` |
| H[k,i,nid] | Horas acumuladas em tempo real (cresce, reseta na inspeção) | `H[k,seq,nid]` |
### Restrições implementadas
- **C1**: cada missão coberta por no máximo uma aeronave.
- **C2**: conservação de fluxo em nós de missão e inspeção.
- **C3**: continuidade espacial (base de chegada = base de partida do próximo arco; ferry gerado automaticamente).
- **C4**: continuidade temporal (partida ≥ chegada + TAT 1,5h).
- **C5**: missões EVAM (`obrigatoria=True`) devem ser cumpridas.
- **C6**: `H[k,i,nid] ≤ f_max` para cada tipo de inspeção, com reset após nó de inspeção.
- **C9**: downtime de inspeção (aeronave fica indisponível durante o slot de manutenção).
- **C11**: slot único de inspeção por base — no máximo uma aeronave em manutenção a cada instante.
### Objetivos
- **L1**: maximizar cobertura ponderada `Σ prioridade_m × z_m` (missões cobertas).
- **L2**: maximizar horas voadas, dado o L1 fixado.
### Execução típica
```powershell
python software/oamrp_v3.py --sintetico --seed 42 --aleatorio --ofrag db/processed/ofrag.csv
```
Gera missões sintéticas cross-base, sorteia `f0` aleatório e carrega prioridades do OFRAG.
### Scripts auxiliares
| Script | Função |
| --- | --- |
| `software/gerar_ofrag.py` | Gera `db/processed/ofrag.csv` com ordens de missão (OFRAG), prioridades 15 e tipo |
| `software/visualizar_resultado.py` | Lê o CSV de resultado e gera `db/processed/mapa_rotas.html` (mapa Folium interativo) |
### Resultado validado (2026-06-16)
Rodada sintética com 50 missões, seed 42, horas iniciais aleatórias e OFRAG: 50/50 missões cumpridas, solver CBC Optimal, todas as 4 EVAMs operacionais.
---
## Modelo OAMRP v1 (protótipo inicial)
O arquivo `software/oamrp_v1.py` contém o protótipo inicial, substituído pelo v3. Mantido no repositório para referência histórica.
Campos extraídos e estruturados:

View File

@@ -87,6 +87,33 @@ Formato:
- A remocao foi aplicada no script de pre-processamento para manter reprodutibilidade.
## v0.7 — VTO — 2026-06
### Corrigido
- Bug crítico de conservação de fluxo em nós de inspeção (`oamrp_v3.py`): o solver criava unidades de fluxo fantasma nesses nós, fazendo o relatório exibir 50/50 enquanto o CSV real tinha apenas 16 missões cobertas. Corrigido adicionando C2 para nós `tipo == "inspecao"`.
- Bug de restrição C6 Fase 1 simplificada removida: somava horas totais sem respeitar resets de inspeção, tornando EVAMs 2809 e 2811 artificialmente ociosas. As variáveis `H[k,seq,nid]` com reset já impõem o limite corretamente.
### Adicionado
- Flag `--aleatorio` na CLI: sorteia `f0` entre 10% e 90% de `F_max` por aeronave e tipo de inspeção.
- Tabela OFRAG em `db/processed/ofrag.csv` com 50 ordens sintéticas (prioridades 15, tipo de missão, OM).
- Script `software/gerar_ofrag.py` para gerar ou regen a tabela OFRAG de forma reprodutível.
- Flag `--ofrag` na CLI: carrega prioridades do CSV ao gerar missões sintéticas.
- Visualização interativa `db/processed/mapa_rotas.html` via Folium, com uma camada por aeronave, missões não cumpridas tracejadas e popup com detalhes.
- Script `software/visualizar_resultado.py` para gerar o mapa a partir do CSV de resultado.
### Alterado
- Nomenclatura alinhada com Al-Thani (2016): `lrt_h``f_max`; `horas_iniciais``f0`; `orcamento_h()``lrt_inicial()`; `horas_iniciais_aleatorias()``gerar_f0_aleatorio()`; `carregar_horas_iniciais()``carregar_f0()`; CLI `--horas-iniciais``--f0`.
- Relatório imprime `F_max=`, `f0=` e `LRT_ini=` para cada aeronave, alinhado com a formulação do artigo de referência.
### Resultado validado
Rodada `--sintetico --seed 42 --aleatorio --ofrag db/processed/ofrag.csv` → 50/50 missões cumpridas, solver CBC Optimal, todas as 4 EVAMs com voos e ferry.
---
## v0.6 - VTO - 2026-06
### Adicionado