我是AnyLogic的新手......但这让我发疯了!!!
这是超级基础...在AB模型中我希望一部分代理人从一个州走到另一个州......但它发生了一些我无法理解的事情:S
我有1000名特工...我期待950进入状态V3 ......
只有889名代理人改变状态:(
似乎情况被评估了两次......确实0.95 * 0.95 = 0.90 ..这正是代理人改变状态的百分比:(
任何人都可以帮我理解这个吗? :( 我必须修改整个模型......我什么时候必须把“条件”和“守卫”放在一起?
谢谢大家!!
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^
来自@sdaza model
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^
AnyLogic支持团队回答
_如果条件最初返回true,则对条件进行两次计算。当代理进入具有输出条件转换的状态时,执行初始检验。如果转换的某些条件返回true,则引擎会尝试触发它。这里再次检查条件。如果条件返回false,它将被取消,代理仍然处于该状态。换句话说,条件应该返回true两次才能执行。
在您的情况下,只有返回“true”的代理两次执行转换,概率与结果匹配:0.95 * 0.95 = 0.9。这是实际的概率。
我希望它会有所帮助_
我没理解为什么会这样......
答案 0 :(得分:1)
一些背景和一个开放的示例模型'有点幕后发生的事情可以帮助您理解AnyLogic的响应。
在模型的每个步骤(即,在模型开始时以及在开发人员明确创建的每个事件之后或者通过所使用的AnyLogic元素隐式地)检查AnyLogic条件。 AnyLogic还在封面下使用timeout 0事件来实现状态转换;也就是说,如果它确定任何类型的转换到期,它不立即执行,但会在相同的模拟时间内安排事件,这将在模型的下一步触发如果在同一模拟时间没有其他事件。如果你有专业版,你可以通过事件查看器在模型运行时看到这一点(见下文)。
由于上述原因,在模型开始时评估条件。如果是true
,则会计划超时0事件以实现转换。当此触发时,将再次检查该条件(因为在相同的模拟时间由于介入事件而不再可能)。如果这是第二次true
,那么过渡就会继续。
我改编了你的榜样。我只有Main
状态图,其中包含两个状态和两个转换:条件一(具有randomTrue(0.95)
条件)从状态1到状态2,超时1一个将状态2发送回状态1.通过将条件置于函数(check
)中,我可以添加一些额外的traceln
语句,以便我们更好地了解正在进行的操作。< / p>
运行此项(设置为Run Until time 0,以便在模型启动时暂停),并显示事件查看器。条件评估为true,因此您可以看到设置超时0转换事件。
我还添加了一些traceln
消息,用于发生条件转换和转换回状态1.这是来自运行的样本。 (一旦条件连续两次评估true
,转换将停止,因此将取决于为运行选择的随机种子。)
Checking condition at time 0.0: sampled true
Checking condition at time 0.0: sampled true
Probabilistically transitioned to state 2
Going back to state 1
Checking condition at time 1.0: sampled true
Checking condition at time 1.0: sampled true
Checking condition at time 1.0: sampled true
Probabilistically transitioned to state 2
Going back to state 1
Checking condition at time 2.0: sampled false
Checking condition at time 2.0: sampled true
Checking condition at time 2.0: sampled true
Probabilistically transitioned to state 2
Going back to state 1
Checking condition at time 3.0: sampled true
Checking condition at time 3.0: sampled true
Checking condition at time 3.0: sampled true
Probabilistically transitioned to state 2
Going back to state 1
Checking condition at time 4.0: sampled true
Checking condition at time 4.0: sampled false
请注意,每次第一次转换后都会有三个条件评估。我认为这是因为当状态2 - >时,也评估条件。状态1转换事件触发(在其操作代码完成之后但在转换实际完成之前)。它是否在这些点评估true
或false
是无关紧要的,因为代理尚未处于状态1,因此状态2转换不是“活跃的”。 (这看起来有点奇怪,因为如果代理处于条件转换处于活动状态,则仅检查条件会更有效。但是,除此之外我没有其他解释。)
然后它到达状态1,因此检查条件(立即,没有事件),如果为真,则设置状态2转换事件(在它触发时引起第二次检查)。