在仿真期间向时间图添加数据 运行 Anylogic

Adding data to time plots during simulation run Anylogic

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

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

非常感谢任何帮助!

您将需要使用一些更高级的 Java 功能来完成此操作,即功能接口。

看下面的例子

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

变量是一个函数接口,叫做Supplier。 (您可以在此处阅读更多内容 https://www.baeldung.com/java-8-functional-interfaces

数据集使用此功能接口更新 x 的 y 值和时间。

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

在另一个按钮中,我将 get() 函数重写为 return flow2

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

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

plot.addDataSet(dataset);

现在您可以将图表、dataUpdater 变量和数据集放在一个单独的代理中,并且可能有一个接受 Supplier 的更新函数,这样您就可以绘制任何东西,只要它给您一个供应商 return 是双重价值