Loops 在anylogic中运行N次模拟

Loops 在anylogic中运行N次模拟,loops,simulation,anylogic,Loops,Simulation,Anylogic,在我的anylogic项目中,我想终止执行并运行N次模拟。在每次模拟中,我将输出存储在excel文件中,该文件取决于运行次数。 我不想通过单击来停止和运行,而是想自动完成。我该怎么做? 我尝试使用一个事件并编写while循环(myparm),下面概述了如何使用AnyLogic使用的现有模拟框架来实现这一点 您需要使用模拟设置来运行模型的多个运行并保存输出。我建议的设置如下: 在模拟实验页面(运行模型时看到的第一个页面)上有一个按钮,用于启动多个模型运行。在这里,您可以使用 getEngine()

在我的anylogic项目中,我想终止执行并运行N次模拟。在每次模拟中,我将输出存储在excel文件中,该文件取决于运行次数。 我不想通过单击来停止和运行,而是想自动完成。我该怎么做?
我尝试使用一个事件并编写while循环(myparm),下面概述了如何使用AnyLogic使用的现有模拟框架来实现这一点

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

在模拟实验页面(运行模型时看到的第一个页面)上有一个按钮,用于启动多个模型运行。在这里,您可以使用

getEngine().setRealTimeMode(false);
您可能还需要设置初始种子和一些其他模型参数,这些参数可能还需要在模型执行后更改或保存。当您按照希望的方式设置模型时,请使用run()开始运行模型

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

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

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

getEngine().getRunCount()

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

finishSimulation();

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

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()作为重新启动模拟实验的条件。

非常感谢……这很有帮助:)您真的想从“单次运行”模拟实验中多次运行模型吗?若然,原因为何?只是为了避免多次读取输入/初始化?(还有其他方法可以绕过这个问题,但你通常只关心设置是否在计算上非常昂贵。)给出的答案假设你想做这个特殊情况,而不是使用为此目的设计的多运行实验(如参数变化)。