我是一个航空极客,我试图计算出我可以从一个城市起飞的航班的最大数量。我能够获得一个 Dataframe ,其中包含所有到达或离开一个城市的航班时刻表,并试图找出一种有效的方法来运行代码。算法的细节如下:
- Dataframe包含航班起飞时间、到达时间、起飞城市、到达城市列
- 出发时间:打印时间
- 到达时间:到达时间
- 出发城市:原始
- 到达城市:目的地
1.我当前所在的城市被标识为HUB。所有离开该枢纽的航班都将乘坐下一航班返回该枢纽。(例如,如果我的枢纽是纽约,我将从纽约飞往匹兹堡。我的下一航班将是匹兹堡飞往纽约)
1.您可以在枢纽外开始新的一天,即飞入枢纽再飞出
1.下一航班的起飞时间必须大于上一航班的到达时间
- Dataframe 已经按航班的起飞时间排序
下面是我解决这个问题的第一种方法:
def iter_func(df,sch,conex):
flt = df.iloc[0]
df = sch[(sch['ORIG']==flt.DEST) & (sch['DPTR_TIME']>flt.ARRV_TIME+timedelta(hours=conex))]
if df.shape[0]==0:
return 1
else:
return 1 + iter_func(df,test,conex)
该函数读入城市的初始航班时刻表并选择第一个航班。然后它将创建另一个 Dataframe ,该 Dataframe 以我飞行的城市开始,并确保我能够连接到下一个航班。正如您所看到的,此代码仅输出原始时刻表中第一个航班的可能航班。
我的目标是返回一个航班列表,其中包含在一天内最有可能离开某个城市的航班。
1条答案
按热度按时间brgchamk1#
为了扩展我的评论,这里有一个简单的方法来处理这个问题。
首先,我们生成“往返行程”,即从枢纽到另一个机场并返回的可行行程(“可行”行程是在第一段完成后离开远程机场的行程)。对于给定的出境航班,我们选择返回最快的航班。请注意,它不一定是“第一个返回的航班”,因为对于给定的路线,持续时间可能会有所不同:例如,你可能有一个去JFK的航班,在上午10点着陆,然后有两个回程航班,一个在10:30起飞,在下午1点到家,第二个在10:35起飞,但在下午12:50更早到达。
第二,我们选择最长的可行往返序列,也就是说,在下一个往返开始之前,必须完成一个往返,这个序列贪婪地选择返回时间的第一个往返,然后选择在那个时间之后离开的第二个往返,再一次选择最快返回的往返,以此类推。
在这两个步骤中,贪婪方法保证我们找到全局最优:
1.在第一步中,为给定的第一段“X”选择比我们所选择的(第一个返回的)更晚返回的往返没有优势。
1.在第二步中,选择下一个比我们选择的更晚返回的往返没有任何优势(同样,第一个返回)。
假飞行数据生成器
为了进行实验,我们编写了一个伪飞行数据的随机生成器,唯一的要求是
ARRV_TIME > DPTR_TIME
,我们不关心如何合理地安排城市,使距离满足三角不等式,或者飞行时间与距离大致一致。例如:
机场代码和航班号当然是随机的。
往返
如上所述,这里的算法简单地为任何出港航班选择第一个可行的返航航班 * 通过到达时间 *。
我们上面的假数据示例:
选择往返行程的最长序列
既然我们已经缩小了有趣的往返范围,我们可以通过返回(到达)时间贪婪地选择第一个往返,然后选择下一个往返,等等。
继续我们上面的假例子:
速度
在更现实的数据大小上性能如何?交叉连接不是很昂贵吗?
这个连接的大小实际上是O(p^2),其中p是枢纽机场和给定机场之间的最大航班数,实际上,即使是忙碌的机场,这个值也很小。
对于伪数据,该方法表现得相当好。