确定飞机到达之间的等待时间 python

Determine waiting times between plane arrivals python

我正在编写一个程序,需要 200 架飞机在 12 小时内按泊松分布分布,这些飞机需要降落在只有 1 条跑道的机场。我使用指数分布的反向 CDF 方法来确定到达间隔时间。但是,我好像无法计算空中的等待时间。

例如一架飞机在 100 秒到达,用 75 秒降落,在 175 秒完成。 飞机 2 在 150 秒到达,必须等待 175-150 = 25 秒。我如何编写一个我的函数可以输出的变量,考虑到等待时间也可以是 0 秒?

import math
import random
import numpy as np

def variable(amount_of_planes):
    plane_number = []
    time_between_planes = []
    plane_arrival_time = []
    plane_arrival = 0
    time_for_landing = np.array(random.choices([15, 45, 75, 105, 135, 165, 195, 225, 255, 285], weights=[0, 8, 16.5, 30.5, 20.5, 12.5, 5, 4, 3, 0], k=amount_of_planes))
    waiting_time = []
    for i in range(amount_of_planes):
        plane_number.append(i)
        waiting_time.append(i)
        #Take a random value from a uniform spread probability from 0 to 1
        n = random.random()
        #Generate time between plane arrivals by using the reverse cdf method
        time_between_planes = -math.log(1.0 - n) / 0.00462962962
        plane_arrival_time.append(time_between_planes)
        #Add the inter-event time to the running sum to get the next absolute event time
        plane_arrival = plane_arrival + time_between_planes
        plane_arrival_time.append(plane_arrival)  
        #My attemt at determining waiting time
        done_with_landing = 0
        if done_with_landing > plane_arrival: 
            plane_waiting_time = done_with_landing - plane_arrival
        else:
            plane_waiting_time = 0
        done_with_landing = plane_arrival + plane_waiting_time + time_for_landing[i]
        print(plane_arrival, done_with_landing, abs(plane_waiting_time), time_for_landing[i])

我需要等待时间的原因是为了争论这个模拟机场建造另一条跑道是否有意义。在这个项目中,我不关心从跑道起飞的其他飞机。

这是一个单机排队系统,服务器就是跑道。诸如此类的一般离散事件系统可以使用事件调度进行编程,基于优先级队列来确定接下来要发生的事情。您可以在 this github repository 阅读 PDF 文件以获得相当完整的讨论。

然而,单服务器队列具有纯顺序逻辑,可以使用以下递归关系实现为循环:

  • arrival_timei ← arrival_timei-1 + interarrival_time
  • start_landing_timei ← max(arrival_timei, finish_landing_timei-1)
  • finish_landing_timei ← start_landing_timei + landing_timei

换句话说,从平面上看

  1. 你有一个到达事件 interarrival_time 最后一架飞机到达后的时间单位(这是你的泊松过程);
  2. 您可以在抵达时开始着陆程序,也可以在前一架飞机着陆结束时开始,以较晚者为准;和
  3. 在您开始着陆后 landing_time 个时间单位实际完成着陆。

您可以将假想的第 0 架飞机的 arrival_timefinish_landing 初始化为 0.0,将上述逻辑放入循环中,然后迭代指定数量的飞机或直到停止时间到了。由于逻辑是纯顺序的,您可以丢失索引并只回收变量。在伪代码中,假设 interarrival_time()landing_time() 是迭代器,它根据需要给出相应的下一个值:

N = 200    # number of airplanes
arrival_time = finish_landing = 0.0
N times:
    arrival_time += interarrival_time()
    start_landing = max(arrival_time, finish_landing)
    finish_landing = start_landing + landing_time()

飞机的延误是 start_landing - arrival_time 如果您对飞机“排队”的时间感兴趣,或者 finish_landing - arrival_time 如果您想知道飞机“在机场”的时间有多长系统”。将相应的语句放在循环中的适当位置,然后使用您认为合适的结果数据。