首页 文章

AnyLogic - 由条件触发的转换

提问于
浏览
2

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

它是超级基础...在AB模型中我希望一定比例的代理从一个状态转到另一个状态......但它发生了一些我无法理解的东西:S

我有1000个特工...我期待950进入状态V3 ......

只有889名特工改变状态:(
似乎情况被评估了两次......确实0.95 * 0.95 = 0.90 ..这正是代理人改变状态的百分比:(

不满意我试图把contidion放在"guard"

结果很完美!!!

任何人都可以帮我理解这个吗? :(我必须修改整个模型......我什么时候必须把“条件”和“守卫”?

感谢大家!!

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

来自@sdaza模特

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

AnyLogic支持团队的回答

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

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

我希望它会有所帮助_

我没理解为什么会这样......

1 回答

  • 1

    一些背景和一个示例模型“打开”了幕后发生的事情应该有助于您理解AnyLogic响应 .

    背景

    在模型的每个步骤(即,在模型开始时以及在开发人员明确创建的每个事件之后或者通过所使用的AnyLogic元素隐式地)检查AnyLogic条件 . AnyLogic还在封面下使用timeout 0事件来实现状态转换;即,如果它决定任何类型的转换到期,它不会立即执行,而是在同一模拟时间内安排事件,如果没有其他事件,将在模型的下一步触发相同的模拟时间 . 如果您拥有专业版,则可以通过事件查看器在模型运行时看到此信息(请参阅下文) .

    条件转换

    由于上述原因,在模型开始时评估条件 . 如果是 true ,则会计划超时0事件以实现转换 . 当它触发时,再次检查条件(因为在同一模拟时间由于干预事件,它可能不再成立) . 如果它是第二次 true ,那么过渡就会继续 .

    示例模型

    我改编了你的榜样 . 我只有一个 Main ,状态图有两个状态和两个转换:条件一(带有你的 randomTrue(0.95) 条件)从状态1到状态2,超时1一个将状态2发送回状态1.通过将条件置于内部一个函数( check ),我可以添加一些额外的 traceln 语句,这样我们就可以更好地了解发生了什么 .

    使用显示的事件查看器运行此设置(设置为运行直到时间0,以便在模型启动时暂停) . 条件评估为true,因此您可以看到设置超时0转换事件 .

    我还添加了一些 traceln 消息,用于发生条件转换和转换回状态1.这里's a sample from a run. (The transitions will stop once the condition doesn' t连续两次评估 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转换不是'active' . (这看起来有点奇怪,因为如果代理处于条件转换处于活动状态,则仅检查条件会更有效 . 但是,除此之外,我没有其他解释 . )

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

相关问题