在我的anylogic项目中,我想终止执行并运行模拟N次。在每个模拟中,我将输出存储在excel文件中,该文件取决于运行计数。 我不想通过点击停止和运行,而是自动执行此操作。我怎样才能做到这一点? 我尝试使用一个事件并通过while循环写入(myparm< = N)并在循环中编写了getEngine()。run,但它没有工作! 如果有可能请帮助我。
由于
答案 0 :(得分:2)
下面概述了如何使用AnyLogic使用的现有模拟框架来实现它的方法
您需要使用模拟设置才能运行模型的多次运行并保存输出。我建议的设置如下:
在Simulation Experiment页面(运行模型时看到的第一页)上有一个按钮,用于启动多个模型运行。在这里,您可以使用
将引擎设置为不以实时模式运行getEngine().setRealTimeMode(false);
您可能还想设置初始种子和一些其他您可能也想要更改的模型参数,并且可能在模型执行后保存。当您按照您希望的方式设置模型时,使用run()开始运行模型。
现在,在“Java actions”部分下的Simulation Experiment设置页面下,您需要指定模型在完成模型运行后必须执行的操作。在“模拟运行后”部分中,编写一些代码以将模型中的数据保存到Excel文件中。要从模型中访问变量和对象,请使用root,例如
saveSomeData(root.myDataset);
其中saveSomeData是Simulation页面上的一个函数,用于将名为myDataset的模型上的数据集保存到Excel文件中。将种子和特定参数(如果您更改了任何内容)保存到Excel文件以供将来参考,将会很棒。
从模型中保存数据输出后,您可以指定新种子并可能再次更改参数,然后再次调用run()以运行模型以进行另一次迭代。当模型运行完毕后,它将再次调用“After simulation run”代码,因此请设置停止条件,否则它将继续运行一次迭代。您可以使用
访问模型运行的数量getEngine()。getRunCount()
此外,您的模型需要有一些停止条件,否则一旦开始运行它将永远不会停止。您可以在“模拟时间”部分的“模拟实验”页面中指定,也可以使用
在模型中以编程方式指定finishSimulation();
答案 1 :(得分:0)
为了循环运行模型,请在超时触发事件的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()作为重启模拟实验的条件。