在模拟运行期间向时间图添加数据 Anylogic

Posted

技术标签:

【中文标题】在模拟运行期间向时间图添加数据 Anylogic【英文标题】:Adding data to time plots during simulation run Anylogic 【发布时间】:2022-01-19 20:03:24 【问题描述】:

我有一个包含多个代理的模型,每个代理都有几个流量和库存,以及一个分析代理。我想让用户在模拟运行期间为任何流量/库存/变量添加时间图。这个想法是有多个单选按钮或组合框,允许用户选择任何代理的任何元素并自动创建元素图。我发现在使用单选按钮触发循环事件方面取得了一些成功,然后该事件使用来自另一个代理的预定义元素更新我的分析代理中的辅助变量并绘制变量。然而,问题是我必须预先定义要在用户触发的事件中绘制的元素。我可以为模型中的每个元素都创建一个事件,但我希望有一种方法可以更直接地将用户输入转换为元素的可用路径。

例如:我有两个代理,a 和 b。在代理 a 中有流“流”,在代理 b 中有一个情节“情节”和一个按钮“按钮”(或任何其他 Controls 元素,如果它在这种情况下更有用)。当模型运行时,用户应该能够按下将“流”添加到“绘图”的按钮。是否有一个简单的解决方案可以(至少在某种程度上)可扩展到大量代理和可绘制元素?

非常感谢任何帮助!

【问题讨论】:

addDataSet ...你探索过那个函数了吗? 我看了但没有深入探索。据我所知,我可以添加一个数据集和一个函数/一个事件来为我想要绘制的每个模型元素填充它。然而,我正在寻找的是一种获取任何元素的值并将其设置为单个变量的值的方法,然后我可以使用单个事件/函数进行绘制。 Jaco-Ben Vosloo 的解决方案正是这样做的,在我的代理导入部分中导入 java 包后,它现在可以完美运行。 【参考方案1】:

您需要利用一些更高级的 Java 特性来完成这项工作,即函数式接口。

看下面的例子

我有两个不同的流量和库存图,每个都有一个按钮来绘制流量。

该变量是一个功能接口,称为Supplier。 (您可以在这里阅读更多内容https://www.baeldung.com/java-8-functional-interfaces)

数据集使用这个函数接口来更新 x 的 y 值和时间。

我现在唯一需要做的就是更改 dataUpdater 并覆盖 get() 以显示我选择绘制的流程

在另一个按钮中,我覆盖了get() 函数以返回flow2

plotFlow 函数只是重置图表和数据集以重新开始

plot.removeAll();
dataset.reset();

plot.addDataSet(dataset);

现在您可以将图表、dataUpdater 变量和数据集放在单独的代理中,并且可能具有接受 Supplier 的更新函数,这样您就可以绘制任何内容,只要它为您提供返回双倍价值

【讨论】:

这个解决方案完美无瑕,非常感谢!此外,我必须在代理的导入部分导入供应商包。导入 java.util.function.Supplier; 感谢您的支持。记得也接受我的回答;-)

以上是关于在模拟运行期间向时间图添加数据 Anylogic的主要内容,如果未能解决你的问题,请参考以下文章

Anylogic仿真 - 模型创建期间的错误

Anylogic:优化期间截断类错误

如何在anylogic中模拟期间动态更改资源池的班次组大小?

分布图未在 AnyLogic 中显示条形图

Anylogic:避免在占用块中不必要地执行进程

在 AnyLogic 中保存变量