469 lines
58 KiB
Plaintext
469 lines
58 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "b9d53e09",
|
|
"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": "3a2a17df",
|
|
"metadata": {
|
|
"execution": {
|
|
"iopub.execute_input": "2026-06-07T23:05:31.524243Z",
|
|
"iopub.status.busy": "2026-06-07T23:05:31.523594Z",
|
|
"iopub.status.idle": "2026-06-07T23:05:32.744349Z",
|
|
"shell.execute_reply": "2026-06-07T23:05:32.743866Z"
|
|
}
|
|
},
|
|
"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": "bb6f4d66",
|
|
"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": "759d8610",
|
|
"metadata": {
|
|
"execution": {
|
|
"iopub.execute_input": "2026-06-07T23:05:32.746076Z",
|
|
"iopub.status.busy": "2026-06-07T23:05:32.745895Z",
|
|
"iopub.status.idle": "2026-06-07T23:05:33.165670Z",
|
|
"shell.execute_reply": "2026-06-07T23:05:33.165060Z"
|
|
}
|
|
},
|
|
"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": "e0eb26f1",
|
|
"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": "85f8d91d",
|
|
"metadata": {
|
|
"execution": {
|
|
"iopub.execute_input": "2026-06-07T23:05:33.167076Z",
|
|
"iopub.status.busy": "2026-06-07T23:05:33.166953Z",
|
|
"iopub.status.idle": "2026-06-07T23:05:33.178236Z",
|
|
"shell.execute_reply": "2026-06-07T23:05:33.177665Z"
|
|
}
|
|
},
|
|
"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": "5b5ea583",
|
|
"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": "88e83a21",
|
|
"metadata": {
|
|
"execution": {
|
|
"iopub.execute_input": "2026-06-07T23:05:33.179611Z",
|
|
"iopub.status.busy": "2026-06-07T23:05:33.179488Z",
|
|
"iopub.status.idle": "2026-06-07T23:05:33.379629Z",
|
|
"shell.execute_reply": "2026-06-07T23:05:33.378953Z"
|
|
}
|
|
},
|
|
"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>324</th>\n",
|
|
" <td>SBMA-SBBR</td>\n",
|
|
" <td>24.0</td>\n",
|
|
" <td>0.000000</td>\n",
|
|
" <td>24</td>\n",
|
|
" <td>1</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>540</th>\n",
|
|
" <td>SBVH-SBBR</td>\n",
|
|
" <td>21.0</td>\n",
|
|
" <td>0.000000</td>\n",
|
|
" <td>21</td>\n",
|
|
" <td>1</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>300</th>\n",
|
|
" <td>SBJI-SBVH</td>\n",
|
|
" <td>21.0</td>\n",
|
|
" <td>0.000000</td>\n",
|
|
" <td>21</td>\n",
|
|
" <td>1</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>29</th>\n",
|
|
" <td>SBBE-SBMA</td>\n",
|
|
" <td>19.5</td>\n",
|
|
" <td>6.363961</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>2</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>450</th>\n",
|
|
" <td>SBSJ-SBVT</td>\n",
|
|
" <td>19.0</td>\n",
|
|
" <td>0.000000</td>\n",
|
|
" <td>19</td>\n",
|
|
" <td>1</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" Trecho Media_PAX_Diario Desvio_Padrao_PAX Total_PAX Dias_Operados\n",
|
|
"324 SBMA-SBBR 24.0 0.000000 24 1\n",
|
|
"540 SBVH-SBBR 21.0 0.000000 21 1\n",
|
|
"300 SBJI-SBVH 21.0 0.000000 21 1\n",
|
|
"29 SBBE-SBMA 19.5 6.363961 39 2\n",
|
|
"450 SBSJ-SBVT 19.0 0.000000 19 1"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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CVzRokXdKI4C1fjo5NALeBX06URcJ3hJTW+OK3DT8+tEV9t94YUX2pgxY+zZZ591J85KV27Tpo29+eab7jKPUq/1Wi666CIbNmyYCyoVLHXt2jXG4ys4UtAyduxYd4KtdFHdV3SCq9cyffp069ixo0ur1ImrRsP0vKJUd12XJ08ed9Ks7VQq9f333++C8/Np0qRJME3cs3XrVrdfYwdTelwFgFu2bHHprArk9L9GNvW8cfn+++9dAK4gSftI+1CjeOea+x0651eBnfej16oTeAVdSjPVqKEoKFInhdLH9R7oet1X74u2NS7KetB91P4URL/44osuuNaomi5TUKJgWGm2oYXH9PzqTFCALHptCqI6derk5tjq9SnNVq8v9H7qBNH+euyxx2zEiBGWIUMGe/TRR12HjToqFKCKfntTFfS+K+gvVqyYu4+CoM8//9ylAnuPPWDAABeoKzjU4+uz89JLL7ltio8CenVw6D2JTdul1x07wFbArDYSe460LlNnhkZt1bb1uVX6sdpkaJCtVPQPP/zQfSb0edDr1sjquSR038aWkOdSurs6PZTKrdv06tXLVqxY4dpzaGCZGF5dAG8kXtu6du1aa9q0qftfv7Wf4pqfrv2u903tVu+vtlfHPgX/yZEzZ04XEOtzGBel/Otzos/2oEGD3GdUn/sJEybYe++9F+O2Ouao01Np7GojyTnOqyPIG90HgPMKAEAa1qNHj0DdunWD/58+fTpQo0aNwH333Rfjdr/99lugXLlygcGDB7v/p06dGihZsmRg+PDhwducOXMmcPvttwdatmwZ7/M999xz7n7du3cPLFu2LDBr1qxA8+bNAxUqVAhs2LAhQdt8zz33uJ/YXn/9dffY3333XfCyQ4cOucfu06dPjNt++OGH7rabNm1y/zdr1izQtGlT9xo8M2bMCDRs2DCwd+/e4OudPHly8PojR464fTJgwAD3/6RJk9xtVq1aFeO5evXqFShfvnzgr7/+Cqxevdrd5vvvv4+xb1966aXAzp07433Neo/0Xv3555+BUqVKBb7++uvgdW+88UagVatW7m89tvaDrF+/PtC6devA77//HuOxOnfuHLjpppvOemwZM2ZMoFKlSoHjx48Hr58/f757jtB9E+qPP/5wzxvXz9VXXx14+OGHY2zDkCFD3P7Yvn178DI9X/369QOPPvqo+19t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YICf2wgAAAAAQPQF2LNnz7aLL77YTp48aWvXrj3regXYAAAAAACkNYkOsOfNm5cyWwIAAAAAQFqagw0AAAAAAJI4gl2/fn0bMWKEm3Ndr169c6aB67o5c+Yk5GEBAAAAAEhbAXa1atXsggsuCP7NPGsAAAAAAJIQYA8cODD496BBgxJyFwAAAAAA0pREFznzbNmyxRYvXmx79uyxtm3b2h9//OFSyHPkyOHvFgIAAAAAEI0B9pkzZ6xPnz42depUCwQCLl28cePGNnLkSPv9999t4sSJVqBAgZTZWgAAAAAAoqWKuALp6dOn2wsvvOBGsBVkS/fu3V3wPXTo0JTYTgAAAAAAoivA1sj1Y489Zi1atLDcuXMHLy9Tpoy7XEE3AAAAAABpTaID7H379rlgOi6XXHKJHTp0yI/tAgAAAAAgugPswoUL24IFC+K8bsWKFe56AAAAAADSmkQXOWvXrp0rcnby5EmrW7euK3L222+/2fLly23cuHHWs2fPlNlSAAAAAACiKcBu2bKlHThwwEaNGmXvv/++K3L2xBNPWKZMmaxjx47WunXrlNlSAAAAAACibR3szp07W5s2bWzVqlX2999/W65cuaxixYoxip4BAAAAAJCWJCnAlhw5clitWrX83RoAAAAAANJKgF2vXj037zou6dOnt+zZs7tCZ23btrWqVav6sY0AAAAAAERfFfFbb73V9u7da0eOHLFq1apZkyZN7Nprr7Xjx4/bjh07rEiRIrZz505XDG3p0qUps9UAAAAAAET6CPbBgwetbNmy9vbbb9sFF1wQvPzYsWNubnb+/Pnttddes169etnIkSOtevXqfm8zAAAAAACRP4I9a9Ys69SpU4zgWrJmzWrt27e36dOnu/81sr1+/Xr/thQAAAAAgGgKsOXw4cNxXv7PP//YqVOn3N8ZM2aMd642AAAAAACW1gPs66+/3oYMGWIbNmyIcfnGjRtt2LBhVqNGDff/7NmzrXjx4v5tKQAAAAAA0TQHW3Or7733XmvevLldccUVljdvXtu/f79t377dihUrZr1797avv/7aJk+e7OZiAwAAAACQFiQ6wFYRs88++8w+//xzW758uR04cMCNVD/88MOuwniGDBlcoD1lyhSrUKFCymw1AAAAAACRHmBL5syZ7Y477nA/sQUCAStRooQf2wYAAAAAQHQH2DNnzrQVK1bYiRMnXEAt+q21sdesWWMLFy70ezsBAAAAAIiuAHv48OHuJ2fOnK5ieKZMmVzFcKWKp0+f3lq2bJkyWwoAAAAAQDRVEZ82bZo1bdrUjWBr3eu6devakiVL7OOPP7bcuXPblVdemTJbCgAAAABANAXYu3fvdsXMtMZ1mTJlbPXq1e7yq666yh588EH76KOPUmI7AQAAAACIrgA7e/bsLriWwoULu+W5jh075v5XwK3/AQAAAABIaxIdYJcvX94+/fRT93fRokXdslxLly51/2/ZssVVGAcAAAAAIK1JdJEzpYF36NDBDh06ZKNHj7bbbrvNevToYddee619++231qBBg5TZUgAAAAAAoinArlq1qito9vPPP7v/+/Tp46qHr1q1yho1amQ9e/ZMie0EAAAAACD61sEuXbq0+5EsWbLY888/7/d2AQAAAAAQ3XOwRUt0rVmzxv29Y8cOlzauyuIjRozwe/sAAAAAAIjOAFsFztq1a2ezZ88OpogvX77cVRTXnOyxY8emxHYCAAAAABBdAfa7775rzZo1s+7du9vevXttyZIl9sgjj9jw4cOta9euNnXq1JTZUgAAAAAAoinA3rp1qzVt2tT9vWDBAgsEAla/fv3gEl47d+5M8saMGTPG2rZtG+OyZ555xkqVKhXjp169ekl+DgAAAAAAwqLIWa5cuezff/91fy9atMguu+wyK1KkiPv/999/tzx58iRpQyZNmmTDhg2zKlWqxLhc1co1x/uee+4JXqa1twEAAAAAiOgAW+tdKx188+bNNnfuXLcmtnz11Vf22muv2Q033JCox9u9e7f17dvXzeP2AnWPRsf1PJ06dbL8+fMndlMBAAAAAAjfFPHevXu7UWoF2dWrV7fOnTu7ywcOHOhGs7t165aox/vpp58sU6ZM9vnnn1vFihVjXKcR8SNHjlixYsUSu5kAAAAAAIT3CHbevHnt7bffPuvyyZMnuwA7sTSfOr451Zs2bXK/J0yYYAsXLrT06dNbrVq1XDG1nDlzJvq5AAAAAAAImwBbNAf78OHDdskll9jJkyddAKz1sG+66SarWrWqbxunAFtB9cUXX+yWANOI9ksvvWS//PKLjR8/3l2XFEo918h4cqRLl86yZcuWrMcAPEePHnXtMhzQthGNbZt2jWhs10Lbhp9o24hWR5N53NZ9dbxNkQD7hx9+sI4d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efNawYIF7eWXX7YCBQpYw4YNU3vzAAAAAACIjABbtAb2qVOn7JlnnrFjx465keu3337bMmXKlNqbBgAAAACAky4QbuUCAQAAAACIQGE/BxsAAAAAgEhAgA0AAAAAgA8IsAEAAAAA8AEBNgAAAAAAPiDABgAAAADABwTYAAAAAAD4gAAbAAAAAAAfEGADAAAAAGL47bff2CNJQICNqHLmzJnU3gTAV7RpRLpVq1bZgQMHUnszAACJMGjQIHvppZfsyJEj7LdEIsBGRFu2bJnNmDHDFixYYIcPH7b06dPb6dOnU3uzgGT5+eef7ccff7Q//vjDtWkgEgUCAVu5cqXdfffd9v7779tff/2V2psEAEiAF1980T744AN77LHHLHv27OyzRMqY2DsA4WLYsGH26aef2t9//22ZMmWyChUquMty5MiR2psGJNnw4cNt6tSptm/fPsuYMaM99dRT1rp1axespEuXjj2LiKH2WqVKFXvooYds5MiRrrOoVatWlidPntTeNCDFcKxGNJyHTJs2zWbOnGmXXXYZbToJCLARkQYMGGCfffaZ62G7/PLLbe7cufbhhx+6y9q0aZPamwckycCBA12nUe/evV0wsmLFCtfGy5Ur5zqQgEib3qB2rBEQBduvvfaau/yuu+6yvHnzpvbmAb74+OOP7eKLL7brrrvOMmfO7No6QTYi1csvv2xvv/22FSlSxAXXosxQdfgj4dhbiDgKONSzNnHiRCtdurS7rFixYi4woRgDIrnT6JNPPonRrsuXL29z5syx1atXE2Aj4ii49oLsRx991HLlymVDhgxxGUfNmzcnyEbEW7hwoT3zzDPu74YNG7pjd8eOHV2bV0DitX8gUjr5lUH37LPP2nvvvWctWrRw/6stnzp1iiA7EfjUI6IMHTrUBSEfffSR+yLTB149xeo11ijfFVdccdZ9mJONSCgk8sUXX9iECRNcuz5x4oS7/NJLL3VtumDBgjFurzYPhKO1a9fa8ePHY7RVr73qOK3rNJVnypQpzMlGxNPxumbNmtakSRM7evSovfPOO9aoUSN3TFctjdDgmuM2wtkLL7xgkyZNcsdmZYL26tXLHaMVZIsXZCNhCLARMebPn29jxoxxc/iKFi0a/MArHUsFdGbNmuUqHSpdfNGiRXbo0CF3mwwZMqTylgPxmz17tr377rvWpUsXK1OmjAuu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APiAABsAAAAAAB8QYAMAAAAA4AMCbAAAAAAAfECADQAAECIQCLA/AABJQoANAAgbPXv2tFKlSp3zp23btim6DcuXL3fPo98p6cEHH7SPPvooxmXbt2+3vn37Wv369a18+fJ2ww03uNt9++23CXpM3V/b/sknn1g0iP3ely1b1q699lq777777JtvvkmR5/zll1+sdevWZ23HG2+84ftzPfXUU/bmm2/6/rgAgNSTMRWfGwCAGB566CFr1apV8P+RI0fa+vXrbfjw4cHLcuTIEfF7TQHw7t27rUWLFsHLli5dag8//LAVKFDAOnbsaMWLF7cDBw7YF198Yffff7+1a9fOevXqdc7Hvfjii23KlClWqFAhixZ33HGHtWzZ0v198uRJ27t3r02dOtV1PPTu3dvuvfdeX59v1qxZtnr16hiXaZ/qffFbt27d7NZbb7V69eq59xsAEPkIsAEAYUOBYWhwmDdvXsucObNdffXVFi2OHTtmr7zyihupTp/+/yWSKdh+7LHHrHLlyjZixAjLkiVL8PaNGjWyd9991wYOHGhXXnllMNiMS7TtK1FgG/s1NWnSxB599FF76aWXXHB6+eWXp+g2pNQ+veSSS+yWW26xl19+2UaPHp0izwEA+G+RIg4AiMgRYKULK8W6Ro0aVq1aNdu8ebO7bs6cOda8eXOXYq3rXnjhBTty5EiM+69Zs8alGSugve666+yJJ55wQW6orVu3upHjihUrusdRUHzq1Kng9cePH3fBsAJgPVfDhg1t7NixdubMmXNuu0Zfdd+6desGL1MArW3UtoYG15727du7IG/UqFHB+cFKlX/yySddYK7rOnToEGeKuEZj27Rp425Tp04dGz9+vHs8peOHvhYFq7Vr17arrrrKjarOnDkzxjYokFUmwYABA1yadqVKldwI7OHDh93rrlWrll1zzTUu8P3rr78spXXt2tWNaH/88ceJeh3r1q1z2QDaVr0G7Qu1B1EauJctEZoWHvq3N4VAGQdqQ177UJB8+vTpRLcPbeP8+fNt06ZNKbi3AAD/FQJsAEBEUjAzbtw4e/HFF+3pp592KbbTp093adbFihVzwc0jjzxin3/+uUs99wJTpZzfc889wWDsueeec0GXgunQAFojxgrCNLLYuHFjN1f2gw8+cNfpsZSi/NZbb7kRZd1GgdSwYcPcyPS5aHsU6Gq0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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",
|
|
"# Estatísticas (Média e Desvio Padrão) por trecho\n",
|
|
"estatisticas_trechos = demanda_diaria.groupby('Trecho').agg(\n",
|
|
" Media_PAX_Diario=('PAX', 'mean'),\n",
|
|
" Desvio_Padrao_PAX=('PAX', 'std'),\n",
|
|
" Total_PAX=('PAX', 'sum'),\n",
|
|
" Dias_Operados=('Data Apenas', 'count')\n",
|
|
").reset_index()\n",
|
|
"\n",
|
|
"# Preencher NaN no desvio padrão (caso operado apenas 1 dia) com 0\n",
|
|
"estatisticas_trechos['Desvio_Padrao_PAX'] = estatisticas_trechos['Desvio_Padrao_PAX'].fillna(0)\n",
|
|
"\n",
|
|
"# Ordenar pelas rotas de maior média de PAX diário\n",
|
|
"estatisticas_trechos = estatisticas_trechos.sort_values(by='Media_PAX_Diario', 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_Diario', hue='Trecho', palette='viridis', legend=False)\n",
|
|
"plt.title(f'Top {NUM_TRECHOS} Trechos Mais Relevantes (Média de PAX Diário)')\n",
|
|
"plt.ylabel('Média Diária de Passageiros')\n",
|
|
"plt.xlabel('Trecho (Origem - Destino)')\n",
|
|
"plt.xticks(rotation=45)\n",
|
|
"plt.tight_layout()\n",
|
|
"plt.show()\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "287b32d3",
|
|
"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": "4003d6aa",
|
|
"metadata": {
|
|
"execution": {
|
|
"iopub.execute_input": "2026-06-07T23:05:33.381203Z",
|
|
"iopub.status.busy": "2026-06-07T23:05:33.381075Z",
|
|
"iopub.status.idle": "2026-06-07T23:05:33.465423Z",
|
|
"shell.execute_reply": "2026-06-07T23:05:33.464164Z"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"== RESULTADO DO FLEET ASSIGNMENT ==\n",
|
|
"Status: Optimal\n",
|
|
"Distância Total Minimizada: 28351.05 km\n",
|
|
"\n",
|
|
"Alocações (Voos Diários):\n",
|
|
"\n",
|
|
"Trecho: SBMA-SBBR (Voos necessários: 1)\n",
|
|
" -> ETA6 (Base SBBR): 1 voo(s)\n",
|
|
"\n",
|
|
"Trecho: SBVH-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: SBBE-SBMA (Voos necessários: 1)\n",
|
|
" -> ETA1 (Base SBBE): 1 voo(s)\n",
|
|
"\n",
|
|
"Trecho: SBSJ-SBVT (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
|
|
}
|