使用事件图支持des建模
DESp的Python项目详细描述
绝望
despy是离散事件模拟的python实现 (DES)基于Schruben事件图的方法(见使用事件图的模拟建模)。 它还支持乐高组件框架(请参见用乐高构建复杂模型和用simkit基于组件的仿真建模。
安装
- 已安装Python 3.7或更高版本
pip安装despy
运行示例场景
示例组件位于examples
包中,其中
示例中的示例场景。运行
包
- SimpleServer
- 有限容量服务器
- 实体服务器
- 带Reneges的服务器
- 传输线
- 置信区间示例:终止情况
- 置信区间示例:稳态情况
定义事件图组件
每个事件图组件对应于despy模型中的特定元素
<表><广告>\u init()\u
nan
或[]
reset()
方法和run()
方法
notify_state_change()
执行模型
<表><广告>eventlist.verbose=true
事件列表。停止时间(xxx)
eventlist.stop_on_event(n,'foo')
eventlist.reset()
事件列表.start_simulation()
示例:simpleserver
simpleserver组件是multiple
服务器队列。它的状态表示由表示
队列中的客户数( 估计置信区间最直接的方法是
多个独立复制。
若要运行多个复制,请包装 statistics对象是实现 内部统计对象使用stat从单个复制到
为该复制生成值(通常是平均值)。自模拟数据
是典型的自相关,估计的方差可能会有极大的偏差。
因此,不能应用置信区间的常用表达式。
重要的是 外部统计对象通常用于从内部收集数据
统计对象。每次复制后,来自内部统计信息的值
对象(通常是平均值)传递给外部对象。 以这种方式,不管传递的值是什么,外部statistics对象
然后(有足够数量的复制)可以为
有问题的值(所有关于中心极限定理的"通常"假设)。 参数是组件中的变量,在给定的
模拟。这些是模拟的输入,因此必须
通过 状态变量在给定的模型复制中发生变化。满
状态变量的定义必须包含其初始值,因为
在每个组件的 每个状态转换都必须伴随一个 事件在 按照惯例,randomvariate类将其参数指定为
建造商。 有几种方法可以实例化一个随机变量队列中的客户数
)和可用的客户数
服务器(可用服务器数
)。它不是一个独立的模型,但必须是
设置为"侦听"另一个组件,该组件定期安排到达
事件。
最基本的组件是arrivalprocess。
# Instantiate ArrivalProcess component with interarrival times Exponential(1.7)
interarrival_time_generator = RandomVariate.instance('Exponential', mean=1.7)
arrival_process = ArrivalProcess(interarrival_time_generator)
# Instantiate SimpleServer component with 2 servers and service times Gamma(1.7, 1.8)
number_servers = 2;
service_time_generator = RandomVariate.instance('Gamma', alpha=1.7, beta=1.8)
simple_server = SimpleServer(number_servers, service_time_generator)
# Add the SimpleServer instance to the ArrivalProcess instance as a
# SimEventListener
arrival_process.add_sim_event_listener(simple_server)
# These statistics objects will collect the time-varying number_in_queue
# and number_available_servers of the SimpleServer instance
number_in_queue_stat = SimpleStatsTimeVarying('number_in_queue')
number_available_servers_stat = SimpleStatsTimeVarying('number_available_servers')
# Add the statistics objects as StateChangeListeners
simple_server.add_state_change_listener(number_in_queue_stat)
simple_server.add_state_change_listener(number_available_servers_stat)
# Execute the model for 100,000 time units
stopTime = 100000;
EventList.stop_at_time(stopTime)
# Initialize the EventList and put all Run events on the EventList
EventList.reset()
# Execute the simulation
EventList.start_simulation()
运行多个复制
reset()
和start\u simulation()
在中调用for
循环。然而,收集统计数据需要有所不同
对于"内部"统计对象和"外部"统计对象。stateChange()方法的
stateChangeListeners
更新计数器。两种主要类型是"计数"和"时变"。
它们通常以两种不同的方式使用:"内部"和"外部"。
clear()
每个内部统计对象
在每次复制之前,以确保复制之间的独立性。参数与状态变量
参数
\u init()方法传入。参数可以是标量,例如
生成不同值的服务器或随机变量的总数
每次呼叫时,例如服务时间生成器。在这种情况下,虽然生成的值可能不同,
发行版本身保持不变。
状态变量
reset()
方法中设置。只有事件方法是
允许更改状态变量的值,因为事件由状态转换标识。因此,给定的
在模拟时间的任何一点上的状态完全由
初始值和随后的状态转换。notify_state_change()
调用,该调用
通知stateChangeListsner给定的状态已更改。这允许
只写入模型动力学而不涉及的组件
收集统计数据,因为这可以通过适当的统计数据来完成
对象,它们是statechaneglistsner。定义事件
simentitybase
的子类中定义为普通方法。在事件方法中,
只有(按顺序):self.cancel()
self.secschedule()
随机变量实例化
- 直接实例化,例如
指数(平均值=2.3)
- 使用带关键字的factory方法:randomvariate.instance('exponential',mean=2.3)
- 在字典中使用randomvariate factory方法(使用
params
关键字):
params_map={mean:2.3}
RandomVariate.instance('Exponential', params=params_map)