3

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

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

在此处输入图像描述

我有 1000 名特工……我预计 950 名将进入 V3 状态……然而 在此处输入图像描述

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

不满意我试图把条件放在“守卫”中 在此处输入图像描述

结果是完美的!!!
在此处输入图像描述

谁能帮我理解这一点?:( 我必须修改整个模型......我什么时候必须设置“条件”以及何时设置“警卫”?

感谢大家!!

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

来自@sdaza 模型

在此处输入图像描述 在此处输入图像描述

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

AnyLogic 支持团队回答

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

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

我希望它会有所帮助_

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

4

1 回答 1

1

一些背景和示例模型“打开”了一些幕后发生的事情,应该可以帮助您理解 AnyLogic 响应。

背景

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

条件转换

由于上述原因,在模型开始时评估条件。如果是true,则安排一个超时 0 事件来实现转换。当触发时,将再次检查条件(因为可能由于在同一模拟时间的干预事件而不再正确)。如果是true第二次,则过渡继续进行。

示例模型

我改编了你的例子。我只有一个Main带有两个状态和两个转换的状态图:randomTrue(0.95)从状态 1 到状态 2 的条件一(带有您的条件),以及将状态 2 发送回状态 1 的超时 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 转换事件触发时也会评估条件(在其操作代码完成之后但在转换实际完成之前)。它是否评估truefalse在这些点是无关紧要的,因为代理尚未处于状态 1,因此状态 2 转换不是“活动的”。(这似乎有点奇怪,因为如果代理处于条件转换处于活动状态的状态下,只检查条件会更有效。但是,我对这个额外的评估没有其他解释。)

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

于 2017-01-28T23:15:53.667 回答