通过变量更新触发任何逻辑事件
Anylogic event triggering via variable update
在我尝试构建的代理中,我有一个可以从外部更改的动态变量,我想link此更改以触发事件或状态图转换。
我尝试了条件 variable != 0
但它有 2 个错误:它不考虑 0
以防它恰好出现并且它锁定了我的代理,因为它总是 true
条件。
您知道 Anylogic 是否可以做到这一点吗?或者我应该尝试不同的方法?
这是一个冗长的解决方案,但我会在其他方法都不起作用时使用它。在流程图所在的代理内部创建虚拟源和汇块。请务必 select 在源代码中“调用 inject() 函数”。
并且主要是,每当这种情况发生时,将虚拟代理注入该源块。
只要在虚拟源块中使用该代理中的变量创建代理,您就可以控制转换。
正确的技术解决方案是:
- 使您的变量
private
(因此它实际上根本无法从外部来源更改)
- 创建一个名为
setMyVariable
的 public
函数,它接受一个名为 newValue
的双参数
- 在该函数中,写入
myVariable = newValue;
。在该行下方,您现在可以执行任何应在变量更新时触发的附加代码
这是面向对象的做事方式:)
为了完整性再添加一种解决方案:对于这种情况,我更喜欢使用消息传递。第一部分类似于 OOP 方法 - 将 variable
设为私有,这样就不能从代理外部直接更改它。然后使用 AnyLogic 的 agent communication 函数更改变量发送代理消息。一旦收到值已更改的消息,它就会更改值,然后将其转发到状态图以触发转换。这解决了您的问题:
- 必要时可以对“0”采取行动,
- 状态图未锁定,因为您只对值变化做出反应而不是它的值
在我尝试构建的代理中,我有一个可以从外部更改的动态变量,我想link此更改以触发事件或状态图转换。
我尝试了条件 variable != 0
但它有 2 个错误:它不考虑 0
以防它恰好出现并且它锁定了我的代理,因为它总是 true
条件。
您知道 Anylogic 是否可以做到这一点吗?或者我应该尝试不同的方法?
这是一个冗长的解决方案,但我会在其他方法都不起作用时使用它。在流程图所在的代理内部创建虚拟源和汇块。请务必 select 在源代码中“调用 inject() 函数”。
并且主要是,每当这种情况发生时,将虚拟代理注入该源块。
只要在虚拟源块中使用该代理中的变量创建代理,您就可以控制转换。
正确的技术解决方案是:
- 使您的变量
private
(因此它实际上根本无法从外部来源更改) - 创建一个名为
setMyVariable
的public
函数,它接受一个名为newValue
的双参数
- 在该函数中,写入
myVariable = newValue;
。在该行下方,您现在可以执行任何应在变量更新时触发的附加代码
这是面向对象的做事方式:)
为了完整性再添加一种解决方案:对于这种情况,我更喜欢使用消息传递。第一部分类似于 OOP 方法 - 将 variable
设为私有,这样就不能从代理外部直接更改它。然后使用 AnyLogic 的 agent communication 函数更改变量发送代理消息。一旦收到值已更改的消息,它就会更改值,然后将其转发到状态图以触发转换。这解决了您的问题:
- 必要时可以对“0”采取行动,
- 状态图未锁定,因为您只对值变化做出反应而不是它的值