diff --git a/LOG.md b/LOG.md index 649cbb6..27fd8f7 100644 --- a/LOG.md +++ b/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. | diff --git a/README.md b/README.md index 9c0910f..810b0f8 100644 --- a/README.md +++ b/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. diff --git a/docs/about.md b/docs/about.md index df3832a..5c140b0 100644 --- a/docs/about.md +++ b/docs/about.md @@ -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: diff --git a/docs/changelog.md b/docs/changelog.md index 549efe9..26ea4bf 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -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