In [3]:
#coding:utf-8
import csv
import numpy as np
import pandas as pd
import xlrd
import datetime
import matplotlib.pyplot as plt
#读取InputData这个文件,自己的文件放在哪里就用什么路径
Csv_path = 'D:\\BaiduNetdiskDownload\\ICM\\航站楼登机口分配问题'
Pucks = pd.read_excel(Csv_path+'\\InputData(3).xlsx', sheet_name = 'Pucks', encoding='utf-8')
Gates = pd.read_excel(Csv_path+'\\InputData(3).xlsx', sheet_name = 'Gates', encoding='utf-8')
#Pucks航班信息,类型pandas对象
Pucks
#Gates登机口信息,类型pandas对象
Gates
#转换为numpy数组
pucks = np.array(Pucks)
gates = np.array(Gates)
#把输入数据里的D、I和飞机型号转换为数值
#I = 1;D = 2;窄体机 = 1;宽体机 = 2
Wb = [ 332, 333, '33E', '33H', '33L', 773]
Nb = [319, 320, 321, 323, 325, 738, '73A', '73E', '73H', '73L']
for i in pucks:
if i[4] in Wb:
i[4] = 2
if i[4] in Nb:
i[4] = 1
if i[3] == 'I':
i[3] = 1
else:
i[3] = 2
if i[8] == 'I':
i[8] = 1
else:
i[8] = 2
#TF是每个时间在地面上的飞机数
TF = np.zeros(288)
TF
#TS是每个时间登机口停放的飞机类型,窄体机=1;宽体机=2
TS = np.zeros((69, 288))
TS
#每个班次停放在哪个登机口,T厅的机口为T后的数值,S厅的机口为S后数值+28
Airp = np.zeros(245)
Airp
#外层循环班次,内层循环找适合的登机口
for idi,i in enumerate(pucks):
for idj,j in enumerate(gates):
#print(i)
#print(j)
#判断起飞落地机型是否匹配
if (i[3] == j[3] or j[3] == 3) and (i[8] == j[4] or j[4] == 3) and i[4] == j[5]:
ti1 = int((i[1].hour*60+i[1].minute)/5)
ti2 = int((i[6].hour*60+i[6].minute)/5)
#21号起飞的飞机到287时刻就不再计算
if i[5].day == 21:
ti2 = 287
#19号降落的飞机按顺序安排在20号0:00时间点
if i[0].day == 19:
ti1 = 0
for k in range(ti1, min(ti2+1, 287)):
TF[k] += 1
#print (ti1, ti2)
#print(i[0].day)
#若找到合适登机口,把未来需要使用的时间标记为飞机类型正数,起飞后的45分钟标记为负数
if i[0].day == 19:
#print('heool')
if TS[idj][0] == 0:
Airp[idi] = j[0]
for k in range(0, int(min(ti2+1, 287))):
if i[4] == 1:
TS[idj][k] = 1
else:
TS[idj][k] = 2
for k in range(int(min(ti2+1, 287)), int(min(ti2+10, 287))):
if i[4] == 1:
TS[idj][k] = -1
else:
TS[idj][k] = -2
break
else:
if TS[idj][ti1] == 0:
Airp[idi] = j[0]
for k in range(ti1, min(ti2+1, 287)):
if i[4] == 1:
TS[idj][k] = 1
else:
TS[idj][k] = 2
for k in range(min(ti2+1, 287), min(ti2+10, 287)):
if i[4] == 1:
TS[idj][k] = -1
else:
TS[idj][k] = -2
break
if Airp[idi] == 0:
Airp[idi] = -1
#计算宽体机和窄体机的成功分配律
N = 0
W = 0
uN = 0
uW = 0;
for id,i in enumerate(pucks):
if i[4] == 1:
N += 1
if Airp[id] > -1:
uN += 1
else:
W += 1
if Airp[id] > -1:
uW += 1
print(uN, N)
print(uN/N)
print(uW/W)
print((uN+uW)/(N+W))
#计算每个时刻宽体机口和窄体机口的使用率
use = np.zeros(288)
useN = np.zeros(288)
useW = np.zeros(288)
N = 0
W = 0
for i in gates:
if i[5] == 1:
N += 1
else:
W += 1
for j in range(0,288):
cnt = 0
cntN = 0
cntW = 0
for i in range(0, 69):
if TS[i][j] > 0:
cnt += 1
if gates[i][5] == 1:
cntN += 1
if gates[i][5] == 2:
cntW += 1
use[j] = cnt/69
useN[j] = cntN/N
useW[j] = cntW/W
#使用率图
#from matplotlib.font_manager import FontProperties
#font1 = FontProperties(fname=r"c:\windows\fonts\simsun.ttc",size=20) #可指定计算机内的任意字体,size为字体大小
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
fig = plt.figure(figsize=(13,10))
# plt.xlim((0,300))
# plt.ylim((0.0,1.0))
plt.tick_params(labelsize=13) #坐标轴字体大小
plt.xticks(np.arange(0, 300, 20)) #横坐标刻度
plt.yticks(np.arange(0, 1, 0.1)) #纵坐标刻度
plt.xlabel('时间', size = 15) #横坐标标签
plt.ylabel('登机口占用率', size = 15) #纵坐标标签
plt.title('登机口利用率', size = 15) #标题
plt.plot(range(0, 288), use, label = '总机口利用率')
plt.plot(range(0, 288), useN, label = '窄体机口利用率')
plt.plot(range(0, 288), useW, label = '宽体机口利用率')
plt.legend(loc = 'upper right', fontsize = 12) #图例位置和字体大小
plt.show()
#落地飞机图
plt.figure(figsize=(13,10))
plt.tick_params(labelsize=13)
plt.xticks(np.arange(0, 300, 20))
plt.yticks(np.arange(0, 700, 100))
plt.xlabel('时间', size = 15)
plt.ylabel('落地飞机数', size = 15)
plt.title('落地飞机', size = 15)
plt.bar(range(0, 288),TF,facecolor='#9999ff')
plt.show()