如何将 Main 中的参数提供给 Anylogic 中的代理

Posted

技术标签:

【中文标题】如何将 Main 中的参数提供给 Anylogic 中的代理【英文标题】:How to give a parameter from the Main to an agent in Anylogic 【发布时间】:2019-11-18 01:34:39 【问题描述】:

我的 Main 包含一个传送带,它将一个纸箱(我的代理)从 A 运送到 B。我添加了一个单选按钮,用户可以使用它选择盒子的大小(“小”、“中”、“大” & “很大”)。我现在希望每个纸箱都保存单选按钮的值。我尝试了很多不同的东西,比如将它链接到一个参数,但我没能弄明白。

我的模特图片:

我用于单选按钮的代码是:

if( value == 0 )
    radioValue = 1;
else if( value == 1 )
    radioValue = 2;
else if( value == 2 )
    radioValue = 3;
 else if( value == 3 )
    radioValue = 4;

radioValue 是我将单选按钮链接到的 Main 中的参数。

这个参数怎么给代理,以后怎么读出来?

提前感谢您的帮助!

【问题讨论】:

如果您能给我们提供您的代码,这样我们可以更好地了解您已经尝试过的内容,那就太好了 您好 Corentin,感谢您的回复。我编辑了帖子,但我还没有使用太多代码。 很遗憾,这个示例并不能帮助您找出错误所在 您的模型需要更多信息 要做到这一点,您需要在您的代理中创建一个变量,并且您必须执行 agent.variable=radioValue ...但是这方面的详细信息取决于您是使用离散事件还是基于代理,这取决于它是只有 1 个特工还是一群特工......等等 【参考方案1】:

在您的 Kist 代理中创建一个名为 size 的 int 类型变量。

在源代码块的属性中,在“on at exit”操作上,在属性的操作部分下编写以下代码:

agent.size=radioValue;

这是 AnyLogic 中最基本的操作之一……所以我建议您在开始使用任何模型之前进行培训。这可以通过阅读教程、3 天内的任何逻辑书或我的课程来完成:noorjax.teachable.com/p/anylogic

稍后您可以使用 agent.size 在任何块中访问代理的大小。

【讨论】:

【参考方案2】:

在没有看到更多代码的情况下,我的一般建议是考虑遍历代理(例如,使用 for 循环)并让它们都设置一个局部变量 cartSize 等于 radioValue(我不会使用“size”因为我相信它也用于代理集)。只是在这里吐口水,但是像这样?

for (int x = 0; x < carton.size(); x++) 
     carton.get(x).cartSize = radioValue;
 

【讨论】:

这仅适用于您的 PML 模型有自定义人口并且它会更改所有人口的大小而不是仅针对到达的人口,这不是您想要的......并使用size 对于变量名来说很好:) 啊,我以为那里有一个自定义人口。我喜欢您在下面给出的解决方案,假设它适用于海报,则更优雅。虽然使用 size 很好,但按照惯例应该不鼓励使用。使用其他东西将有助于让事情变得更简单,至少在认知上是这样。 你能指出在哪里声明 size 是一个不应该按约定使用的变量名吗?我不明白为什么它不会被使用...... 虽然“size”在java中不是一个“保留词”(所以它不会违反任何官方约定,它在AnyLogic中被大量使用(通常是java)对于集合,因此使用它可能会导致混乱并使代码难以解释。欢迎您这样做,但我自己和其他教授 M&S 并发布 AnyLogic 模型的人建议反对它。在同一模型中以两种方式具有大小功能只是引入了一个很容易避免的潜在混淆点。

以上是关于如何将 Main 中的参数提供给 Anylogic 中的代理的主要内容,如果未能解决你的问题,请参考以下文章

AnyLogic 为 Main 中的代理定义速度

Anylogic:将参数值写入数据库表

如何从 Main 获取文本数据集并使用 anylogic 在参数变化实验中运行?

(Anylogic)如何从另一个代理引用 Main

使用参数 (%) 定义代理,main 中的延迟时间基于它。 (任意逻辑)

在AnyLogic中更改选定代理的主类参数