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:
6
LOG.md
6
LOG.md
@@ -32,3 +32,9 @@ Legenda de autores:
|
||||
| 2026-06-15 | 22:30 | VTO | Implementou Fase 2: inspeções na rede espaço-tempo | `software/oamrp_v3.py` | Adicionados nós INSP_{k}_{seq} e arcos missao_insp/insp_missao; variáveis H_{k,i,nid} para rastreamento de horas com reset; C9 downtime; C11 slot único via disjuntivas. |
|
||||
| 2026-06-15 | 23:00 | VTO | Substituiu dados reais por missões sintéticas cross-base | `software/oamrp_v3.py`; `db/processed/resultado_oamrp_sintetico.csv` | Dados reais de jan/2025 eram todos SBMN→SBMN (voos locais), não exercitando roteamento; gerador sintético cria 50 missões cross-base entre 10 bases com distâncias reais (haversine) e velocidade C-105; flag --sintetico na CLI. |
|
||||
| 2026-06-15 | 23:30 | VTO | Implementou Fase 3: arcos de ferry (C3 relaxado) | `software/oamrp_v3.py` | Arcos inicio/missao_missao/missao_insp/insp_missao agora permitem bases diferentes com tempo de ferry (haversine/430 km/h); ferry consome horas de célula no relógio de inspeção (C6); relatório imprime segmentos de ferry na linha do tempo. |
|
||||
| 2026-06-16 | 10:00 | VTO | Corrigiu bug de conservação de fluxo em nós de inspeção | `software/oamrp_v3.py` | Nós INSP_{k}_{seq} não tinham restrição entrada_k==saida_k; solver criava/destruía unidades de fluxo nesses nós, inflando cobertura para 50/50 no relatório com apenas 16 missões reais nas rotas; corrigido adicionando C2 para nós de inspeção. |
|
||||
| 2026-06-16 | 10:05 | VTO | Removeu restrição C6 Fase 1 simplificada | `software/oamrp_v3.py` | Restrição somava horas totais sem respeitar resets de inspeção, tornando EVAMs 2809/2811 artificialmente ociosas; variáveis H[k,seq,nid] já cobrem isso corretamente com reset nos nós de inspeção. |
|
||||
| 2026-06-16 | 10:10 | VTO | Adicionou horas iniciais aleatórias e prioridades via OFRAG | `software/oamrp_v3.py`; `software/gerar_ofrag.py`; `db/processed/ofrag.csv` | Flag --aleatorio sorteia f0 entre 10%–90% de F_max por aeronave; gerar_ofrag.py cria tabela com id_ofrag, missao_id, prioridade (1–5), tipo_missao; --ofrag na CLI carrega prioridades ao gerar missões sintéticas. |
|
||||
| 2026-06-16 | 10:20 | VTO | Alinhou nomenclatura com Al-Thani (2016) | `software/oamrp_v3.py` | lrt_h→f_max (batente fixo F); horas_iniciais→f0 (acumulado inicial f_k); orcamento_h()→lrt_inicial() (LRT=F_max−f0); horas_iniciais_aleatorias()→gerar_f0_aleatorio(); carregar_horas_iniciais()→carregar_f0(); CLI --horas-iniciais→--f0. |
|
||||
| 2026-06-16 | 10:30 | VTO | Criou visualização interativa de rotas | `software/visualizar_resultado.py`; `db/processed/mapa_rotas.html` | Mapa Folium com rotas por aeronave (cor distinta), missões não cumpridas tracejadas em cinza, popup com detalhes, legenda de prioridades. |
|
||||
| 2026-06-16 | 10:35 | VTO | Rodada sintética validada: 50/50 missões cumpridas | `db/processed/resultado_oamrp_sintetico.csv` | Comando: --sintetico --seed 42 --aleatorio --ofrag; solver CBC retornou Optimal; todas as 4 EVAMs voaram com ferry; commit f0d72f8 enviado ao remote. |
|
||||
|
||||
33
README.md
33
README.md
@@ -146,22 +146,35 @@ git push
|
||||
|
||||
## Estado atual
|
||||
|
||||
Já existe um pré-processamento do relatório de ciclo de inspeções da aeronave C-105 matrícula 2805, com data de relatório `2026-06-15`.
|
||||
O modelo ativo é `software/oamrp_v3.py`, que implementa o OAMRP sobre uma rede espaço-tempo com arcos de ferry, múltiplos tipos de inspeção e prioridades de missão via OFRAG.
|
||||
|
||||
Também existe um primeiro protótipo em `software/oamrp_v1.py`, que formula um modelo MIP compacto em PuLP para atribuir aeronaves a missões de transporte, respeitando continuidade espacial/temporal, turnaround mínimo e limite de horas até inspeção.
|
||||
Última rodada validada (2026-06-16): 50/50 missões sintéticas cumpridas, solver CBC Optimal, 4 EVAMs operacionais.
|
||||
|
||||
Arquivos principais:
|
||||
Arquivos principais do modelo:
|
||||
|
||||
```text
|
||||
db/raw/relatorio_ciclo_inspecoes_c105_2805_2026-06-15.pdf
|
||||
db/pre_process/relatorio_ciclo_inspecoes_c105_2805_2026-06-15/preprocess_pdf.py
|
||||
db/pre_process/relatorio_ciclo_inspecoes_c105_2805_2026-06-15/relatorio_ciclo_inspecoes_c105_2805_2026-06-15_texto.txt
|
||||
db/pre_process/relatorio_ciclo_inspecoes_c105_2805_2026-06-15/relatorio_ciclo_inspecoes_c105_2805_2026-06-15_inspecoes.json
|
||||
db/pre_process/relatorio_ciclo_inspecoes_c105_2805_2026-06-15/relatorio_ciclo_inspecoes_c105_2805_2026-06-15_inspecoes.csv
|
||||
software/oamrp_v1.py
|
||||
software/oamrp_v3.py — modelo MIP principal
|
||||
software/gerar_ofrag.py — gerador da tabela OFRAG
|
||||
software/visualizar_resultado.py — mapa Folium interativo
|
||||
db/processed/ofrag.csv — ordens de missão com prioridades 1–5
|
||||
db/processed/resultado_oamrp_sintetico.csv — resultado da última rodada
|
||||
db/processed/mapa_rotas.html — mapa interativo de rotas
|
||||
```
|
||||
|
||||
Esse processamento extraiu 18 inspeções e separou campos como inspeção, referência, vencimento, TSO, letra, nível, duração, intervalo por horas de voo, meses contínuos e pousos.
|
||||
Para rodar:
|
||||
|
||||
```powershell
|
||||
python software/oamrp_v3.py --sintetico --seed 42 --aleatorio --ofrag db/processed/ofrag.csv
|
||||
python software/visualizar_resultado.py
|
||||
```
|
||||
|
||||
Pré-processamentos disponíveis:
|
||||
|
||||
```text
|
||||
db/raw/relatorio_ciclo_inspecoes_c105_2805_2026-06-15.pdf — ciclo de inspeções C-105/2805
|
||||
db/processed/registro_voo_2025.csv — registro de voo 2025 limpo (1420 trechos)
|
||||
db/processed/registro_voo_2025_consolidado.csv — consolidado para roteamento
|
||||
```
|
||||
## Atualizacao - registro de voo 2025
|
||||
|
||||
A `Planilha 2025.xlsx` foi pre-processada a partir de `db/raw/` sem alterar o arquivo original.
|
||||
|
||||
@@ -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