import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from pylab import mpl
import copy
import random
import pandas as pd
from datetime import timedelta
from datetime import datetime
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
GAP_TIME = timedelta(minutes=45)
def get_gates_dict(data):
"""
读取登机门信息
:return: key为登机口名称, value为gate实例
"""
gates_dict = {}
for i in range(len(data['Gates'])):
one_row = data['Gates'].iloc[i, :]
gate = Gate(name=one_row['登机口'],
terminal=one_row['终端厅'],
region=one_row['区域'],
arrive_type=one_row['到达类型'],
leave_type=one_row['出发类型'],
plane_type=one_row['机体类别'])
gates_dict[one_row['登机口']] = gate
return gates_dict
def get_planes_dict(pucks):
"""
读取每架飞机的信息
:return:
"""
"""
宽体机(Wide-body):332, 333, 33E, 33H, 33L, 773
窄体机(Narrow-body):319, 320, 321, 323, 325, 738, 73A, 73E, 73H, 73L
"""
planes_dict = {}
for i in range(len(pucks)):
one_row = pucks.iloc[i, :]
arrive_time = str(one_row['到达时刻']).split(':')[:2]
leave_time = str(one_row['出发时刻']).split(':')[:2]
arrive_date_time = datetime(one_row['到达日期'].year,
one_row['到达日期'].month,
one_row['到达日期'].day,
int(arrive_time[0]),
int(arrive_time[1])
)
leave_date_time = datetime(one_row['出发日期'].year,
one_row['出发日期'].month,
one_row['出发日期'].day,
int(leave_time[0]),
int(leave_time[1])
)
if str(one_row['飞机型号']) in ['332', '333', '33E', '33H', '33L', '773']:
plane_type = 'W'
else:
plane_type = 'N'
if arrive_date_time.day == 20 or leave_date_time.day == 20 or (arrive_date_time.day == 19 and leave_date_time.day == 21):
plane = Plane(name=one_row['飞机转场记录号'],
arrive_time=arrive_date_time,
leave_time=leave_date_time,
arrive_type=one_row['到达类型'],
leave_type=one_row['出发类型'],
plane_type=plane_type,
num_arrive_peo=one_row['乘客数_x'],
num_leave_peo=one_row['乘客数_y'])
planes_dict[one_row['飞机转场记录号']] = plane
return planes_dict
def get_passengers_dict(passengers):
"""
读取所有需要换乘乘客的信息
:return:
"""
passengers_dict = {}
for i in range(len(passengers)):
one_row = passengers.loc[i, :]
if one_row['到达日期'].day == 20 or one_row['出发日期'] == 20:
passenger = Passenger(arrive_plane=one_row['飞机转场记录号_x'],
leave_plane=one_row['飞机转场记录号_y'],
arrive_type=one_row['到达类型'],
leave_type=one_row['出发类型'],
arrive_date=one_row['到达日期'],
leave_date=one_row['出发日期'],
num_passenger=one_row['乘客数'])
passengers_dict[i] = passenger
return passengers_dict
def timedelta_to_hours(time_delta):
"""
时间差转换为小时
:param time_delta:
:return:
"""
return time_delta.days * 24 + time_delta.seconds / 3600
class Gate:
"""
登机口类
"""
def __init__(self, name, terminal, region, arrive_type, leave_type, plane_type):
self.name = name
self.terminal = terminal
self.region = region
self.arrive_type = arrive_type
self.leave_type = leave_type
self.plane_type = plane_type
if len(arrive_type) != len(leave_type):
self.level = 2
elif len(arrive_type) == 1 and len(arrive_type) == 1:
self.level = 1
else:
self.level = 3
self.ever_used = False
self.free_time_sections = [[datetime(2018, 1, 19, 0, 0), datetime(2018, 1, 22, 0, 0)]]
self.record = {}
self.receive_planes = []
def _check_free(self, plane):
"""
检查登机口有没有满足飞机停留的窗口时间
若有则返回True, 剩余空窗时间, 登机口最新空窗时间
:param plane:
:return:
"""
for each_section in self.free_time_sections:
if each_section[0] <= plane.arrive_time and each_section[1] >= plane.leave_time:
new_free_sections = copy.deepcopy(self.free_time_sections)
new_free_sections.remove(each_section)
new_free_sections.append([each_section[0], plane.arrive_time])
new_free_sections.append([plane.leave_time, each_section[1]])
new_free_sections = sorted(new_free_sections, key=lambda x: x[0])
return True, (plane.arrive_time - each_section[0] + each_section[1] - plane.leave_time), new_free_sections
return False, -1, None
def cal_use_rate(self):
"""
计算一个登机口在20日的使用时间占比
:return:
"""
free_time = timedelta(minutes=0)
for each_section in self.free_time_sections:
if (each_section[0] < datetime(2018, 1, 20)) and (each_section[1] > datetime(2018, 1, 21)):
free_time += datetime(2018, 1, 21) - datetime(2018, 1, 20)
elif (each_section[0] < datetime(2018, 1, 20)) and (each_section[1] > datetime(2018, 1, 20)) and (each_section[1] < datetime(2018, 1, 21)):
free_time += each_section[1] - datetime(2018, 1, 20)
elif (each_section[0] > datetime(2018, 1, 20)) and (each_section[1] < datetime(2018, 1, 21)):
free_time += each_section[1] - each_section[0]
elif (each_section[0] > datetime(2018, 1, 20)) and (each_section[0] < datetime(2018, 1, 21)) and (each_section[1] > datetime(2018, 1, 21)):
free_time += datetime(2018, 1, 21) - each_section[0]
use_rate = 1 - (free_time.days * 24 + free_time.seconds / 3600) / 24
if use_rate < 0:
print(self.free_time_sections)
return use_rate
def is_allowed_in_gate(self, plane):
"""
判断飞机能否进该登机口
:param plane:
:return:
"""
if (plane.arrive_type in self.arrive_type) and (plane.leave_type in self.leave_type) and (plane.plane_type in self.plane_type):
return self._check_free(plane)
else:
return False, -1, None
def in_gate(self, plane, gate_info_dict):
"""
飞机进站,更新登机口信息
:param plane:
:param gate_info_dict: {'gate': each,'gap_time': gap_time,'new_free_sections': new_free_sections}
:return:
"""
self.free_time_sections = gate_info_dict['new_free_sections']
self.ever_used = True
arrive = max(0, timedelta_to_hours(plane.arrive_time - datetime(2018, 1, 20)))
leave = min(24, timedelta_to_hours(plane.leave_time - datetime(2018, 1, 20)))
self.record[plane.name] = [arrive, leave - arrive]
self.receive_planes.append(plane)
class Passenger:
"""
乘客类
具有相同换乘的乘客归�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
数学建模比赛项目基于python实现航班登机口分配问题解决方案源码(带说明文档).zip 【资源介绍】 数学建模比赛航班登机口分配 【项目概况】 项目是“华为杯”全国研究生数学建模比赛的航班登机口分配问题的解决方案 该解决方案获得了二等奖 【代码简介】 Main.py 项目的主程序; 编写了乘客类、登机口类、飞机类、机场类等模拟了整个飞机落地寻找登机口的过程; 编写了计算结果的可视化函数,包括折线图、柱状图、甘特图等 GA2_params.py 一个遗传算法程序,用以优化参数 merge_table.py 数据预处理的文件,用于连接表格
资源推荐
资源详情
资源评论




















收起资源包目录























共 20 条
- 1
资源评论


zui初的梦想
- 粉丝: 811
- 资源: 1744
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制
