离散事件排队模拟

时间:2009-04-13 01:18:55

标签: python queue

我试图实现单个服务器队列。我已经将Norm Matloff的Simpy教程中的一些pseudocode改编为Python,代码为here。现在我正在努力寻找一些方法来计算工作/客户的平均等待时间。

此时我的大脑已经结成了一个结!任何指针,想法,提示或伪代码将不胜感激。

1 个答案:

答案 0 :(得分:5)

您应该知道每个客户何时到达队列。当他们到达服务器时,您应该向服务的客户数量添加一个,并累积他等待的时间。在模拟结束时,您只需将累计时间除以客户数量,您就可以获得工作/客户的平均等待时间。

核心问题在于对不同事件进行核算并根据这些事件更新统计数据。

您的模拟应该将模拟的所有结构初始化为合理的状态:

  • 将客户队列初始化为其中的任何人
  • 将所服务客户的任何数量初始化为0
  • 将累积的等待时间初始化为0
  • 将当前系统时间初始化为0

一旦所有系统都已启动,您就会创建一个cusotmer到达的事件。这通常由某些给定的分布决定。生成系统事件需要更新系统的统计信息。此时您可以选择生成所有工作/客户到达时间。每个客户的服务时间也是您将从给定的分发中生成的。

然后,您必须处理每个事件并相应地更新统计信息。例如,当第一个客户到达时,从模拟开始到当前时间,队列已经是空的。队列中的平均客户数可能是感兴趣的参数。您应该将0 *经过的秒累积到累加器中。一旦客户到达空队列,您应该生成服务时间。下一个客户将在给定作业完成之前或之后到达。如果下一个cusomter在前一个cusomter被服务之前到达,那么你将他添加到队列中(累积没有人等待的事实)。根据接下来发生的事件,您必须累积在该时间间隔内发生的统计信息。服务器的空闲时间也是这种模拟中感兴趣的参数。

为了使事情更加清楚,考虑到有18个人在线并且服务器已经完成了第一个客户的工作。第18个客户的到达与第一个人工作完成的时间之间的间隔是要添加到累加器的加权平均值。例如,已有18人排队4秒。

服务器尚未处于空闲状态,因此您应该从队列中取出一个条目并开始处理下一个作业。这项工作将花费一些时间通常从某些分配中定义。如果下一个客户在当前工作完成之前到达,那么17个人排队的事实将被添加到您的加权值中。

再次在基础层面,您将在系统中的相关事件之间累积统计信息:

while (current_time < total_simulation_time)
      handle_next_event
      generate_subsequent_events
      accumulate_statistics
      update_current_time
endwhile

Display "Average wait time: " accumulated_wait_time / number_of_customers_served

希望这有助于它看起来有点长。

相关问题