我一直在尝试实现单个服务器队列。我已经将Norm Matloff 的 Simpy 教程中的一些伪代码改编为 Python,代码在这里。现在我正在努力寻找某种方法来计算工作/客户的平均等待时间。
在这一点上,我的大脑已经将自己打成一个结!任何指针、想法、提示或伪代码将不胜感激。
我一直在尝试实现单个服务器队列。我已经将Norm Matloff 的 Simpy 教程中的一些伪代码改编为 Python,代码在这里。现在我正在努力寻找某种方法来计算工作/客户的平均等待时间。
在这一点上,我的大脑已经将自己打成一个结!任何指针、想法、提示或伪代码将不胜感激。
您应该知道每个客户何时到达队列。当他们到达服务器时,您应该将服务的客户数量加一,并累积他等待的时间。在模拟结束时,您只需将累积时间除以客户数量,您就有了工作/客户的平均等待时间。
核心问题在于考虑不同的事件并根据这些事件更新统计数据。
您的模拟应该将模拟的所有结构初始化为合理的状态:
一旦所有系统都已初始化,您将创建一个客户到达的事件。这通常由某个给定的分布决定。生成系统事件将需要更新系统的统计信息。此时您可以选择生成所有工作/客户到达时间。每个客户的服务时间也是您将从给定分布中生成的东西。
然后,您必须处理每个事件并相应地更新统计信息。例如,当第一个客户到达时,从模拟开始到当前时间,队列一直是空的。队列中的平均客户数量可能是一个感兴趣的参数。您应该将 0 * 经过的秒数累积到一个累加器中。一旦客户到达空队列,您应该生成服务时间。下一位客户将在给定工作完成之前或之后到达。如果下一个客户在前一个客户得到服务之前到达,那么您将他添加到队列中(累积没有人等待的事实)。根据接下来发生的事件,您必须累积在该时间间隔内发生的统计信息。服务器的空闲时间也是此类模拟中感兴趣的参数。
为了让事情更清楚,请考虑有 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
希望这有助于它似乎有点冗长。