495 lines
62 KiB
Plaintext
495 lines
62 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "490738bc",
|
|
"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": "14292d89",
|
|
"metadata": {
|
|
"execution": {
|
|
"iopub.execute_input": "2026-06-07T23:16:26.495905Z",
|
|
"iopub.status.busy": "2026-06-07T23:16:26.495251Z",
|
|
"iopub.status.idle": "2026-06-07T23:16:26.997172Z",
|
|
"shell.execute_reply": "2026-06-07T23:16:26.996519Z"
|
|
}
|
|
},
|
|
"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": "02401ef8",
|
|
"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": "b18a653b",
|
|
"metadata": {
|
|
"execution": {
|
|
"iopub.execute_input": "2026-06-07T23:16:26.998926Z",
|
|
"iopub.status.busy": "2026-06-07T23:16:26.998670Z",
|
|
"iopub.status.idle": "2026-06-07T23:16:27.370579Z",
|
|
"shell.execute_reply": "2026-06-07T23:16:27.369986Z"
|
|
}
|
|
},
|
|
"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": "259a9e7a",
|
|
"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": "409555a8",
|
|
"metadata": {
|
|
"execution": {
|
|
"iopub.execute_input": "2026-06-07T23:16:27.372062Z",
|
|
"iopub.status.busy": "2026-06-07T23:16:27.371936Z",
|
|
"iopub.status.idle": "2026-06-07T23:16:27.383786Z",
|
|
"shell.execute_reply": "2026-06-07T23:16:27.383217Z"
|
|
}
|
|
},
|
|
"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": "f4b3847d",
|
|
"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": "07fc4526",
|
|
"metadata": {
|
|
"execution": {
|
|
"iopub.execute_input": "2026-06-07T23:16:27.385108Z",
|
|
"iopub.status.busy": "2026-06-07T23:16:27.384987Z",
|
|
"iopub.status.idle": "2026-06-07T23:16:27.656394Z",
|
|
"shell.execute_reply": "2026-06-07T23:16:27.655862Z"
|
|
}
|
|
},
|
|
"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",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>303</th>\n",
|
|
" <td>SBJU-SBNT</td>\n",
|
|
" <td>0.109589</td>\n",
|
|
" <td>2.093696</td>\n",
|
|
" <td>40.0</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>40.0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>149</th>\n",
|
|
" <td>SBCJ-SBBE</td>\n",
|
|
" <td>0.065753</td>\n",
|
|
" <td>1.256217</td>\n",
|
|
" <td>24.0</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>24.0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>324</th>\n",
|
|
" <td>SBMA-SBBR</td>\n",
|
|
" <td>0.065753</td>\n",
|
|
" <td>1.256217</td>\n",
|
|
" <td>24.0</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>24.0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>300</th>\n",
|
|
" <td>SBJI-SBVH</td>\n",
|
|
" <td>0.057534</td>\n",
|
|
" <td>1.099190</td>\n",
|
|
" <td>21.0</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>21.0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>540</th>\n",
|
|
" <td>SBVH-SBBR</td>\n",
|
|
" <td>0.057534</td>\n",
|
|
" <td>1.099190</td>\n",
|
|
" <td>21.0</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>21.0</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" Trecho Media_PAX_Diario Desvio_Padrao_PAX Total_PAX Dias_Operados \\\n",
|
|
"303 SBJU-SBNT 0.109589 2.093696 40.0 1 \n",
|
|
"149 SBCJ-SBBE 0.065753 1.256217 24.0 1 \n",
|
|
"324 SBMA-SBBR 0.065753 1.256217 24.0 1 \n",
|
|
"300 SBJI-SBVH 0.057534 1.099190 21.0 1 \n",
|
|
"540 SBVH-SBBR 0.057534 1.099190 21.0 1 \n",
|
|
"\n",
|
|
" Media_PAX_Dias_Operados \n",
|
|
"303 40.0 \n",
|
|
"149 24.0 \n",
|
|
"324 24.0 \n",
|
|
"300 21.0 \n",
|
|
"540 21.0 "
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA9gAAAJICAYAAACaO0yGAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAAgoFJREFUeJzt3QmczeX7//HLvhSyb0X2kiWFUNlabKmQUNYvIdKmpOhLUihbUqSyky2ilCiJZI1KIWsbyZ5kZ/6P9/3/fs7vzDSY5TPmnDOv5+Mxj5k5c+bM55y55zOf676u+7pTRUVFRRkAAAAAAEiU1In7dgAAAAAAQIANAAAAAIBPyGADAAAAAOADAmwAAAAAAHxAgA0AAAAAgA8IsAEAAAAA8AEBNgAAAAAAPiDABgAAAADABwTYAAAgXqKionjFAACIBQE2gBShZ8+eVqpUqQu+tWrVKkmP4amnnor15y5YsCDW++t4LnbMel5Jafbs2e7n/P7775Ycateu7X5+9+7dz3uf+++/393n9ddfj/djJ+b102sS2++kTJkydvPNN9sjjzxiO3fujNdjrlq1yj2G3oeiI0eOWI8ePWzt2rWX7Gd+//33VqdOHTt16pT7PLbXvFy5ctagQQN7++237dy5c9G+/+jRo1a+fHm77rrrbN++ff96/GXLltk111xj//3vf2P9+Y8++qjddNNNtmfPngse58aNG61ChQqB44wp5jGXLl3aPe5//vMf++KLL2IdW/r7uxR0zJMmTbKmTZvaDTfc4N4aNWpkY8eOtePHj1u40DlAr5ufDh06ZDVr1rTffvvN18cFELnSJvcBAMCl0KVLF2vevHng8zfffNNdEI8cOTJw2+WXX56kx7B582a76667/hXIX3311bHev0+fPi448LzwwguB2z05cuSwSJc6dWoXgJw8edIyZMjwr0Dku+++S9Dj6nfvx+/84YcfdhfgHgUkP/74o40ePdoFT5pAiXnc4WrTpk02d+5ca9KkySX5efqdP/PMM/b0009b+vTpA7ffd999LhgMfs0XLlxogwcPdpMAwRMyH330kWXJksXOnj1rs2bNcr+vYLfeequ1bNnSBZi1atVyb56JEyfap59+aqNGjbJ8+fJd8Fi//PJLq1KlSrTjjCn4uE+fPu0C/vfff986d+5svXr1statW7uv5cmTx6ZPn26FChWypPb333/bQw895M5PLVq0cBMKqVKlcpMoet5z5sxxExcXe/6RKnv27Na2bVt77rnn3HjQawMAF0KADSBF0IVq8MWqAlNdCF9//fWXLFBQNrNNmzZx/pnFixeP9rkXDF6qYw4VyqbpYn/p0qV2xx13RPvaxx9/bNdee60L/OJLGUQ/aFzF/J1UrVrVLrvsMuvbt6+tXLnSatSo4cvPSmmmTp1qadOmtdtvvz3a7Qr2YnvNd+zYYVOmTHFBYrp06dztygIriNbnM2fOtE6dOrlJm2AK4FesWOGC3A8//NBy5szpMuevvPKK+5tVtcPFaHzec889F7xPbMddv35969atm/tZ+jlXXnnlJT036Tlv3brVpk2b5jL5nltuucU9HwXdqr7RBERKDS4feOABN9mwaNEiu/POO5P7cACEOErEASDI8uXL3cXUjTfe6Mo3lQn7448//lUyraypSihVmtqwYcPzlnl7tmzZYmfOnHHBYFKURSrwVEa2cuXK7sL4r7/+cl9TQKHSWZUtK8uq+yqTFzPzpuy+Luj1vSqVVRYwmJ6v7lO2bFn3OO+8886/smADBgxwgZDuo0y9soXBfvjhBxes6LVVKa2yQt9+++1Fn99VV13ljj+211gBtp5fTMpsq5RZz0elwQq+9LnKPc9XIq5M59133+1+p8pEKqj4888/LaGyZs36r9t2795tTz75pPs9qWxZr4cqKS42dhQUeqW7Xbt2DZSrauJGr+egQYOifY/Gmp5D//793ecnTpywIUOGuOBAr6Uep127dtEmJvRa6HeijKpKsnU/BVgKHEVl616GVe+DKzE+++wza9y4sfvdqzxeP/fYsWOBr+vna7KhevXq7nHr1q1r77777kXLlseNG+fGUlzpsf/555/A+N+2bZsbuxqz+t3u2rXLlYTHpAoDL/vdu3dvVznyxBNPWMmSJd04uBj9PP0cPb+E0M9SRtv7m4mtRHzNmjXWvn17q1SpknueGr/6ew4uiY/vGFZgrQy9xldwcO0pUqSIPfbYY+5na6IoPudAjU1NGmhyScer++jvNZiew8svv+z+DvQ4CvZF2XQtsdBz0N+vJkg0pjSOgh9f5xyNN51Pnn32WXdbfM/pev2GDRvmjsV7XfW3ot+HRxMe+pt46623zvtaAoCHABsA/ueDDz5wJb358+e3oUOHugu29evXW7NmzezA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VKoyGNuIxLHNuEYkjmthbMNPjG1EquOJPG/re3W+DasA+7PPPrOnnnrKbrjhBhs8eHBgz+2YgbT3eWKC29OnT9umTZsSdbz6+cGN3YDE2Llzp/vDDwWMbUTi2GZcIxLHtTC24SfGNiLVTh/O2zETv5cswD548KDr8h0fkydPtpdeeslt/TVo0KDAwWtbrr1790a7rz7PnDmzZcmSJcHHmC5dOitevLglRlxnMIC4KFKkSEhlQ4BIG9uMa0TiuBbGNvzE2EakKpLI8/a2bdvifN84BdjaSqt///4usL2QL7/80nr16mVfffVVnA9AHcRffPFFa9Wqlfve4H8U2gt79erV0e6/cuVKl+VOnTrhy8f1My72XIBLieUGiFSMbUQixjUiFWMbkSpTIpf2xmcyM05RqrbSatSokf3444+xfl1l2wqSO3fuHOfUuZeqf/nll+2OO+5w+13v37/f7Ymtt7///tsF3d9//70rGd++fbuNHTvWFixYYB06dIjzzwAAAAAA4FKIU4A9e/Zsy5YtmzVv3twmTJgQ7WubN2+2xo0b25QpU+yuu+6yefPmxfmHq2O41kMvWrTIbrnllmhvKhkvUaKEvfnmmy4zfu+999rMmTPt1VdfZQ9sAAAAAEDIiVOJeMGCBV0p9yuvvGIDBgxwZdoKgOfMmWOvvfaaS7kPGzbM6tWrF68froy33i6kevXq7g0AAAAAgFAW5yZnadOmteeee86qVatmvXv3tlq1arnScC/brP2pAQAAAABIqeLdKezMmTNukffJkyfd59qqKr5dwwEAAAAASLEB9rFjx1wGu1u3bpY7d26bO3euK+9+++237f7773cNywAAAAAASKniFGCvW7fO7rnnHvvggw/sP//5j02fPt1KlSpljz32mI0bN851/VajM90OAAAAAEBKFKcAu2XLlq40fPz48fb0009bunTpAl+76aabXOfwypUrW58+faxr165JebwAAAAAAIRvgK3u4F4QHZvs2bPbW2+9Zc8884wtXbrU72MEAAAAACAyuogPGTIkTg/Wrl07u/766xN7TAAAAAAARO42XRei8vGFCxfatGnTbO3atbZx40Y/HhYAAAAAgJQRYP/22282Y8YMmz17th08eNAyZ87smqEBAAAAAJDSxDvAPnfunC1evNjee+89W7FihUVFRVnFihWtZ8+edscdd1jG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N3vttdeS7mgBAAAAAAjnALtt27Y2e/Zs9/GkSZOsY8eO9thjj9l1110XuE+NGjXs8ccft8WLFyfd0QIAAAAAEM4Bdps2bax///7266+/2u7du61y5cqx3q9o0aJuyy4AAAAAAFKaOAXYTz/9tH322WeWM2dOtx3X+vXrY73fDz/84L4OAAAAAEBKE+cmZzly5HDv77vvPrcGO2PGjFazZk1327Fjx+zTTz91jc+0NhsAAAAAgJQm3l3EH3roIfv9999t8ODB7k1at27t3jds2NA6derk/1ECAAAAABBpAba25erXr5/LVK9cudLth50lSxarVKmSlSxZMmmOEgAAAACASNwHW4oUKeLeAAAAAABAHAPsZ599Nl4Z7pdffpnXFgAAAACQosQpwJ4zZ44LnPPmzWupU1+48bjuBwAAAABAShOnALtevXq2ZMkSO3XqlNWtW9caNGhgN954Y9IfHQAAAAAAkRRgDxs2zI4fP25ffPGFffzxx67BWa5cuax+/fou2L722muT/kgBAAAAAAhhF673DpIpUyYXUI8cOdK+/vpr69atm/3000/WtGlTl9XW7Tt37kzUwWgf7VatWkW7bdOmTdayZUu7/vrrrXbt2jZx4sRE/QwAAAAAAJI1wA52+eWXW6NGjeztt9+2r776ytq3b2/r1q1z+2A3btw4QQcyZcoUGz58eLTbDh065LLlhQoVsvfff9+6du3q9t7WxwAAAAAARMQ2XZ6TJ0+68vETJ07Y2bNnbdeuXfH6/j///NP69Oljq1atsquvvjra12bMmGHp0qVz+26nTZvWihUrZr/88ouNGTPGmjRpkthDBwAAAAAgeTPYCoonTJhgLVq0sFq1atmIESNclnn06NG2fPnyeD3Wjz/+6ILoefPmWfny5aN9be3atVa5cmUXXHuqVKliP//8s+3fvz8hhw4AAAAAQPJmsBVUL1iwwL19++23bk22gusOHTrYrbfeaunTp0/QAWhdtd5is2fPHitZsmS02/LkyePe//HHH67RGgAAAAAAYRNgK1P93XffWYYMGaxGjRr22muvuff6PCmp7Dxm4O79TJWmJ1RUVJQdO3YsUcem/b41yQD4QcssNC5DAWMbkTi2GdeIxHEtjG34ibGNSHU8kedtfa/Ot74F2OvXr7c0adJY8eLF7eDBgzZ58mT3Fhv9YJWP+yFjxoxu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WbPa0KFD3YR/48aNCbIR9tcks2fPjnbOLlu2rH322We2fv16Auw4IMBGWFBgPWXKFFeqUrp0aStSpIidPHnSXbQJQTbC1SuvvOKyeBrfJUuWjLbkQeVZe/bscTPImTJlSu5DBeJt2LBh7kJt1qxZ7rytySNVZqRPn95lQq666qp/fQ/VGwhFGzZscOfoDBkyuM9VJuuVymo865pESx50DqdcHOFq4MCB9tFHHwUm/E+dOuXGd/78+d35umDBgtHuT7l47FitjpB37Ngxq1q1qi1evNgF17r4uvrqq61z585uFk1B9rvvvhttVhkIB2vWrLGxY8damzZt3IWb/lF5wfXbb7/tlkPccccd/wqu2cIL4WDJkiX21ltvuWBDwbWoMkMBiSqQ1KhS53eViy9btsyOHDni7sPSCIRit/CmTZvatGnTXMDhjVONZY1xBdaaSHrkkUdcubjuR+MzhJtFixbZ+PHj7fHHH7drr702EFyLJkk3b97sPlbTM3XP1zmbtdixI4ONkKZ/Uu+88467GNPsmQIL/VPT+0KFCrkge/To0WSyEZZuuOEGF3xojGt833333W58jxkzxk0ajRgxwm6++eZo3xNcPg6Espo1a9qdd95pX3zxheXJk8cFKJkzZ3bjW42htPRBQbiy3KJmZ5pM0v0efvhhmlciZDLX119/vXXo0MEGDx7sAgqdtxV4aCxrkvTVV191CQC96RytZqxawtauXTt2OkHY0Dm4Ro0a7vpDvTKqVavmbtc41xIIVW8ow/3777+7++q6RQmv6tWru/M2/g9XaQhp+melrLQuthRI58qVy92uf3CxBdkKTtq2bUvDM4QFjde+ffu6sax93XPmzOlmiPXPTf/MYgbXavK3adMml9kWZo4R6jRJ9Nhjj7klENpSUVu9qPRQgYqCFgXUWod94MAB+/rrr92FW7169QiuERJUXdG1a1c3Np966il3zlaAobG8e/dudy72ztXe0gZlsRVcKzGg6xEgXKhaVFV0ugbp3bu3C6zV3Eyfq0qjRIkSboJfY19/E9u2bbMff/zR9SFAdKmiqDVEiFNA8eSTT7oLMf2xe0F28NqPX3/91ZXUKhvSqVMna9myZbIeM3A+Kq3SWj1NHN14442B2//73/+6rsr656XsnmaEYwYqypRMmDDBypcvzwuMkPTDDz+4ssG8efO6rHWWLFnc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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",
|
|
"# Nova métrica: PAX/Dias_Operados (evitando divisão por zero)\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",
|
|
"# Ordenar pelas rotas com maior Média PAX por dias operados\n",
|
|
"estatisticas_trechos = estatisticas_trechos.sort_values(by='Media_PAX_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='Media_PAX_Dias_Operados', hue='Trecho', palette='viridis', legend=False)\n",
|
|
"plt.title(f'Top {NUM_TRECHOS} Trechos Mais Relevantes (PAX / Dias Operados)')\n",
|
|
"plt.ylabel('Média de PAX por Dia Operado')\n",
|
|
"plt.xlabel('Trecho (Origem - Destino)')\n",
|
|
"plt.xticks(rotation=45)\n",
|
|
"plt.tight_layout()\n",
|
|
"plt.show()\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "3b70d27a",
|
|
"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": "862dd955",
|
|
"metadata": {
|
|
"execution": {
|
|
"iopub.execute_input": "2026-06-07T23:16:27.657968Z",
|
|
"iopub.status.busy": "2026-06-07T23:16:27.657797Z",
|
|
"iopub.status.idle": "2026-06-07T23:16:27.763485Z",
|
|
"shell.execute_reply": "2026-06-07T23:16:27.762884Z"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"== RESULTADO DO FLEET ASSIGNMENT ==\n",
|
|
"Status: Optimal\n",
|
|
"Distância Total Minimizada: 31712.50 km\n",
|
|
"\n",
|
|
"Alocações (Voos Diários):\n",
|
|
"\n",
|
|
"Trecho: SBJU-SBNT (Voos necessários: 2)\n",
|
|
" -> ETA2 (Base SBNT): 1 voo(s)\n",
|
|
" -> ETA6 (Base SBBR): 1 voo(s)\n",
|
|
"\n",
|
|
"Trecho: SBCJ-SBBE (Voos necessários: 1)\n",
|
|
" -> ETA1 (Base SBBE): 1 voo(s)\n",
|
|
"\n",
|
|
"Trecho: SBMA-SBBR (Voos necessários: 1)\n",
|
|
" -> ETA6 (Base SBBR): 1 voo(s)\n",
|
|
"\n",
|
|
"Trecho: SBJI-SBVH (Voos necessários: 1)\n",
|
|
" -> ETA7 (Base SBMN): 1 voo(s)\n",
|
|
"\n",
|
|
"Trecho: SBVH-SBBR (Voos necessários: 1)\n",
|
|
" -> ETA6 (Base SBBR): 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
|
|
}
|