2

在我的 anylogic 项目中,我想终止执行并运行模拟 N 次。在每个模拟中,我将输出存储在一个 excel 文件中,该文件取决于运行次数。我不想通过点击停止和运行,而是想自动完成。我怎样才能做到这一点?我尝试使用一个事件并通过 while 循环 (myparm<=N) 编写,在循环中我编写了 getEngine().run,但它没有用!如果可能,请帮助我。

谢谢

4

2 回答 2

2

下面概述了如何使用 AnyLogic 使用的现有仿真框架来实现它

您需要使用模拟设置来运行模型的多次运行并保存输出。我建议的设置如下:

在您的模拟实验页面(运行模型时看到的第一页)上有一个按钮,您将使用它来启动多个模型运行。在这里,您可以通过使用将引擎设置为不在实时模式下运行

getEngine().setRealTimeMode(false);

您可能还想设置初始种子和其他一些您可能还想更改的模型参数,并可能在模型执行后保存。当您按照您希望使用 run() 开始运行模型的方式设置模型时。

现在,在“Java 操作”部分下的模拟实验设置页面下,您需要指定模型在完成模型运行后必须执行的操作。在“模拟运行后”部分中,编写一些代码以将模型中的数据保存到 Excel 文件中。要从模型中访问变量和对象,请使用 root,例如

saveSomeData(root.myDataset);

其中 saveSomeData 是 Simulation 页面上的一个函数,用于将我在模型上找到的数据集(称为 myDataset)保存到 Excel 文件中。如果您更改了任何种子和特定参数,也可以保存到 Excel 文件以供将来参考。

一旦你保存了模型的数据输出,你就可以指定一个新的种子并可能再次更改参数,然后再次调用 run() 以运行模型进行另一次迭代。当模型完成运行后,它将再次在此处调用“模拟运行后”代码,因此请设置停止条件,否则它将继续运行一次迭代。您可以使用访问模型运行次数

getEngine().getRunCount()

此外,您的模型需要有一些停止条件,否则一旦开始运行,它将永远不会停止。您可以在“模型时间”部分下的“模拟实验”页面中指定这一点,也可以在模型中以编程方式使用

finishSimulation();
于 2016-06-21T06:26:43.437 回答
1

为了使模型循环运行,请在超时触发事件的 Action 字段或顶级代理的 On destroy 字段中使用以下代码:

new Thread(){
    public void run(){
        // stops the model
        getExperiment().stop();
        try {
            // delay
            this.sleep(1000);
        } catch(Exception e) {};
        // runs it again
        ((Simulation) getExperiment()).button.action();
    }
}.start();

在执行此代码之前,应将模型结果写入 Excel 文件。正如 Jaco-Ben 所建议的,您可以指定 getEngine().getRunCount() 作为重新启动模拟实验的条件。

于 2016-07-05T10:58:52.420 回答