Corrige acentuacao dos textos

This commit is contained in:
Lucas
2026-06-26 18:15:55 -03:00
parent 6443c0e2dc
commit f02167ff92
24 changed files with 174 additions and 175 deletions

View File

@@ -1,2 +1 @@
"""Planejador de missao e sobreaviso por MILP."""
"""Planejador de missão e sobreaviso por MILP."""

View File

@@ -172,13 +172,13 @@ def gerar_colunas(data_planejamento, rotas, aeronaves, cadastro, indisponibilida
candidatos = filtrar_por_horas_aeronave(candidatos, horas_disp)
if candidatos.empty:
continue
colunas.append(gerar_duplas(aplicar_prioridades(candidatos), criterio_missao, "ROTA_ACIONADA", av, data_planejamento, cadastro, indisponibilidades, progresso, catalogo, disponiveis, rota_id=rota_id + 1, rota=rota, observacao="Missao de rota acionada"))
colunas.append(gerar_duplas(aplicar_prioridades(candidatos), criterio_missao, "ROTA_ACIONADA", av, data_planejamento, cadastro, indisponibilidades, progresso, catalogo, disponiveis, rota_id=rota_id + 1, rota=rota, observacao="Missão de rota acionada"))
for av in livres:
horas_disp = horas_disponiveis(aeronaves, av)
candidatos_local = candidatos_missao(data_planejamento, av, "LOCAL", cadastro, indisponibilidades, progresso, catalogo, disponiveis)
candidatos_local = filtrar_por_horas_aeronave(candidatos_local, horas_disp)
if not candidatos_local.empty:
colunas.append(gerar_duplas(aplicar_prioridades(candidatos_local), criterio_missao, "MISSAO_LOCAL", av, data_planejamento, cadastro, indisponibilidades, progresso, catalogo, disponiveis, observacao="Missao local planejada para progressao operacional"))
colunas.append(gerar_duplas(aplicar_prioridades(candidatos_local), criterio_missao, "MISSAO_LOCAL", av, data_planejamento, cadastro, indisponibilidades, progresso, catalogo, disponiveis, observacao="Missão local planejada para progressão operacional"))
candidatos_sbv = []
for _, row in cadastro[cadastro[f"qt_{av.lower()}"]].iterrows():
if row["tripulante"] in set(disponiveis["tripulante"]) and piloto_disponivel(row["tripulante"], data_planejamento, indisponibilidades):
@@ -191,7 +191,7 @@ def gerar_colunas(data_planejamento, rotas, aeronaves, cadastro, indisponibilida
r["bloqueado"] = False
candidatos_sbv.append(r)
if len(candidatos_sbv) >= 2:
colunas.append(gerar_duplas(pd.DataFrame(candidatos_sbv), criterio_sbv, "SBV", av, data_planejamento, cadastro, indisponibilidades, progresso, catalogo, disponiveis, observacao="Sobreaviso para missao de rota"))
colunas.append(gerar_duplas(pd.DataFrame(candidatos_sbv), criterio_sbv, "SBV", av, data_planejamento, cadastro, indisponibilidades, progresso, catalogo, disponiveis, observacao="Sobreaviso para missão de rota"))
if not colunas:
return pd.DataFrame()
df = pd.concat(colunas, ignore_index=True)

View File

@@ -1,4 +1,4 @@
"""Leitura das bases de entrada e escrita do historico operacional."""
"""Leitura das bases de entrada e escrita do histórico operacional."""
from __future__ import annotations

View File

@@ -51,7 +51,7 @@ def executar_planejamento(base_dir: Path) -> dict:
# Bloco 03 - Modelo MILP e selecao final.
solucao = resolver_milp(colunas, rotas, aeronaves)
# Bloco 04 - Persistencia operacional e relatorio.
# Bloco 04 - Persistência operacional e relatório.
registros = gerar_registros(solucao, catalogo)
salvar_historico(base_dir, registros)
arquivo_saida = gerar_excel(base_dir, parametros["data_planejamento"], solucao)

View File

@@ -16,7 +16,7 @@ def resolver_milp(colunas: pd.DataFrame, rotas: pd.DataFrame, aeronaves: pd.Data
bounds = Bounds(np.zeros(n), np.ones(n))
restricoes = []
# R1 - Cada tripulante aparece no maximo uma vez.
# R1 - Cada tripulante aparece no máximo uma vez.
for trip in sorted(set(colunas["trip1"]).union(set(colunas["trip2"]))):
linha = np.zeros(n)
linha[(colunas["trip1"] == trip) | (colunas["trip2"] == trip)] = 1
@@ -28,7 +28,7 @@ def resolver_milp(colunas: pd.DataFrame, rotas: pd.DataFrame, aeronaves: pd.Data
idx_local = (colunas["aeronave"] == av) & (colunas["tipo_escala"] == "MISSAO_LOCAL")
idx_sbv = (colunas["aeronave"] == av) & (colunas["tipo_escala"] == "SBV")
if not (idx_rota | idx_sbv).any():
raise RuntimeError(f"Modelo inviavel: nao ha rota nem SBV candidato para a aeronave {av}.")
raise RuntimeError(f"Modelo inviável: não há rota nem SBV candidato para a aeronave {av}.")
linha = np.zeros(n)
linha[idx_rota | idx_sbv] = 1
restricoes.append(LinearConstraint(linha, 1, 1))
@@ -48,13 +48,13 @@ def resolver_milp(colunas: pd.DataFrame, rotas: pd.DataFrame, aeronaves: pd.Data
for rota_id in range(1, len(rotas) + 1):
idx = (colunas["tipo_escala"] == "ROTA_ACIONADA") & (colunas["rota_id"] == rota_id)
if not idx.any():
raise RuntimeError(f"Modelo inviavel: nao ha coluna candidata para a rota acionada {rota_id}.")
raise RuntimeError(f"Modelo inviável: não há coluna candidata para a rota acionada {rota_id}.")
linha = np.zeros(n)
linha[idx] = 1
restricoes.append(LinearConstraint(linha, 1, 1))
resultado = milp(c=-colunas["score_milp"].to_numpy(dtype=float), integrality=integrality, bounds=bounds, constraints=restricoes)
if not resultado.success:
raise RuntimeError(f"MILP nao encontrou solucao viavel: {resultado.message}")
raise RuntimeError(f"MILP não encontrou solução viável: {resultado.message}")
selecionadas = resultado.x > 0.5
return colunas.loc[selecionadas].reset_index(drop=True)

View File

@@ -1,4 +1,4 @@
"""Registro de horas e geracao do relatorio Excel final."""
"""Registro de horas e geração do relatório Excel final."""
from __future__ import annotations
@@ -107,7 +107,7 @@ def gerar_excel(base_dir: Path, data_planejamento, solucao: pd.DataFrame) -> Pat
ws["A2"].font = Font(color="1F4E78", bold=True, size=18)
ws["A2"].alignment = Alignment(horizontal="center")
escrever_tabela(ws, "MISSAO ACIONADA", bloco(solucao, "ROTA_ACIONADA"), 5, 1, "C00000")
escrever_tabela(ws, "MISSÃO ACIONADA", bloco(solucao, "ROTA_ACIONADA"), 5, 1, "C00000")
escrever_tabela(ws, "VOOS LOCAIS", bloco(solucao, "MISSAO_LOCAL"), 5, 7, "548235")
escrever_tabela(ws, "SOBREAVISO", bloco(solucao, "SBV"), 5, 13, "8064A2")
for col in range(1, 18):

View File

@@ -1,4 +1,4 @@
"""Regras operacionais de disponibilidade, qualificacao e progressao."""
"""Regras operacionais de disponibilidade, qualificação e progressão."""
from __future__ import annotations

View File

@@ -1,4 +1,4 @@
"""Utilitarios pequenos de normalizacao usados em todo o planejador."""
"""Utilitários pequenos de normalização usados em todo o planejador."""
from __future__ import annotations

View File

@@ -1,4 +1,4 @@
"""Validacao retrospectiva usando voos historicos."""
"""Validação retrospectiva usando voos históricos."""
from __future__ import annotations
@@ -110,11 +110,11 @@ def otimizar_equalizacao_50(
slots = _montar_slots(voos)
if slots.empty:
raise RuntimeError("A base de 2025 nao possui linhas com horas_voadas maiores que zero.")
raise RuntimeError("A base de 2025 não possui linhas com horas_voadas maiores que zero.")
trips = sorted(set(voos["tripulante"]) & trips_cadastro)
if not trips:
raise RuntimeError("Nao ha tripulantes da base de 2025 presentes no cadastro atual.")
raise RuntimeError("Não há tripulantes da base de 2025 presentes no cadastro atual.")
pares = []
for s_idx, slot in slots.iterrows():
@@ -124,7 +124,7 @@ def otimizar_equalizacao_50(
if not linha.empty and bool(linha.iloc[0].get(qt_col, False)):
pares.append((s_idx, t_idx, float(slot["horas_voadas"])))
if not pares:
raise RuntimeError("Nao ha candidatos compativeis entre aeronaves dos voos 2025 e cadastro.")
raise RuntimeError("Não há candidatos compatíveis entre aeronaves dos voos 2025 e cadastro.")
n_x = len(pares)
n_t = len(trips)
@@ -188,7 +188,7 @@ def otimizar_equalizacao_50(
options={"time_limit": tempo_limite_segundos, "mip_rel_gap": gap_relativo},
)
if result.x is None:
raise RuntimeError(f"Validacao MILP inviavel: {result.message}")
raise RuntimeError(f"Validação MILP inviável: {result.message}")
escolhidos = result.x[:n_x] > 0.5
linhas = []