Files
fleet-assignment/modelos.ipynb

476 lines
59 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "4c8870e1",
"metadata": {},
"source": [
"# Alocação de Frotas (Fleet Scheduling) - Aeronaves C-97\n",
"\n",
"Este projeto visa realizar a alocação de frota (Fleet Assignment) baseada nos princípios do livro referenciado *Airline Operations and Scheduling*.\n",
"Diferentemente do modelo anterior que utilizava aeronaves de carga, este foca exclusivamente na aeronave de passageiros **C-97**.\n",
"\n",
"## Objetivos:\n",
"1. Remover cálculos de aeronaves de carga.\n",
"2. Analisar as demandas diárias para a aeronave C-97.\n",
"3. Identificar os esquadrões detentores dessas aeronaves e a quantidade de aeronaves (matrículas únicas).\n",
"4. Calcular os 5 trechos mais relevantes do ano de 2025 utilizando estatística e gráficos.\n",
"5. Realizar o Fleet Assignment para os 5 trechos, visando minimizar o custo total da operação (Modelo 1 proposto).\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "05ab3533",
"metadata": {
"execution": {
"iopub.execute_input": "2026-06-07T23:14:33.557540Z",
"iopub.status.busy": "2026-06-07T23:14:33.557102Z",
"iopub.status.idle": "2026-06-07T23:14:34.031487Z",
"shell.execute_reply": "2026-06-07T23:14:34.030774Z"
}
},
"outputs": [],
"source": [
"# Importação de bibliotecas\n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import pulp\n",
"import pymap3d as pm\n",
"import math\n",
"\n",
"# Configuração de estilo para os gráficos\n",
"sns.set_theme(style=\"whitegrid\")\n",
"\n",
"# Constantes globais\n",
"CSV_FILEPATH = \"SISCO_AEREA_01-01-2025_A_31-12-2025_1911251714Z.csv\"\n",
"JSON_AEROPORTOS = \"airports.json\"\n",
"CAPACIDADE_C97 = 30 # Capacidade média de passageiros do C-97 (Brasília)\n"
]
},
{
"cell_type": "markdown",
"id": "4fa3e096",
"metadata": {},
"source": [
"## 1. Leitura e Limpeza dos Dados\n",
"Vamos carregar os dados, filtrar apenas para o modelo `C-97` e tratar os campos de localidades e datas.\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "c3db41e8",
"metadata": {
"execution": {
"iopub.execute_input": "2026-06-07T23:14:34.033030Z",
"iopub.status.busy": "2026-06-07T23:14:34.032852Z",
"iopub.status.idle": "2026-06-07T23:14:34.384932Z",
"shell.execute_reply": "2026-06-07T23:14:34.384238Z"
}
},
"outputs": [],
"source": [
"# Carregamento do banco de dados\n",
"df = pd.read_csv(CSV_FILEPATH, low_memory=False)\n",
"df_aeroportos = pd.read_json(JSON_AEROPORTOS, orient='index')\n",
"\n",
"# Tratamento básico de valores nulos expressos como 'NIL'\n",
"df.replace('NIL', 0, inplace=True)\n",
"\n",
"# Filtro para a aeronave C-97 (Passageiros) e remoção de registros de carga\n",
"df_c97 = df[df['Modelo'] == 'C-97'].copy()\n",
"\n",
"# Filtrando decolagens e pousos conhecidos\n",
"df_c97 = df_c97[df_c97['Localidade Decolagem'] != 0]\n",
"df_c97 = df_c97[df_c97['Localidade Pouso'] != 0]\n",
"\n",
"# Criação da coluna Trecho\n",
"df_c97['Trecho'] = df_c97['Localidade Decolagem'] + '-' + df_c97['Localidade Pouso']\n",
"\n",
"# Conversão da coluna PAX para numérico\n",
"df_c97['PAX'] = pd.to_numeric(df_c97['PAX']).fillna(0)\n",
"\n",
"# Tratamento de datas\n",
"df_c97['Dep TimeStamp'] = pd.to_datetime(df_c97['Data de Decolagem'] + ' ' + df_c97['Hora de Decolagem'], format='mixed', dayfirst=True)\n",
"df_c97['Data Apenas'] = df_c97['Dep TimeStamp'].dt.date\n"
]
},
{
"cell_type": "markdown",
"id": "eb0597db",
"metadata": {},
"source": [
"## 2. Análise dos Esquadrões e Matrículas (Aeronaves)\n",
"Identificaremos quais esquadrões operam o C-97 e qual a disponibilidade de aeronaves (número de matrículas únicas), pois isso definirá as restrições de frota.\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "645a0fe0",
"metadata": {
"execution": {
"iopub.execute_input": "2026-06-07T23:14:34.386323Z",
"iopub.status.busy": "2026-06-07T23:14:34.386204Z",
"iopub.status.idle": "2026-06-07T23:14:34.397293Z",
"shell.execute_reply": "2026-06-07T23:14:34.396780Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Esquadrões que operam o C-97: ETA1, ETA3, ETA5, ETA6, ETA7, ETA2, PAMA SP\n",
"Total de matrículas únicas (aeronaves disponíveis): 14\n",
"\n",
"Aeronaves por esquadrão:\n",
" - ETA1: 1 aeronaves\n",
" - ETA2: 1 aeronaves\n",
" - ETA3: 3 aeronaves\n",
" - ETA5: 1 aeronaves\n",
" - ETA6: 4 aeronaves\n",
" - ETA7: 3 aeronaves\n",
" - PAMA SP: 1 aeronaves\n",
"\n",
"Bases inferidas por esquadrão (pela moda de decolagens):\n",
" - ETA1: SBBE\n",
" - ETA2: SBNT\n",
" - ETA3: SBGL\n",
" - ETA5: SBCO\n",
" - ETA6: SBBR\n",
" - ETA7: SBMN\n",
" - PAMA SP: SBGR\n"
]
}
],
"source": [
"# Obtendo esquadrões e matrículas únicas\n",
"esquadroes = df_c97['Emissor'].unique()\n",
"matriculas_unicas = df_c97['Matrícula'].unique()\n",
"total_aeronaves = len(matriculas_unicas)\n",
"\n",
"print(f\"Esquadrões que operam o C-97: {', '.join(esquadroes)}\")\n",
"print(f\"Total de matrículas únicas (aeronaves disponíveis): {total_aeronaves}\")\n",
"\n",
"# Aeronaves por esquadrão\n",
"aeronaves_por_esquadrao = df_c97.groupby('Emissor')['Matrícula'].nunique().to_dict()\n",
"print(\"\\nAeronaves por esquadrão:\")\n",
"for esq, qtd in aeronaves_por_esquadrao.items():\n",
" print(f\" - {esq}: {qtd} aeronaves\")\n",
" \n",
"# Identificar a base principal de cada esquadrão (aeroporto com mais decolagens)\n",
"bases_esquadroes = {}\n",
"for esq in aeronaves_por_esquadrao.keys():\n",
" base = df_c97[df_c97['Emissor'] == esq]['Localidade Decolagem'].mode()[0]\n",
" bases_esquadroes[esq] = base\n",
"\n",
"print(\"\\nBases inferidas por esquadrão (pela moda de decolagens):\")\n",
"for esq, base in bases_esquadroes.items():\n",
" print(f\" - {esq}: {base}\")\n"
]
},
{
"cell_type": "markdown",
"id": "064c1b5d",
"metadata": {},
"source": [
"## 3. Análise Estatística das Demandas Diárias\n",
"Para definir os trechos mais relevantes do ano, calcularemos a demanda de passageiros (PAX) agregada diariamente. Em seguida, extraímos a **média de passageiros diários** e o **desvio padrão** para cada trecho. A relevância será determinada pela maior média de demanda diária de PAX.\n",
"Começaremos focando em 5 trechos (alvo variável).\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "41750d35",
"metadata": {
"execution": {
"iopub.execute_input": "2026-06-07T23:14:34.398764Z",
"iopub.status.busy": "2026-06-07T23:14:34.398643Z",
"iopub.status.idle": "2026-06-07T23:14:34.668556Z",
"shell.execute_reply": "2026-06-07T23:14:34.667962Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Trecho</th>\n",
" <th>Media_PAX_Diario</th>\n",
" <th>Desvio_Padrao_PAX</th>\n",
" <th>Total_PAX</th>\n",
" <th>Dias_Operados</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>223</th>\n",
" <td>SBGL-SBBR</td>\n",
" <td>0.980822</td>\n",
" <td>4.097998</td>\n",
" <td>358.0</td>\n",
" <td>38</td>\n",
" </tr>\n",
" <tr>\n",
" <th>69</th>\n",
" <td>SBBR-SBGL</td>\n",
" <td>0.794521</td>\n",
" <td>3.483710</td>\n",
" <td>290.0</td>\n",
" <td>34</td>\n",
" </tr>\n",
" <tr>\n",
" <th>272</th>\n",
" <td>SBGR-SBBR</td>\n",
" <td>0.476712</td>\n",
" <td>2.481277</td>\n",
" <td>174.0</td>\n",
" <td>21</td>\n",
" </tr>\n",
" <tr>\n",
" <th>72</th>\n",
" <td>SBBR-SBGR</td>\n",
" <td>0.487671</td>\n",
" <td>2.420831</td>\n",
" <td>178.0</td>\n",
" <td>21</td>\n",
" </tr>\n",
" <tr>\n",
" <th>253</th>\n",
" <td>SBGL-SBSJ</td>\n",
" <td>0.263014</td>\n",
" <td>1.619550</td>\n",
" <td>96.0</td>\n",
" <td>20</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Trecho Media_PAX_Diario Desvio_Padrao_PAX Total_PAX Dias_Operados\n",
"223 SBGL-SBBR 0.980822 4.097998 358.0 38\n",
"69 SBBR-SBGL 0.794521 3.483710 290.0 34\n",
"272 SBGR-SBBR 0.476712 2.481277 174.0 21\n",
"72 SBBR-SBGR 0.487671 2.420831 178.0 21\n",
"253 SBGL-SBSJ 0.263014 1.619550 96.0 20"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA9gAAAJICAYAAACaO0yGAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAAehBJREFUeJzt3QmczdX/x/GPfSdbpCS7iCKKihRRKqFfiRSlUmTLrk2ypcgSIcqetNMqWUtZKkt2smeXfY35P97n//jO484YzPKd5s53Xs/HYx4zc++de8/93nPvfD/nfM7npIqIiIgwAAAAAACQIKkT9ucAAAAAAIAAGwAAAAAAnzCDDQAAAACADwiwAQAAAADwAQE2AAAAAAA+IMAGAAAAAMAHBNgAAAAAAPiAABsAAAAAAB8QYAMAAF9FRERwRAEAKRIBNgCYWdeuXa1kyZIX/XrssccS9Vh17Ngxxsf97rvvYry92nOpNut5JabPPvvMPc727dstKdx5553u8Tt06HDB2zz88MPuNkOHDo3zfSfk+OmYxPSaXHfddXbrrbfa888/b5s2bYrTfS5cuNDdh76Ho8OHD1vnzp1tyZIl/9ljLl++3GrXrm2nT592v8d0zMuVK2f33nuvvffee3bu3LlEfS+EfpUtW9b1o5dfftl27doV5fbqj7rNf0X98dVXX7UaNWq4dt1222327LPP2k8//WTJSULflzH55JNP7JlnnvH1PgGkXGmTugEAEA5atmxpjzzySOTvw4cPt1WrVtk777wTeVnWrFkTtQ1r1qyx++6777xA/pprronx9jpZPnr0aOTvr732WuTlnly5clnQpU6d2mbPnm2nTp2yDBkynBdULFu2LF73q9fej9f8ueees+rVq0f+fuLECVu5cqWNGDHCnnzySTeAEr3dydXq1avtyy+/tAcffPA/eTy95l26dLFOnTpZ+vTpIy//3//+Zw899FCUYz5jxgx766233CDAxQZkEkr9Jm/evJGPu379ehs1apTNnDnTPvroI7v66qvddWpf1apV7b/wyy+/WKtWrSx//vz21FNPWdGiRe3AgQP21VdfWfPmza1p06bWvXt3S6nUXydNmuQCbfUdAEgIAmwAMHMnvd6JrxeY6oT9hhtu+M8CBc1m6kQ3to9ZrFixKL97weB/1eZwUaFCBTdjOm/ePLvrrruiXPfNN9/Y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NmvWLDt48KALsm+55RZr1aqVFSpUKHFaCgAAAABAkAJsKVOmjA0ZMsT/1gAAAAAAkJICbK23Xrt2rZ0+fdrthy3nzp1zKeJLliyxjh07+t1OAAAAAACCFWAvXLjQbcd16NChGK/PkiULATYAAAAAIMWJc4Ctfa615vr111+3adOmWerUqa1BgwY2b948+/DDD+29995LnJYCAAAAABCkAFup4b169bK77rrLjhw54gqe3X777e7rzJkz9u6779qoUaMSp7UAAAAAAARlH2yttc6XL5/7WRXD169fH3ld7dq1bdWqVf62EAAAAACAIAbYV199tZvFlsKFC7vCZn/99Zf7/d9//7Vjx47530oAAAAAAIIWYN9///321ltv2cSJEy1Xrlx23XXXufXY2hN72LBhVqxYscRpKQAAAAAAQQqwn3rqKXvkkUds2bJl7vdXX33VVq9ebS1btnQz2Z07d06MdgIAAAAAEKwiZ5s2bbIuXbpE/l62bFmbOXOmC66LFCliWbNm9buNAAAAAAAEbwa7cePG9sUXX0S5TEF1uXLlCK4BAAAAAClWnAPsdOnSuX2wAQAAAABAAlLE27Zta/3793d7YJcqVcoyZ8583m0KFCgQ17sFAAAAACBlBdg9evSws2fPWqdOnS54GxU9AwAAAAAgJYlzgN2rV6/EaQkAAAAAACkpwK5fv37itAQAAAAAgJQUYMvp06ftk08+sQULFtjevXutT58+tmjRIitTpoyrJg4AAAAAQEoT5yriBw4csAcffNB69+5tW7ZsseXLl9vJkydtzpw59thjj9kff/yROC0FAAAAACBIAbYqiB87dsy++eYb+/zzzy0iIsJdPmTIECtbtqz7DgAAAABAShPnAHv27Nluq65ChQpZqlSpIi/PkCGDPfnkk7Zy5Uq/2wgAAAAAQPAC7FOnTtlll10W43Vp0qSxM2fO+NEuAAAAAACCHWArDXzy5MkxXjd9+nS77rrr/GgXAAAAAADBriKu9PBmzZrZAw88YLfffrtLE//qq69s6NCh9tNPP9no0aMTp6UAAAAAAARpBrtixYr2wQcfWKZMmVwwrSJnY8eOddt1jRw50ipXrpw4LQUAAAAAIGj7YFeqVMmmTJnituc6dOiQZc2a1bJkyeJ/6wAAAAAACHKALUoHX7x4sR08eNDy5MljVapUcbPbAAAAAACk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3Sy1guwqVapYixYt3OV9+/Z1s9kdOnRIjHYCAAAAABCsGexcuXLZmDFjzrt88uTJLsAGAAAAACAlinOA7dm/f7+dPn3aFTmTc+fO2fr1623JkiXWqFEjP9sIAAAAAEDwAuw1a9ZYx44dbePGjTFenypVKgJsAAAAAECKE+cAu3///nbo0CHr0qWLzZ4929KnT2933HGHzZs3z32NHz8+cVoKAAAAAECQipwtW7bM2rZta82aNbM6derYiRMnrHHjxjZixAirWbOmTZgwIXFaCgAAAABAkAJsrbv29r3Wd6WMexo0aGBLly71t4UAAAAAAAQxwFal8G3btkUG2EePHrXt27e735UurvRxAAAAAABSmjgH2LVq1bIBAwbY999/b/ny5bMiRYrYoEGDbO3atfb+++9bwYIFE6elAAAAAAAEKcB+/vnnrUKFCvbJJ5+437t162Y//PCD1atXz3799Vdr3bp1YrQTAAAAAIBgVRHPkCGDDRkyxM6cOeN+r1q1qk2fPt1WrlxpZcqUsauvvjox2gkAAAAAQLACbE+6dOkif1ZQTWANAAAAAEjJYhVg16hRw4YNG2alSpWyO++801KlSnXB2+q6mTNn+tlGAAAAAACCEWDfdNNNliVLlsifLxZgAwAAAACQEsUqwO7bt2/kz/369UvM9gAAAAAAkDLWYJ86dcpWrFhhe/fudTPZ+fPnt9KlS7s9sAEAAAAASKliHWAfPHjQBg4caF988YWrIB4REeEuV5CdOXNme/DBB61NmzaWNWvWxGwvAAAAAADJN8A+dOiQNWrUyLZv3261atWyW2+91fLkyeOC7N27d9vPP/9skydPdvtgf/jhh5HrtQEAAAAASCliFWCPGDHCpYQriC5btux51z/88MO2evVqa9asmb3//vvWunXrxGgrAAAAAABhK3VsbjRr1ix75plnYgyuPddee60LsGfMmOFn+wAAAAAACE6AvWvXrosG155y5cq5NHIAAAAAAFKa1LGtHK5CZpeitdcnT570o10AAAAAAAQvwPaqhftxGwAAAAAAUnSADQAAAAAAfNgHu2HDhrG9KQAAAAAAKU6sAuznn38+8VsCAAAAAEAyRoANAAAAAIAPWIMNAAAAAIAPCLABAAAAAPABATYAAAAAAD4gwAYAAAAAwAcE2AAAAAAA/Jf7YIc6cOCAjRkzxhYsWGB79+610aNH28yZM61UqVJWs2ZNP9oFAAAAAECwZ7C3bdtmdevWtalTp1q+fPls//79dvbsWdu0aZO1adPG5syZkzgtBQAAAAAgSDPYb7zxhuXOndsmTJhgmTNntuuuu85dPmDAADt16pSNGDHCqlevHq/GjBw50n766Sd3356XXnrJPv744yi3u/LKK23WrFnxegwAAAAAAMIiwP7ll1+sT58+lj17djdzHaphw4bWrl27eDVk0qRJNmjQIKtYsWKUy9euXWvPPvusNWnSJPKyNGnSxOsxAAAAAAAIqzXYadPG/GenT5+2VKlSxem+du/eba+++qotXLjQrrnmmijXRURE2IYNG+yZZ56xvHnzxqepAAAAAACE5xpszTArlfv48eORlymoPnfunH344YdWoUKFON3fypUrLV26dDZt2jS7/vrro1y3detW9zhFihSJazMBAAAAAAjvGewOHTpYo0aNrFatWnbzzTe74FoVxTdu3GhbtmyxyZMnx+n+7rzzTvcVk3Xr1rnvWpM9b948S506tVWrVs3at29v2bJli2vTAQAAAAAInwC7RIkS9umnn9rQoUNdWrfWQ2u7rkqVKrkCaCVLlvStcQqwFVRffvnlrniaZrT79+9v69evt3Hjxrnr4kOp56Ez8PGhgYVMmTIl6D4Az4kTJ1y/DAf0bQSxb9OvEcR+LfRt+Im+jaA6kcDPbf1tbJdCx2sNttZKq2p4YnvuueescePGljNnzsjgXmuxH374YVuxYsV5KeWxdebMGVu9enWC2qbgunTp0gm6D8Cjbe70xg8H9G0EsW/TrxHEfi30bfiJvo2g2uTD53b69On9C7D//vvvOD14gQIFzA+aofaCa0/x4sXd9127dsU7wNaa72LFiiWobXEt5gZcTOHChcNqNgQIWt+mXyOI/Vro2/ATfRtBVTiBn9sqvB1bsQqwtUY6Lh/gCZ0d9nTu3Nn27NljY8eOjbxMM9eSkABZz0V7eAPhguUGCCr6NoKIfo2gom8jqDIlcGlvXGLhWAXY2vfau9NDhw7ZW2+9ZVWqVLF77rnHpWwfPHjQZs2aZXPmzLGuXbuaX2rXrm0tW7a0d955x+rWreum9nv27Gn33XefFS1a1LfHAQAAAAAgoWIVYDdo0CDy51atWlm9evWsV69eUW5z//33W+/eve3bb7+1hg0bmh9q1KhhgwYN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sJHs9OnTxwXX7733nhUsWNCdmD3xxBOWL18+Gz16dFI3D4iXX375xUqWLGm5cuUi2EAgP7cVXOtkrVChQrZt2zZ78cUXrUSJEjZo0CA3KMrAKJIj+jaCbN68eTZkyBC77LLLrHnz5gTZsUSKOJKV3r17u+B64sSJVqpUqcjLb7rpJtu0aVOStg1ISHDdqVMnu+eee6xly5aWM2dOgmwE+nM7T548Lrg+c+ZMZHo42UdIbujbCCrv87hatWru56FDh9qYMWPcdcxkXxoBNpKNgQMHupO0adOmWYECBezff/91KYaiN7/W8gHJkf5Z3Xvvvfbrr79amjRprEWLFpcMsglGkBwMHjzYreH75ptvonxuK6jOmzdvlNt6ff3s2bPufQCEM/o2gib0vELfvd9vv/12dxlBduwRYCNZ2LJli33//fcufVYnaeJ9CEyaNMkmT55st912m1sHlSlTJrvyyivd7zqZI/BGctCtWzfr16+f/fTTT+73CwXZe/futdOnT7s+DoSzlStX2ieffGLXXXedZc+e3V3mBc76zNZnd+3atW348OGuQGWZMmWsXLlyblZbfR8IV/RtBJF3ruGdd1woyB43bpxlzZrVypYtm8QtDl+swUayoIBCabQ9e/Z0Bc0+++wzd/m7777r1mIr7VBrsPVPb8+ePe4ETbMguvzDDz90QTcQTv766y/btWuXGwRScOGlXKmAn9Y8aYDIC7JDg+uXX37Zli1bZnPmzLH06dOzbhVhTSdi2vFBKeGvvvqq+5weOXKk+1INjWuuucYWL17sqorrS26++Wb32Z45c+akbj5wQePHj7evvvqKvo1kTwP7msjSOUblypXdV6jQgf758+e7pRH33XefPf/880nU4vBHgI1kF2S/9tpr7iTtjjvusA8++MAFJDohU7ChoFpBiyqLL1y40M2OFC9ePKmbDkShGbvZs2fbvn377NixY66GgJZAqA/LG2+8ERlka022BpV2797t+vrcuXNdv2fkGMkpEFGBs8KFC7sMJM1qq4+r32fMmNH2799vp06dsqVLl7qBJz63kVzQt5Hc6dzjhx9+cBNR+ixW1qfOMS42wKnz8NWrV9uECRPYHvcCCLARtvSG14iaRs1uvfVWNxutkzAFztqSa/369W72umrVqi749gJs1u4hnGkZgzIwlI2hIFl9WumzqtC5fPlylyIr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gw8+GHnZL7/8Yq1atbL8+fPbU089ZUWLFrUDBw7YV199Zc2bN7emTZta9+7dL3q/l19+uX300Ud29dVXW1D873//s4ceesj9fObMGdu7d699+umnbuDhxRdftMcff9zXx/vuu+/sjz/+iHKZjqleF7916NDB7r//frvzzjvd6w0ASP4IsAEAYUOBYWhwmCtXLkufPr3dcMMNFhQnT560t956y81Up079/4lkCrbbtGljFSpUsGHDhlmGDBkib3/33Xfb2LFjrW/fvla8ePHIYDMmQTtWosA2+nOqU6eOtW7d2vr37++C06uuuipR25BYxzRfvnx233332ZtvvmkjRoxIlMcAAPy3SBEHACTLGWClCyvF+tZbb7WbbrrJNmzY4K6bOXOmNWjQwKVY67pevXrZ8ePHo/z90qVLXZqxAtrKlSvbCy+84ILcUH/99ZebOb7++uvd/Sgo/vfffyOvP3XqlAuGFQDrsWrVqmWjRo2yc+fOXbTtmn3V395xxx2RlymAVhvV1tDg2tOsWTMX5L377ruR64OVKt+xY0cXmOu6J554IsYUcc3GPvroo+421atXt3Hjxrn7Uzp+6HNRsHr77bfbdddd52ZVv/nmmyhtUCCrTII+ffq4NO3y5cu7Gdhjx465512tWjW78cYbXeD7zz//WGJr3769m9H+5JNP4vQ8/vzzT5cNoLbqOehYqD+I0sC9bInQtPDQn70lBMo4UB/y+oeC5LNnz8a5f6iNc+bMsXXr1iXi0QIA/FcIsAEAyZKCmffff9969+5t3bp1cym206dPd2nWRYoUccHN888/b9OmTXOp515gqpTzJk2aRAZjr732mgu6FEyHBtCaMVYQppnFe+65x62VnTJlirtO96UU5dGjR7sZZd1GgdSgQYPczPTFqD0KdDXb7NEa62uvvfaiachqw44dO2z16tWRl3377beWJUsWF3grrTy6jRs3ugBSBg4c6IJfBXm//fZb5G30XHTM9NwUpOu+FHgqgP3iiy+i3J+O986dO+3tt9+25557zqWvK81d7X/99dfdQMWPP/5oQ4YMscSm17hAgQKRzyU2z+Po0aPuOOXMmdMFzHoeJ06ccK/9kSNH3GuplHQvLfxi2QIa3PD6h2ah1Re8NfVx6R9qo2aydSwBAMkfKeIAgGRLQYyCVS+o0Sxz1apV3XfPNddc44LMuXPn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",
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Demanda diária por trecho\n",
"demanda_diaria = df_c97.groupby(['Trecho', 'Data Apenas'])['PAX'].sum().reset_index()\n",
"\n",
"# Criar um range de datas para todo o ano de 2025 para contabilizar os dias sem voo\n",
"import itertools\n",
"datas_2025 = pd.date_range(start='2025-01-01', end='2025-12-31').date\n",
"todos_trechos = demanda_diaria['Trecho'].unique()\n",
"idx = pd.MultiIndex.from_product([todos_trechos, datas_2025], names=['Trecho', 'Data Apenas'])\n",
"demanda_diaria_completa = pd.DataFrame(index=idx).reset_index()\n",
"\n",
"# Mesclar com os dados reais e preencher NaN com 0\n",
"demanda_diaria_completa = pd.merge(demanda_diaria_completa, demanda_diaria, on=['Trecho', 'Data Apenas'], how='left').fillna({'PAX': 0})\n",
"\n",
"# Estatísticas (Média e Desvio Padrão) por trecho\n",
"estatisticas_trechos = demanda_diaria_completa.groupby('Trecho').agg(\n",
" Media_PAX_Diario=('PAX', 'mean'),\n",
" Desvio_Padrao_PAX=('PAX', 'std'),\n",
" Total_PAX=('PAX', 'sum'),\n",
" Dias_Operados=('PAX', lambda x: (x > 0).sum())\n",
").reset_index()\n",
"\n",
"# Ordenar pelas rotas com maior número de dias operados\n",
"estatisticas_trechos = estatisticas_trechos.sort_values(by='Dias_Operados', ascending=False)\n",
"\n",
"# Definir número de trechos alvo\n",
"NUM_TRECHOS = 5\n",
"top_trechos = estatisticas_trechos.head(NUM_TRECHOS)\n",
"\n",
"display(top_trechos)\n",
"\n",
"# Gráfico\n",
"plt.figure(figsize=(10, 6))\n",
"sns.barplot(data=top_trechos, x='Trecho', y='Dias_Operados', hue='Trecho', palette='viridis', legend=False)\n",
"plt.title(f'Top {NUM_TRECHOS} Trechos Mais Relevantes (Por Dias Operados)')\n",
"plt.ylabel('Número de Dias Operados no Ano')\n",
"plt.xlabel('Trecho (Origem - Destino)')\n",
"plt.xticks(rotation=45)\n",
"plt.tight_layout()\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"id": "0cb78b22",
"metadata": {},
"source": [
"## 4. Fleet Assignment Model (FAM)\n",
"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.\n",
"\n",
"**Modelo Matemático:**\n",
"- **Variáveis de decisão:** $X_{s, r}$ (Quantidade de voos operados pelo esquadrão $s$ no trecho $r$)\n",
"- **Função Objetivo:** Minimizar a distância total (Distância de posicionamento da base + Distância do trecho + Retorno para a base).\n",
"- **Restrições:**\n",
" 1. O número de voos alocados para o trecho deve suprir a demanda média (Média PAX / Capacidade do C-97).\n",
" 2. O total de voos atribuídos a um esquadrão não pode exceder o número de aeronaves disponíveis naquele esquadrão no dia.\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "5747cb28",
"metadata": {
"execution": {
"iopub.execute_input": "2026-06-07T23:14:34.670051Z",
"iopub.status.busy": "2026-06-07T23:14:34.669927Z",
"iopub.status.idle": "2026-06-07T23:14:34.764631Z",
"shell.execute_reply": "2026-06-07T23:14:34.763920Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"== RESULTADO DO FLEET ASSIGNMENT ==\n",
"Status: Optimal\n",
"Distância Total Minimizada: 7591.01 km\n",
"\n",
"Alocações (Voos Diários):\n",
"\n",
"Trecho: SBGL-SBBR (Voos necessários: 1)\n",
" -> ETA3 (Base SBGL): 1 voo(s)\n",
"\n",
"Trecho: SBBR-SBGL (Voos necessários: 1)\n",
" -> ETA3 (Base SBGL): 1 voo(s)\n",
"\n",
"Trecho: SBGR-SBBR (Voos necessários: 1)\n",
" -> ETA6 (Base SBBR): 1 voo(s)\n",
"\n",
"Trecho: SBBR-SBGR (Voos necessários: 1)\n",
" -> ETA6 (Base SBBR): 1 voo(s)\n",
"\n",
"Trecho: SBGL-SBSJ (Voos necessários: 1)\n",
" -> ETA3 (Base SBGL): 1 voo(s)\n"
]
}
],
"source": [
"# Preparação dos dados para o modelo\n",
"rotas_lista = top_trechos['Trecho'].tolist()\n",
"\n",
"# Dicionário de distâncias\n",
"def calc_distancia(icao1, icao2):\n",
" try:\n",
" lat1, lon1, alt1 = df_aeroportos.loc[icao1, ['lat', 'lon', 'elevation']]\n",
" lat2, lon2, alt2 = df_aeroportos.loc[icao2, ['lat', 'lon', 'elevation']]\n",
" # Retorna a distância oblíqua em km\n",
" return pm.geodetic2aer(lat1, lon1, alt1, lat2, lon2, alt2)[2] / 1000.0\n",
" except KeyError:\n",
" return 9999.0 # Penalidade caso aeroporto não exista no json\n",
"\n",
"distancias_voo = {}\n",
"for r in rotas_lista:\n",
" origem, destino = r.split('-')\n",
" dist_trecho = calc_distancia(origem, destino)\n",
" for esq, base in bases_esquadroes.items():\n",
" dist_ida = calc_distancia(base, origem) if base != origem else 0\n",
" dist_volta = calc_distancia(destino, base) if base != destino else 0\n",
" distancias_voo[(esq, r)] = dist_ida + dist_trecho + dist_volta\n",
"\n",
"# Demanda de voos por rota (Média diária)\n",
"voos_requeridos = {}\n",
"for _, row in top_trechos.iterrows():\n",
" # Arredondamento para cima da (demanda / capacidade)\n",
" voos = math.ceil(row['Media_PAX_Diario'] / CAPACIDADE_C97)\n",
" # Pelo menos 1 voo para suprir a demanda da rota selecionada\n",
" voos_requeridos[row['Trecho']] = max(1, voos)\n",
"\n",
"# MODELAGEM COM PULP\n",
"prob = pulp.LpProblem(\"Fleet_Assignment_C97\", pulp.LpMinimize)\n",
"\n",
"# Variáveis\n",
"X = pulp.LpVariable.dicts(\"X\", [(esq, r) for esq in aeronaves_por_esquadrao.keys() for r in rotas_lista], lowBound=0, cat='Integer')\n",
"\n",
"# Função Objetivo\n",
"prob += pulp.lpSum([distancias_voo[(esq, r)] * X[(esq, r)] for esq in aeronaves_por_esquadrao.keys() for r in rotas_lista])\n",
"\n",
"# Restrição 1: Suprir a demanda da rota\n",
"for r in rotas_lista:\n",
" prob += pulp.lpSum([X[(esq, r)] for esq in aeronaves_por_esquadrao.keys()]) >= voos_requeridos[r]\n",
"\n",
"# Restrição 2: Limite de aeronaves por esquadrão\n",
"for esq in aeronaves_por_esquadrao.keys():\n",
" prob += pulp.lpSum([X[(esq, r)] for r in rotas_lista]) <= aeronaves_por_esquadrao[esq]\n",
"\n",
"# Solução\n",
"prob.solve(pulp.PULP_CBC_CMD(msg=False))\n",
"\n",
"# Exibição dos resultados\n",
"print(\"== RESULTADO DO FLEET ASSIGNMENT ==\")\n",
"print(f\"Status: {pulp.LpStatus[prob.status]}\")\n",
"print(f\"Distância Total Minimizada: {pulp.value(prob.objective):.2f} km\\n\")\n",
"\n",
"print(\"Alocações (Voos Diários):\")\n",
"for r in rotas_lista:\n",
" print(f\"\\nTrecho: {r} (Voos necessários: {voos_requeridos[r]})\")\n",
" for esq in aeronaves_por_esquadrao.keys():\n",
" qtd = int(X[(esq, r)].varValue)\n",
" if qtd > 0:\n",
" print(f\" -> {esq} (Base {bases_esquadroes[esq]}): {qtd} voo(s)\")\n"
]
}
],
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}