feat: adiciona diagrama de rede para top 5 trechos usando networkx

This commit is contained in:
2026-06-07 20:24:42 -03:00
parent 09cfda21a2
commit 2bb0c24a5d
4 changed files with 137 additions and 31 deletions

View File

@@ -27,6 +27,7 @@ import seaborn as sns
import pulp
import pymap3d as pm
import math
import networkx as nx
# Configuração de estilo para os gráficos
sns.set_theme(style="whitegrid")
@@ -155,6 +156,38 @@ plt.tight_layout()
plt.show()
"""))
# Cell: Markdown Diagrama de Rede
cells.append(nbf.v4.new_markdown_cell("""## Diagrama de Rede dos Trechos
Para melhor visualização dos trechos mais relevantes, abaixo temos um diagrama de rede conectando as origens aos destinos.
"""))
# Cell: Code Diagrama de Rede
cells.append(nbf.v4.new_code_cell("""# Criação do grafo direcionado
G = nx.DiGraph()
# Adiciona arestas com peso baseado no Score de Relevância
for _, row in top_trechos.iterrows():
origem, destino = row['Trecho'].split('-')
peso = row['Score_Relevancia']
G.add_edge(origem, destino, weight=peso)
# Configuração do layout do grafo
pos = nx.spring_layout(G, seed=42)
plt.figure(figsize=(8, 6))
# Desenha os nós
nx.draw_networkx_nodes(G, pos, node_size=2000, node_color='skyblue', edgecolors='black')
# Desenha as arestas
nx.draw_networkx_edges(G, pos, edgelist=G.edges(), arrowstyle='-|>', arrowsize=20, edge_color='gray', width=2, connectionstyle='arc3,rad=0.1')
# Desenha os rótulos (nomes dos aeroportos)
nx.draw_networkx_labels(G, pos, font_size=12, font_family='sans-serif', font_weight='bold')
plt.title('Diagrama de Rede - Top Trechos Relevantes', fontsize=14)
plt.axis('off')
plt.tight_layout()
plt.show()
"""))
# Cell 9: Markdown FAM
cells.append(nbf.v4.new_markdown_cell("""## 4. Fleet Assignment Model (FAM)
Conforme o livro base *Airline Operations and Scheduling*, o problema de alocação de frotas busca atribuir os tipos de aeronaves às pernas de voo visando minimizar o custo e as perdas de receita (spill). Como temos apenas um tipo (C-97), nosso problema adapta-se a uma **alocação de esquadrões (e suas respectivas bases)** aos voos requeridos para minimizar o custo total de operação, que é proporcional à distância voada.

File diff suppressed because one or more lines are too long

View File

@@ -8,6 +8,7 @@ dependencies = [
"jupyterlab>=4.5.8",
"matplotlib>=3.10.9",
"nbformat>=5.10.4",
"networkx>=3.6.1",
"ortools>=9.15.6755",
"pulp>=3.3.2",
"pymap3d>=3.2.0",

11
uv.lock generated
View File

@@ -171,6 +171,7 @@ dependencies = [
{ name = "jupyterlab" },
{ name = "matplotlib" },
{ name = "nbformat" },
{ name = "networkx" },
{ name = "ortools" },
{ name = "pulp" },
{ name = "pymap3d" },
@@ -183,6 +184,7 @@ requires-dist = [
{ name = "jupyterlab", specifier = ">=4.5.8" },
{ name = "matplotlib", specifier = ">=3.10.9" },
{ name = "nbformat", specifier = ">=5.10.4" },
{ name = "networkx", specifier = ">=3.6.1" },
{ name = "ortools", specifier = ">=9.15.6755" },
{ name = "pulp", specifier = ">=3.3.2" },
{ name = "pymap3d", specifier = ">=3.2.0" },
@@ -1187,6 +1189,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" },
]
[[package]]
name = "networkx"
version = "3.6.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size = 2517025, upload-time = "2025-12-08T17:02:39.908Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762", size = 2068504, upload-time = "2025-12-08T17:02:38.159Z" },
]
[[package]]
name = "notebook-shim"
version = "0.2.4"