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:
@@ -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. 29–44) 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 1–5 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:
|
||||
|
||||
|
||||
@@ -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 1–5, 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
|
||||
|
||||
Reference in New Issue
Block a user