当前位置: 首页 > 知识库问答 >
问题:

Anylogic:对多个运行使用不同的到达表

尉迟安民
2023-03-14

我建立了一个模型,其中有一个生成汽车进入停车场的源。在源代码块中,我喜欢使用一个基于时间戳的到达的内部数据库表。到目前为止,我没有任何问题。然而,我喜欢使用不同的到达表进行多次模拟运行。如何避免调整表格和手动启动所有运行(因为我必须运行180次)?

我已经看过“参数变化实验”,但找不到解决方案,因为似乎没有办法将数据库表定义为可以在源块中使用和变化的参数。

图片1

谢谢你的帮助!

共有2个答案

马坚
2023-03-14

非常感谢你的帮助!经过多次思考和尝试,我发现以下解决方案其实很简单:

我创建了另一个数据库表“arrivalsmain”,它在每次新运行开始时清空。然后,根据a参数并通过应用参数变量,此表由相应的数据库表填充(例如,如果参数等于10,则从“arrivals10”填充)。相应地改变参数。不是在源的属性中输入不同的表“arrivals1”、“arrivals2”等,而是始终输入表“arrivalsmain”。

为了管理表内容,我只需在主代理的“启动时”中添加一些SQL代码:

executeStatement("DELETE FROM arrivalsmain");
switch ( Parameter )
{
    case 1: executeStatement("INSERT INTO arrivalsmain SELECT * FROM arrivals1 ORDER BY timestamp ASC");
            break;
    case 2: executeStatement("INSERT INTO arrivalsmain SELECT * FROM arrivals2 ORDER BY timestamp ASC");
            break;
    [...]               
}

我不得不使用“executeStatement”,因为我的JAVA知识不是很好。

方承弼
2023-03-14

如果您的数据为Excel格式,那么我想到的一个解决方案是使用AnyLogic中的Excel File元素而不是数据库。我不确定您的不同表是如何设置的,但我将假设每个表都在同一Excel文件的工作表中。

这样,您可以将工作表编号用作参数变化中使用的参数。语法的一个示例如下:

excelFile.getCellNumericValue(sheetIndex, rowIndex, columnIndex);

现在,有关如何将excel数据链接到代理到达的详细信息需要一些创造性。我建议在用户控件事件中使用inject函数。类似于以下内容(其中计数器是添加到模型中的变量):

int n = excelFile.getCellNumericValue(sheetIndex, counter, 2);
source.inject(n);

double nextOccurence =
excelFile.getCellNumericValue(sheetIndex, counter + 1, 3)
-
excelFile.getCellNumericValue(sheetIndex, counter, 3)
;
event.restart( nextOccurence  );
counter++;

以上肯定不起作用,因为我使用了一些随机假设(例如,到达地点的列号、日期的列号等)。因此,您应该仔细评估代码,并根据您的情况进行调整。此外,对于首次到达,您可能需要不同的代码。

另一个警告是,如果您的数据库很大(即1000行),使用Excel文件将使您的模型速度变慢。

 类似资料:
  • 对于生产过程的分析,我想根据过去的真实数据在我的源块中生成代理。 为此,我想使用到达表来确保代理在正确的时间生成。但我也需要给我的代理不同的参数变化。 为此,我想使用“从DB设置代理参数”复选标记。 然而,我似乎无法将两者结合使用。是否有方法将到达表和参数DB结合使用? 提前非常感谢。

  • 我试图用Cucumber,用不同的参数并行运行多个testng套件。对于每个tesng套件,我试图传递不同的浏览器、testinfo等等。我想通过maven命令行选项来实现这一点。我关注了https://rationaleemotions.wordpress.com/2016/03/29/parallel-execution-of-multiple-testng-suites/#comment-1

  • 我在配置Anylogic模型上的传递时间时遇到了一个问题:我想将模型时间的每个刻度配置为1x时的5分钟。更清楚地说,我所做的所有事情都是在“项目”选项卡上显示的项目组件上完成的。在阅读指南和手册时,我看到,通过单击项目根目录,我可以以分钟为单位配置时间单位,这允许我以1分钟为单位运行它。我试图修改模拟选项,将“实时缩放”设置为5,但当我运行实验时,它会自动从5倍开始。有什么方法可以满足我的需要吗?

  • 问题内容: 在这里,我需要同时执行,并在同一时间。 当我尝试在其上放置一个并行块时,由于在官方站点中这样提到,因此它引发了错误。 } 问题答案: 您不必将每个调用都放在阶段内的并行作业中,因此可以这样进行:

  • 我基本上是风格的长篇文章与各种图像分散贯穿。我想让第一个图像“浮:左”,第二个图像“浮:右”。我知道我可以这样设计图像:

  • 我有一个数据库表(id、arrivalTime、flightNumber),并从该表中创建了一组代理。我想要一个行人出现在每个到达时间从一个目标线在模型。我(错误地)认为这将是轻而易举地使用时间表,但我没有运气。关于如何在AnyLogic中执行此操作有什么建议吗?