Files
fleet-assignment/modelos.ipynb

503 lines
66 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "3814c78f",
"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": "47c2c468",
"metadata": {
"execution": {
"iopub.execute_input": "2026-06-07T23:18:13.940499Z",
"iopub.status.busy": "2026-06-07T23:18:13.939868Z",
"iopub.status.idle": "2026-06-07T23:18:14.482559Z",
"shell.execute_reply": "2026-06-07T23:18:14.481932Z"
}
},
"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": "c61fc14a",
"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": "132e1793",
"metadata": {
"execution": {
"iopub.execute_input": "2026-06-07T23:18:14.484142Z",
"iopub.status.busy": "2026-06-07T23:18:14.483920Z",
"iopub.status.idle": "2026-06-07T23:18:14.852925Z",
"shell.execute_reply": "2026-06-07T23:18:14.851875Z"
}
},
"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": "0694381c",
"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": "8cc5a607",
"metadata": {
"execution": {
"iopub.execute_input": "2026-06-07T23:18:14.854417Z",
"iopub.status.busy": "2026-06-07T23:18:14.854270Z",
"iopub.status.idle": "2026-06-07T23:18:14.868015Z",
"shell.execute_reply": "2026-06-07T23:18:14.867338Z"
}
},
"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": "e4c88ec8",
"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": "92323d95",
"metadata": {
"execution": {
"iopub.execute_input": "2026-06-07T23:18:14.869527Z",
"iopub.status.busy": "2026-06-07T23:18:14.869395Z",
"iopub.status.idle": "2026-06-07T23:18:15.140701Z",
"shell.execute_reply": "2026-06-07T23:18:15.140134Z"
}
},
"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",
" <th>Media_PAX_Dias_Operados</th>\n",
" <th>Score_Relevancia</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",
" <td>9.421053</td>\n",
" <td>13604.0</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",
" <td>8.529412</td>\n",
" <td>9860.0</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",
" <td>8.476190</td>\n",
" <td>3738.0</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",
" <td>8.285714</td>\n",
" <td>3654.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>237</th>\n",
" <td>SBGL-SBGR</td>\n",
" <td>0.460274</td>\n",
" <td>2.575601</td>\n",
" <td>168.0</td>\n",
" <td>19</td>\n",
" <td>8.842105</td>\n",
" <td>3192.0</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",
"72 SBBR-SBGR 0.487671 2.420831 178.0 21 \n",
"272 SBGR-SBBR 0.476712 2.481277 174.0 21 \n",
"237 SBGL-SBGR 0.460274 2.575601 168.0 19 \n",
"\n",
" Media_PAX_Dias_Operados Score_Relevancia \n",
"223 9.421053 13604.0 \n",
"69 8.529412 9860.0 \n",
"72 8.476190 3738.0 \n",
"272 8.285714 3654.0 \n",
"237 8.842105 3192.0 "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA9gAAAJICAYAAACaO0yGAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAAjMZJREFUeJzt3QmcjeX///HP2Lfsa/aliIhEtFkqSZZQUVlSiopElKKISCVrhGwpkkIlkrK0KURFlspWSray78v8H+/r/7vP98wYZnFPM+ec1/PxOI+ZOcs997nPNffcn+vzua4rKjo6OtoAAAAAAMAFSXNhLwcAAAAAAATYAAAAAAD4hAw2AAAAAAA+IMAGAAAAAMAHBNgAAAAAAPiAABsAAAAAAB8QYAMAAAAA4AMCbAAAAAAAfECADQAAklV0dDRHGAAQEQiwASAOPXv2tLJly5731rp162Q9dt27d4/z986fPz/O52t/4ttnva/kNGvWLPd7/vzzT0sJdevWdb//iSeeOOdz7rrrLveckSNHJnrbF3L8dEzi+kwuv/xyu/baa61Tp062ZcuWRG1z2bJlbhv6mhodOHDAnnzySfv+++//s9+5evVqu+WWW+zEiRPu57iOeaVKley2226zN954w86cORPj9YcOHbIrrrjCKlSoYLt37z5r+1999ZWVK1fOnnvuuTh//2OPPWZXX3217dix47z7qX1ctWpVotuM2ss111xjDz/88Fmv/6/bw+HDh2306NHWuHFjq1y5slWvXt1atmxp7777rp06dcpChf6u9fftp82bN7tt6m8AQGRJl9I7AACp0SOPPOIuFD26iFy3bp299tprgfuyZcuWrPuwYcMGa9iw4VmBfIkSJeJ8fp8+fVxw4Hn++ecD93ty585t4S5NmjS2ePFiO378uGXMmPGsgOWnn35K0nb12fvxmSswql27duDno0eP2tq1a23MmDF2//33uw6U2PsdqtavX28ffvihNW/e/D/5ffrMn3rqKevRo4dlyJAhcP8dd9xhd955Z4xjvmDBAhs8eLALgII7ZD7++GO76KKL7PTp0/b++++7zyvY9ddfb61atbK33nrL6tSp426eKVOm2Keffmqvv/66FSxYMM59nDhxopUsWdJy5szp9nfIkCHWtm1by5MnT4LajF6j4F2//95773UdRTfddJN7TJ0CCm7LlCljye3vv/+2du3a2d69e905qmrVqm7fli5dagMGDHDHUedNHctIVKpUKbvxxhvthRdesJdffjmldwfAf4gAGwDiUKxYMXcLDkx1wa4szX9BF6rKZurCO6G/M/ZFtRcM/lf7nFpceeWVLmP65Zdf2s033xzjsXnz5tlll13mAr/EKl++vC/7p3YV+zOpWbOmZc2a1fr27Wvfffed1apVy5ffFWmmTZtm6dKlCwScHgW7cR1zZRmnTp3qss7p06cPVGEoiNbP7733nnXo0MF12gRTAP/tt99ar169bM6cOS44VuZcgZT+Zs+XDT1y5IgLwPV8ZU6rVavmgvzzBdhxtZlbb73VBfrahxo1ari/d93+i793lfzrmB07dsw++OADK1SoUOAxdQRo39q0aWP9+vWzV155xSLVQw895I6H2oQ6PwBEBkrEAeACfPPNN3bPPfe47I3KQpUJU2Yndsm0sqZNmzZ1pamNGjU6Z5m359dff3UllgoG/aaMlwJPZWRV0nndddfZ/v373WMKKFQ6qzJUXRjqucrkBfviiy9cdl8X8nqtSmVjl0Hq/eo5FStWdNsZP358jMcPHjxoL774oguE9Bxl6pUtDPbzzz+7C1Md2ypVqth9991nP/74Y7zvr2jRom7/4zrGCrD1/mJTZlulzHo/uhBW8KWflZ07V4m4MnQqjdVnqgBHJf07d+60pMqePftZ923fvt26devmPieVLet4qJIivrajoFAdDbo9+uijtm3btkDHjY7nSy+9FOM1amt6D8q2iQKnV1991erVq+eOpbajbGVwx4SOhT6TmTNnunJnPa9JkyauY0NUpqwgS/Q1uBLj888/t2bNmrnPXuXx+r0KPD36/epsuOGGG9x269evbxMmTDjv+1ZJ+KRJk1xbSihtW2XOXvvfuHGja7tqs/ps//rrL1cSHpsqDLzsd+/evV3lSNeuXe3SSy917eB8NBTAa2fqVNHrldFOLHX4de7c2fbt22effPLJOUvEdax1jtLfkHcs1akQ7M0333T36/NQ54KOfXA1TGw6B6iDQB0NwcG1R79LbfWjjz4KtD2dS/Q3pOoS/S61Zw3XiF3Orvejc4rK4LU/eo46M4LpPer8pTakvz+vsmjFihX2wAMPuE4LvVf9Pv3e4GEA+qyffvpp9zel56kDIPYwAe9coe3rvaiNap+8dpLQNpovXz73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AD4gwAYAAAAAwAcE2AAAAAAA+IAAGwAAAAAAHxBgAwAAAADgAwJsAAAAAAB8QIANAAAAAIAPCLABAAAAAPABATYAAAAAAD4gwAYAAAAAwAcE2AAAAAAA+IAAGwAAAAAAHxBgAwAAAADgAwJsAAAAAAB8QIANAAAAAIAPCLABAAAAAPABATYAAAAAAD4gwAYAAAAAwAcE2AAAAAAA+IAAGwAAAAAAHxBgAwAAAADgAwJsAAAAAAB8QIANAAAAAIAPCLABAAAAAPABATYAAAAAAD4gwAYAAAAAwAcE2AAAAAAA+IAAGwAAAAAAH6RL6gs3b95sf/75px06dMhy5cplF198sRUvXtyPfQIAAAAAILwD7D179tikSZPs448/tl27dll0dHTgsaioKCtSpIjdeuut1qZNG8ubN29y7C8AAAAAAKEbYJ8+fdpGjRpl48ePd5nqpk2bWsWKFa1w4cKWJUsW279/v+3cudNWrlxpixYtsilTpljbtm2tU6dOlj59+uR/FwAAAAAAhEKA3bx5c5ednjZtml1++eVxPkcB90033WRPPfWUff/99y4Yv/POO+2DDz7we58BAAAAAAjNALtnz55Wo0aNBG/0qquucrdvv/32QvYNAAAAAIDwmkU8McF1sJo1aybpdQAAAAAARMQyXcuXL7cff/zRfb99+3br2LGjNWrUyI3TBgAAAAAgEiU6wNaYak1g9tlnn7mfn3vuOVu2bJlbomvMmDE2bty45NhPAAAAAADCK8CePHmym0W8R48etnv3blu6dKmbLfy1116zrl272syZM5NnTwEAAAAACKcAe/PmzXb77be777/44gu3FvaNN94YmEn877//9n8vAQAAAAAItwA7e/bsdujQIff9V1995dbFLlGihPv5jz/+sFy5ciV5Z8aOHWutW7eOcZ/W1dYyYVWqVLG6devaSy+9ZMeOHQs8fvz4cXv++efdhGp6zhNPPGH//vtvjG1oNvNmzZrZFVdcYfXr17e5c+fGeDwh2wAAAAAAwNcA++qrr3bl4BprvXDhQmvQoIG7/9NPP7Xhw4fbtddea0kxdepUGzZsWIz7tJ62ys9vvvlmmz17tvXp08fmzZvngmFP37597euvv7aRI0fam2++6TLsjz32WODxTZs2WYcOHez666+3WbNmubW5n3zyyRhLiMW3DQAAAAAAfA+we/Xq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vfDCCy67e+DAgcBj77zzjgtIt27d6jLEyhb7LU+ePLZ48WL7888/7fTp0/buu+9ahgwZXLD8/fffW/Xq1S1duv8t6V2jRg23P3v27LENGzbY4cOHrWbNmoHHs2fPbuXLl7cVK1a4n+PbBgAAAAAA8UmXoCelS2dPP/20VatWzXr16mW333679e7d22V+lyxZ4sZFqzy8aNGilhz0O7t06WI33nijpU2b1tKkSWMjR450Jd3KRF966aUxnp8/f3739e+//3aPS6FChc56jvdYfNvImzdvovc5Ojo6UWPXz7XueObMmS9oG4hcR48ede0wpdGOEQ7tGAAARK7o6Gh3TetbgO256aabrGLFitahQweXydYv6datmxvPrKA3uWzcuNEuuugiGzVqlBUoUMCNx+7evbsrWT927JjLZgfLmDGj+3r8+HF3cSZxPWf//v3u+/i2kRQnT56Md9x6fBRcK9MOJMWWLVsC7T8l0Y4RDu0YAABEtgyx4kVfAmyNZ54wYYL9+uuvLtDVJGNffPGFNWjQwIoUKWLJQRnkJ554wiZPnmxXXXWVu09BvoJuZbEzZcoUmKzM4wXFWbJkcY97++597z3Hyw7Ht42k0JjuMmXK2IVIaC8JEBdNBpgaMn+0Y4RDOwYAAJFr48aNCX5uggNsjWVW1lgb13hsTTS2atUq69GjhysZf/bZZ61Jkybmt59++sllgxVUB7viiivsyy+/tIsvvtgF+sG8n9UJoNnNvftUUh78nLJly7rvCxYseN5tJDWoSGpwDviB4QUIB7RjAAAQSgmjBNV1azbtO++80/bt22djx461Pn36uBJqTRz20UcfuWBXAbcyzYcOHTI/KfiVX375Jcb9yqKXKFHCjQtfuXKlm/zM891337mshyZH00Ro2bJli7E+tyZpW7dunXutxLcNAAAAAAB8CbCHDBli119/vQuma9WqFeOx3Llzu7JxjcX+9NNPrXHjxuanSpUqWdWqVe2pp55yQa9m9h42bJh9++239tBDD7kZzBXUayI0ZddnzZrlysk1TtyrlW/VqpVb13rhwoUuE9+1a1cXuNerV889J75tAAAAAADgS4m41ofWOtfn8+CDD7qlrpTF9pMmT3v99dddUK2ZzDUxmWb8VgCszLmMHz/eBgwYYE2bNrV8+fLZk08+6b73aA1slYpr5nNNaKaMtToFNE5a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nnvOhg8fbidPnnT363G/ffjhh9arVy83c/ncuXPdjOUa7/3DDz+43/vAAw+4502fPt369u1r77zzjo0aNSrw+tmzZ9vLL79sXbp0sVmzZlmRIkWsXbt2gXL2hGwDAAAAAIALXgc7tjp16rjb8ePHbd++fXbRRRdZlixZLDlER0e7AL5NmzaBpcEefvhh+/7772358uX2119/2fbt210mXWPDL730Uvvnn39cQK1suyZgU4a9VatW1rhxY/f6gQMH2k033WTvvfeey1p/+umn8W4DAAAAAABfM9ie/fv32969e10ZtYJsBajezU9btmxxQXSjRo1i3D9hwgQXHCvQrlChQoyJ17RsmCZj03JiCpS3bt1qNWvWDDyeLl06u+qqq2zFihXu5/i2AQAAAACA7xns33//3S3T9dNPP53zOX4GpQqw5ciRI66MW2OnVeKtLHbdunVtx44dVrBgwRivyZ8/v/v6999/u2BaChUqdNZzNmzY4L6PbxtXXHFFkjLv2ucLERUVZZkzZ76gbSByHT161LXDlEY7Rji0YwAAELmio6PdNW2yBNj9+/d3GeFOnTq5oDRNmiQnwRNEWWRRUK/f2b17d1fS/cgjj9ikSZPs2LFjlj179hivyZgxo/uqEnZdnEnsMm89R49LfNtICo3rvtCOBgXX5cuXv6BtIHKpc8pr/ymJdoxwaMcAACCyZUjgsOFEB9gqqx4wYICbaOy/kD59evdV2eumTZu67y+77DKXyVaAnSlTJjtx4kSM13hBscaF63GJ6zledji+bSR1v8uUKWMXIqG9JEBcSpYsmSoyf7RjhEM7BgAAkWvjxo0Jfm6iA+xs2bLFGKuc3AoUKOC+auKxYApelyxZYtWrV7dff/01xmO7du0KvNYrDdd9pUuXjvEcb9vKxJ9vG0kNKpJr4jcgIRhegHBAOwYAAKGUMEp0fXeTJk3cmtL/VUZBk49lzZr1rDHfCoiLFStm1apVc9lsr5RcvvvuO/eacuXKWZ48eVwGZNmyZYHHT5065SY202slvm0AAAAAAOB7BlvZhJUrV9rNN99sFStWDJRgB0f3WgbLL9p++/bt3ZrUyiZXqlTJrYX9zTff2OTJk61y5co2bNgwe/zxx9347D///NOGDBli999/f6BOXt+rrL148eJun8eNG+fGXd9xxx3ucS3ZFd82AAAAAADwNcCe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PXv2JOkUYQiwAQAIcVzUIdTRhhEu6LAHATYAAGGAizqEOtowgHBAgA0AAAAAgA/S+LERAAAAAAAiHQE2AAAAAAA+IMAGAAAAAMAHBNgAAAAAAPiAABsAAAAAAB8QYAMAAAAA4AMCbAAAAAAAfECADQAAcIGio6M5hgAAAmwAQGjr2bOnlS1b9ry31q1bJ+s+LFu2zP0efU1OHTt2tPfeey/GfX/++af16dPHbrzxRqtYsaJdd9117nlff/11grap12vfZ82aZeEg9mdfvnx5u/rqq+3++++3xYsXJ8vv/O233+zuu+8+az9Gjhzp++968skn7Y033vB9uwAAf6TzaTsAAKSIRx55xFq2bBn4efTo0bZu3Tp77bXXAvdly5Yt5D8dBcA7d+605s2bB+779ttv7dFHH7WCBQta+/btrXTp0vbvv//axx9/bA888IC1bdvWnnnmmfNuN3/+/Pbuu+9asWLFLFzccccdduedd7rvT548abt377aZM2e6jodevXpZmzZtfP198+fPtx9++CHGfTqm+lz89sQTT1ijRo2sbt267vMGAKQuBNgAgJCmwDA4OMydO7dlyJDBKleubOHi2LFjNnjwYJepTpPm/4/uUrD92GOP2ZVXXmmjRo2yjBkzBp5fv359mzx5sr344ot2ySWXBILNuITbsRIFtrHfU4MGDaxz58728ssvu+C0SJEiyboPyXVMCxQoYA0bNrRXXnnFxowZkyy/AwCQdIzBBgBEBGWAVS6sEutrr73Wqlevbhs3bnSPff7559asWTNXYq3HXnjhBTty5EiM1//444+uzFgBbY0aNaxbt24uyA22efNmlzm+4oor3HYUFJ86dSrw+PHjx10wrABYv6tevXo2btw4O3PmzHn3XdlXvbZOnTqB+xRAax+1r8HBtee+++5zQd7rr78eGB+sUvnu3bu7wFyPtWvXLs4ScWVj7733Xvec2rVr25tvvum2p3L84PeiYLVWrVp2+eWXu6zqvHnzYuyDAllVEgwcONCVaVepUsVlYA8fPuze9w033GBVq1Z1ge/evXstuXXt2tVltN9///1EvY+ff/7ZVQNoX/UedCzUHkRl4F61RHBZePD33hACVRyoDXntQ0Hy6dOnE90+tI9LliyxX3/9NRmPFgAgKQiwAQARQ8HMxIkTbcCAAfb000+7Ets5c+a4MutSpUq5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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",
"# Média PAX por dias operados (usado para o Fleet Assignment Model)\n",
"estatisticas_trechos['Media_PAX_Dias_Operados'] = estatisticas_trechos.apply(\n",
" lambda row: row['Total_PAX'] / row['Dias_Operados'] if row['Dias_Operados'] > 0 else 0, axis=1\n",
")\n",
"\n",
"# Nova métrica solicitada: PAX * Dias_Operados\n",
"estatisticas_trechos['Score_Relevancia'] = estatisticas_trechos['Total_PAX'] * estatisticas_trechos['Dias_Operados']\n",
"\n",
"# Ordenar pelas rotas com maior métrica (PAX * Dias_Operados)\n",
"estatisticas_trechos = estatisticas_trechos.sort_values(by='Score_Relevancia', 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='Score_Relevancia', hue='Trecho', palette='viridis', legend=False)\n",
"plt.title(f'Top {NUM_TRECHOS} Trechos Mais Relevantes (PAX * Dias Operados)')\n",
"plt.ylabel('Score de Relevância (PAX * Dias Operados)')\n",
"plt.xlabel('Trecho (Origem - Destino)')\n",
"plt.xticks(rotation=45)\n",
"plt.tight_layout()\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"id": "9abfe029",
"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": "e7df1520",
"metadata": {
"execution": {
"iopub.execute_input": "2026-06-07T23:18:15.142206Z",
"iopub.status.busy": "2026-06-07T23:18:15.142079Z",
"iopub.status.idle": "2026-06-07T23:18:15.243488Z",
"shell.execute_reply": "2026-06-07T23:18:15.242947Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"== RESULTADO DO FLEET ASSIGNMENT ==\n",
"Status: Optimal\n",
"Distância Total Minimizada: 7722.27 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: SBBR-SBGR (Voos necessários: 1)\n",
" -> ETA6 (Base SBBR): 1 voo(s)\n",
"\n",
"Trecho: SBGR-SBBR (Voos necessários: 1)\n",
" -> ETA6 (Base SBBR): 1 voo(s)\n",
"\n",
"Trecho: SBGL-SBGR (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_Dias_Operados'] / 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
}