AnyLogic - 由条件触发的转换

AnyLogic - transition triggered by a condition

我是 AnyLogic 的新手...但它让我发疯!!!

这是超级基本的...在 AB 模型中,我希望一定比例的代理从一种状态转到另一种状态...但它发生了一些我无法理解的事情:S

我有 1000 个代理...我希望 950 个进入 V3 状态...还有

只有 889 个代理更改状态:(
似乎条件被评估了两次......确实是 0.95*0.95=0.90..这正是代理更改状态的百分比:(

不满意我试着把条件放在 "guard"

结果很完美!!!

谁能帮我理解一下? :( 我必须修改整个模型......我什么时候必须放 "conditions" 什么时候放 "guards"?

谢谢大家!!

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^

来自@sdaza 模特

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^

AnyLogic 支持团队回答

_如果条件最初 return 为真,则对条件进行两次评估。当代理进入具有输出条件转换的状态时执行初始检查。如果某个转换条件 return 为真,引擎会尝试触发它。这里再次检查条件。如果条件 return 为假,它将被取消,代理保持状态。换句话说,条件应该 return true 两次才能执行。

在您的情况下,只有 returned "true" 的代理执行了两次转换,概率与结果匹配:0.95 * 0.95 = 0.9。这是实际概率。

希望对你有所帮助_

虽然我不明白为什么会这样...

一些背景和示例模型,'opens up' 了解幕后发生的事情应该有助于您理解 AnyLogic 响应。

背景

AnyLogic 条件在模型的每一步都被检查(即,在模型开始时和在开发人员显式创建或通过使用的 AnyLogic 元素隐式创建的每个事件之后)。 AnyLogic 还在幕后使用超时 0 事件来影响状态转换;即,如果它决定任何类型的转换到期,它 不会 立即执行,但会安排一个事件在相同的模拟时间内执行此操作,这将在下一步触发如果在同一模拟时间没有其他事件,则模型的。如果您有专业版,您可以在模型 运行 时间通过事件查看器看到它(见下文)。

条件转换

由于上述原因,条件是在模型开始时评估的。如果它是 true,则安排超时 0 事件来影响转换。当 this 触发时,再次检查条件(因为在相同的模拟时间,由于干预事件,它可能不再为真。如果是第二次true,则过渡继续。

示例模型

我改编了你的例子。我只有一个 Main 状态图,其中有两个状态和两个转换:一个条件一(使用您的 randomTrue(0.95) 条件)从状态 1 到状态 2,以及一个超时 1 将状态 2 发送回状态 1。通过将条件放在 函数 (check) 中,我可以添加一些额外的 traceln 语句,以便我们更好地了解发生了什么。

运行 这(设置为 运行 直到时间 0,因此它在模型启动时暂停)显示事件查看器。条件评估为真,因此您可以看到设置的超时 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 转换不是 'active'。 (这看起来确实有点奇怪,因为如果代理处于条件转换处于活动状态的状态,则只检查条件会更有效。但是,我对这个额外的评估没有其他解释。)

然后它到达状态 1,因此检查条件(立即,没有事件),如果为真,则设置状态 2 转换事件(触发时引起第二次检查)。