本帖最后由 iesim 于 2009-8-7 11:54 编辑 2 ^4 J. u6 e% O8 m! e5 R' m* P
8 W! N4 ^. H: b) U0 I% u
不好意思,最近没来论坛。这是我对这个问题的理解。
, M2 s, W8 R! G" P0 x5 E1 ~: d2 b3 m) R7 ]7 p+ l* y, ^
对于零时刻事件和同时刻事件,实话实说,我对这两个概念也没有仔细分析过。如果有更权威的解释,我愿意更正自己的理解。
3 C$ O$ ?4 X, c% N) W1 {% t. E' |3 i7 s+ s7 m& P) Y8 i. h3 j
我的理解是,这两个的共性都是发生在用一个时刻的事件。但同时刻事件,在该时刻发生之前,事件次序已经有了一个规定(虽然在同一时刻发生),处理这些事件本身不会带来该时刻其他事件次序的改变。而零时刻事件则是那些处理起来有可能改变当前时刻事件发生列表次序的事件。3 @: d5 ?4 f; p- {6 G) S2 O. A1 t7 V
- E# t, ^" d9 ^" q6 k+ [
比如说我们目前的模型,我们争论的焦点,在还剩下7个资源时候,有两个大的事件,一个是让小球获取资源离开,另一个是资源减少而关闭Gate。 按照原来的模型结构,会使我们面临一个两难的境地,因为 Gate 嵌套在让小球获取资源离开的通路上。这时候的逻辑就很矛盾,如果让小球离开 Queue (Resource Pool),那么由于 Resource Pool 减少会触发 Equation 从而触发 Gate 的 DemandIn 端口而使得门关闭 (顺便说一句,Gate 因为受控于 DemandIn 这个数值,所以,可以随时关闭)。如果不让小球离开 Queue (Resource Pool),Gate 又形成一个通路。这时候的 Gate 的角色会随着小球在 Queue, Resource Pool 中的状态而改变,而且是 反作用力,形成矛盾。" w8 |$ ?6 x3 l. `: g# y; k @7 k7 j0 t
3 B. u, c) O. E( K: M这时候的情形打个比喻,像是一个人离开家到杂货店买东西,只要这个人不出门,小店就永远开着;只要这个人一离开家,小店就关门一样。
' s; {& f; ?4 Q' |+ m% E/ v# ]3 y/ ^9 K5 b5 p' S1 W: U
好像这个情形很难为仿真软件,每个仿真软件虽然都有自己的处理机制,但我们建立模型的时候,希望尽可能避免这种情况。 , H0 ]: M8 z) T% k/ U. y" a$ S, q
. G; E( x3 q+ d% R& E4 ]$ |" f" x+ Z
林伟用了stop message 这个方法很好,为什么这个方法可以解决问题? 是因为我们stop message 模块切断了让 Gate 即刻随着Resource Pool 状态改变的途径,按照刚才的比喻,这个人离开家门后,离开家的这个消息不会马上传给杂货店,杂货店也就不会关门。但如何保证 Gate 还会更新状态呢,因为在 Gate 模块当中有一个选项,就是每个小球通过 Gate 后,Gate 需要重新刷新状态,读取 DemandIn 的数值,这时候,Gate 就可以知道 Resource Pool 已经只剩下6个资源了,门这时候才关闭。
" U. z: p# D+ K+ l* `6 e' R D3 F
stop message 方法的采用需要比较高级的ExtendSim 建模技巧。
0 h% _& k1 L+ v; O1 K- }' g3 j2 i+ ]5 p3 A* D
我采用的方法比较适合初学人员。把刚才提到的两个矛盾逻辑拆分开。把Gate 放在 Resource Pool 的前面,按照刚才的比喻,就是说,杂货店告诉买东西的这个人,我们小店是开着的,你来吧;或者说,我们小店已经关门了,不要过来。把这个信息提前控制这个人是否应该离开家。
: K6 y5 I! N7 y ~- A- p, C$ v) l- N. r) ] u S/ @( A9 g
这个问题虽然很简单,但可以引出很多很深的仿真逻辑控制问题。 |