0

我正在编写一个程序,需要 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])

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

4

1 回答 1

1

这是一个单服务器排队系统,其中服务器是跑道。像这样的一般离散事件系统可以使用事件调度进行编程,基于优先级队列来确定接下来要发生的事情。您可以阅读此 github 存储库中的 PDF 文件以进行相当完整的讨论。

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

  • 到达时间i ← 到达时间i-1 + 到达间隔时间i
  • start_landing_time i ← max(arrival_time i , finish_landing_time i-1 )
  • 完成着陆时间i ← 开始着陆时间i +着陆时间i

换句话说,从飞机的角度来看

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

您可以将虚构的第零架飞机初始化为 0.0 arrival_timefinish_landing将上述逻辑置于循环中,并遍历指定数量的飞机或直到达到停止时间。由于逻辑是纯顺序的,您可能会丢失索引并仅回收变量。在伪代码中,并假设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如果您想知道飞机“在系统中”多长时间,则飞机的延误。将相应的语句放在循环中的适当位置,并使用您认为合适的结果数据。

于 2020-11-30T00:30:35.333 回答