所有离散事件程序自动以软件时钟的方式保持当前模拟时间。在SimPy中可以通过now()函数得到当前模拟时间,在模拟开始的时候,软件时钟设置为0.0。用户不能直接改变软件时钟。
当模拟软件运行时,当前模拟时间随着事件进行一步步增加。随着模拟系统状态的改变,事件随时会发生。如:顾客的到达就是一个事件,同理,顾客的离开也是。
使用SimPy是必须载入Simulation模块:
- from SimPy.Simulation import *
以下语句必须在出现在任何SimPy进程被激活之前,用来初始化模拟系统的全局变量和把软件时钟置零:
- initialize()
接下来是一些创建和激活对象的SimPy语句。当遇到下面语句时,模拟系统将开始运行:
- simulate(until=endtime)
然后模拟开始,SimPy开始查找并执行第一个预订的事件,执行完后,继续寻找并执行第二个事件,以此类推。这将持续进行直到出现下列情况:
- 没有可执行的时间(这时now()等于最后一个事件发生的时间)
- 模拟时间到达结束时间(now()等于结束时间)
- stopSimulation()命令被执行(now()等于当stopSimulation()被调用时的模拟时间)
- stopSimulation()
在模拟结束以后,附加的语句仍可以执行,这对于保存或显示像平均等待时间或队列长度这些结果将非常有用。
接下来的代码仅仅显示了模拟程序的主要部分(能够完整执行的代码请看示例1和示例2),这里Message是一个预定义的Process的子类,m是它的实例,是一个特定的消息。激活的m执行至少一个预定义的时间,这里执行m的PEM(这里是go),simulate(until=1000.0)语句将立即跳到第一个预定义的事件来开始运行模拟系统。它将一直运行下去知道事件执行完毕或模拟时间到达1000.0。当模拟结束,预先编写的Report方法将被执行用来显示结果:
- initialize()
- m = Message()
- activate(m, m.go(), at=0.0)
- simulate(until=1000.0)
- Report() # report results when the simulation finishes