我对离散事件模拟期间的出队机制有疑问。
大多数实现使用某种优先级队列,可用于快速检索具有最早时间戳的事件。当无法安排此类事件时会发生什么,因为它需要一个能够运行的资源。
队列中可能还有另一个事件,其时间戳大于资源上阻止的事件的时间戳。
例如,我们假设我们正在为一家杂货店建模,其中包括单独的结账行和每行收银员。进入结账线的购物者是一个事件。我们根据购物者进入结账行的时间将此事件排入队列。但是,我们的模拟应该执行两个这样的事件的顺序,不一定是他们进入结账行的时间顺序,因为收银员可能以不同的顺序释放。
在这种情况下,如何仅使用基于时间戳的优先级队列 - 并且独立于资源可用性 - 如何解决?
答案 0 :(得分:1)
如果客户身份在您的模拟中并不重要,那么每个收银员都需要一个队列,或者至少需要一个等待客户的队列(例如,我会加入三个人的队列,每个队列中有一个项目,一个人有一个人完整的小车,所以只是一个队列长度可能无法捕获合并该启发式所需的信息)。
当客户加入队列时,排队客户的数量会增加,或者客户被推到收银员的队列中。
当收银员准备好服务时,第一个客户会从收银员的队列中弹出。因此,客户服务事件不取决于客户到达的时间,而是取决于收银员何时准备好。
这些队列或计数器独立于事件的调度机制 - 调度的事件操纵这些队列,它们不依赖于它们进行调度。
答案 1 :(得分:1)
正如Pete Kirkham指出的那样,重要的是要注意客户等待的行(队列)与用于确定事件排序的优先级队列是完全不同的。
在离散事件模拟中,事件是系统状态发生变化的时间点。当一个事件发生时,你会根据状态找出下一步该做什么。加入客户群是一件大事,但也有资格获得服务。一旦客户有资格获得服务,该事件的逻辑就必须检查服务是否可行。如果是,请为服务结束时安排新事件。如果存在资源限制,则不会调度任何内容并且该客户处于暂停状态。但是,在将来的某个时刻,所需的资源将变得可用。这也是一个事件,该事件的逻辑应检查是否由于缺乏资源而暂停客户。如果没有,则无需安排任何事情,但如果是,您现在可以为客户安排实际服务。您可以看到队列中的客户延迟会随着资源限制而增加。
有关离散事件模拟如何工作的更完整的解释,请查看此introductory tutorial paper。