Corrige acentuacao dos textos
This commit is contained in:
@@ -1,2 +1 @@
|
||||
"""Planejador de missao e sobreaviso por MILP."""
|
||||
|
||||
"""Planejador de missão e sobreaviso por MILP."""
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
"""Regras operacionais de disponibilidade, qualificacao e progressao."""
|
||||
"""Regras operacionais de disponibilidade, qualificação e progressão."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 = []
|
||||
|
||||
Reference in New Issue
Block a user