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
共20个文件
xlsx:7个
png:6个
py:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 8 浏览量
2023-04-20
08:17:44
上传
评论
收藏 1.61MB ZIP 举报
温馨提示
数学建模比赛项目基于python实现航班登机口分配问题解决方案源码(带说明文档).zip 【资源介绍】 数学建模比赛航班登机口分配 【项目概况】 项目是“华为杯”全国研究生数学建模比赛的航班登机口分配问题的解决方案 该解决方案获得了二等奖 【代码简介】 Main.py 项目的主程序; 编写了乘客类、登机口类、飞机类、机场类等模拟了整个飞机落地寻找登机口的过程; 编写了计算结果的可视化函数,包括折线图、柱状图、甘特图等 GA2_params.py 一个遗传算法程序,用以优化参数 merge_table.py 数据预处理的文件,用于连接表格
资源推荐
资源详情
资源评论
收起资源包目录
数学建模比赛项目基于python实现航班登机口分配问题解决方案源码(带说明文档).zip (20个子文件)
GA2_params.py 8KB
Passenger.xlsx 173KB
InputData.xlsx 222KB
Main.py 30KB
output
问题二登机口.xlsx 19KB
问题一登机口.xlsx 20KB
总体旅客换乘时间分布图.png 88KB
窄体机分配到的登机口及数量.png 42KB
总体旅客换乘紧张度分布图.png 76KB
20日各登机口使用率.png 204KB
20日各登机口使用情况.png 1.02MB
宽体机分配到的登机口及数量.png 18KB
.idea
misc.xml 194B
modules.xml 274B
Competition.iml 440B
Pucks.xlsx 56KB
mergetable.py 2KB
说明文档.md 724B
Matrix.xlsx 11KB
Transfer.xlsx 84KB
共 20 条
- 1
资源评论
热爱编码的z同学
- 粉丝: 1763
- 资源: 2127
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功