Anylogic:如何从数据库 table 创建绘图?

Anylogic: How to create plot from database table?

在我的 Anylogic 模型中,我成功地创建了数据集图,这些图计算了在我的模拟中每小时从码头到达的卡车数量。现在,我想添加到达终端的卡车的实际/“观察”数量,以将我的模拟与这些数字进行比较。我在数据库 table 中添加了这些数字(见下图)。有没有一种简单的方法可以将这些数据添加到绘图中?

我通过创建一个每小时读取数据库 table 并将其添加到数据集的变量来尝试它(如下图所示),但不幸的是这没有用(情节是空的)。

也许可以简单地删除变量并通过遍历 dbase table 数据在模型的开头填充数据集。使用数据库查询向导创建 for-loop。这样的事情应该有效:

int numEntries = (int) selectFrom(observed_arrivals).count();

DataSet myDataSet = new DataSet(numEntries);

List<Tuple> rows = selectFrom(observed_arrivals).list();

for (Tuple
 row : rows) {
    myDataSet.add(row.get( observed_arrivals.hour ), row.get( observed_arrivals.terminal_a ));
}

myChart.addDataSet(myDataSet);

您没有解释为什么它“不起作用”(您得到了什么 errors/problems?),也没有解释您在哪里定义了这些元素。

(1) 由于您希望每个终端 都观察到(经验)和模拟到达 ,因此每个终端的数据集都应该在终端代理中。然后复制的图(在 Main 中)可以有两个数据条目引用数据集 terminals(index).observedArrivalsterminals(index).simulatedArrivals 或者任何你命名的数据。

(2) 使用 getHourOfDay 添加到观察数据集是错误的,因为它只是 returns 0-23(即当前模型日期的当天小时)。您的数据库 table 看起来自模型启动以来已经有几个小时了,因此您只想 time(HOUR) 以经过的小时数获取模型时间(无论模型时间单位是什么)。或者可能 time(HOUR) - 1 如果您只想在该小时结束时更新该小时的经验到达(即,在您更新模拟到达的同时)。

(3) 使用变量每小时获取数据库值是行不通的,因为变量的初始值仅在模型初始化时计算一次。您想要在终端中每小时循环一次事件,而不是添加相关行的值。 (您需要使用插入数据库查询向导为事件操作中所需的查询生成相关的 Java 代码。)

(4) 因为您有一个数据库 table,每个终端都有 specifically-named 列(列 terminal_a,大概是 terminal_b 等),所以它稍微多一点尴尬的。 (这不是正确的关系 table 设计,其中不是 4 个终端的 4 列,而是 terminal_idobserved_value 的两列,每个时间段有一行和终端组合。)

因此您的数据库查询表达式(在您的终端代理中)将需要使用 SQL 格式(而不是 QueryDSL 格式)以便您可以 'stitch in' 将正确的列名输入 SQL.