事件-驱动模拟(Event-driven simulation)

来源:互联网 发布:it教程 编辑:程序博客网 时间:2024/05/18 00:23

事件-驱动模拟

 

如果事件不能保证按照规律的时间间隔发生,并且事件发生的时间步长限定没有一个很好的值(步长如果太小,就会导致模拟需要的时间太长;步长过大,就会导致许多事件变得不可控),这种情况下,使用事件驱动的模拟是更合适的。

 

一个典型的例子可能是,模拟银行中的排队情况,银行里的客户不是以规律的时间间隔到达银行来办理业务,后来的客户办理业务时,并不一定马上能够进行业务办理,可能面对的是一个由其他等待办理业务的客户组成的长长的队伍。

 

这种方法(即银行客户等待办理业务的队列)使用的是发生在不同时间的事件的列表,并且按照时间增长的顺序处理这些事件。 处理这些事件可能导致后序事件的改变。这种模拟方式,时间从这个事件的时间“跳到”下个事件的时间。

 

我们怎么停止模拟呢?我们可以在时间达到某个点时停止,也可在系统达到某个状态时停止。下面是一个通用的事件-驱动算法:

1 Initialize system state

2 Initialize event list

3 While (simulation not finished)

3 Collect statistics from current state

3 Remove first event from list, handle it

3 Set time to the time of this event.

事件列表是如何管理的?它应该按照时间增加的顺序进行处理的(可以使用高效的优先级堆)。在模拟开始时,并不在队列中产生所有事件(产生所有的事件类似于在模拟开始时就知道整个事件的全部队列)。相反,我们通过某些的事件来初始化模拟,这些事件与其他事件有相关的时间联系。某些事件可以通过调动后来的事件来处理,后来的事件被插入到事件队列的合适位置。

 

诚如上文所述,我们可以在时间达到或超过某一点停止时停止模拟,或一旦系统达到一定的状态(比如上述提到例子中,银行排队超过两个队列)。有时我们想让模拟的终止条件本身是随机的:我们可以安排一个随机的伪事件,这个事件不会改变模型的状态,而只是停止模拟。

3 0