如何对 Anylogic 中的表进行动态引用?
Posted
技术标签:
【中文标题】如何对 Anylogic 中的表进行动态引用?【英文标题】:How to make dynamic references to tables in Anylogic? 【发布时间】:2020-07-29 01:28:58 【问题描述】:我已经为六台机器建模。它们中的每一个都有不同的电力负荷曲线。 AnyLogic 的表格中提供了负载配置文件。每台机器都有一个存储这些值的自己的表。我遍历这些值以在 TableFunctions 中实现相同的值。现在我面临以下挑战:如何对相关表进行动态引用。我想根据机器指数选择一个特定的表。如何定义动态引用相关表对象的变量?
感谢您的帮助!
【问题讨论】:
我找不到您使用的 DBMS。你的试用码表是什么?但是对于这种模型,您可以使用 NoSql 数据库,如 mongoDB、Redies 等... Nosql 非常可行。我的合作伙伴与 Redies 合作保存传感器日志。 你是说AnyLogic内部数据库表还是说你说的是表函数,其实你说的是表函数中的数据(跟数据库无关,除了可以加载他们的数据来自内部数据库)? 【参考方案1】:不确定在您的情况下是否真的有必要,但这里是:
您可以将对数据库表的引用存储到以下类型的变量中:
com.mysema.query.sql.RelationalPathBase
在特定列中选择 double(int、String 等)类型的值时,您可以通过调用 variable.getColumns().get(index)
的索引来获取该列。然后你需要把它转换成对应的类型,如下所示:
List<Double> resultRows = selectFrom(variable).where(
( (com.mysema.query.types.path.NumberPath<Double>) variable.getColumns().get(1) ).eq(2.0))
.list(( (com.mysema.query.types.path.NumberPath<Double>) variable.getColumns().get(1) ));
【讨论】:
如何创建这样的变量?我尝试使用调色板中的变量。然后我将 type 设置为 Other 并在旁边输入 com.mysema.query.sql.RelationalPathBase。但是,我收到错误消息“com.mysema.query 无法解析为类型”。 选择“其他”类型,然后在“RelationalPa”字段中键入并使用代码完成(在 Windows 上为 Ctrl+空格)。然后选择正确的条目。【参考方案2】:您是否总是拥有有限数量的机器?您的负载配置文件是如何表示的?如果您有有限数量的机器,并且负载配置文件是一组单独的值 - 或者实际上只要您可以将这些值保存在每个元素的单个字段中 - 那么您可以创建一个表,例如machine_load_profile,其中第一列是 load_profile_element 并保存元素 ID,其他列命名为 machine_0、machine_1、machine_2 等,保存每个负载配置文件元素的值。然后,您可以像这样获取单台机器的负载配置文件元素:
List<Double> dblReturnLPEs = main.selectValues(
"SELECT machine_" + oMachine.getIndex()
+ " FROM machine_load_profile"
+ " ORDER BY load_profile_element;"
);
然后迭代该列表或将它们转换为数组:
dblLPEValues = dblReturnLPEs.stream().mapToDouble(Double::doubleValue).toArray();
并对其进行迭代。
当然,您也可以对列和行使用相反的方向,使用 WHERE,我只是有一个以这种方式定向的方便示例。
【讨论】:
是的,我将拥有有限数量的机器。我按照你建议的方式做了。我为机器 idx 添加了一个列,并在查询中考虑了这一点。负载配置文件是从 db 中的值内插的。我使用表格函数在这些值之间进行插值并从中创建曲线。比我有一个每秒调用一次的事件并返回负载配置文件的值。 我正在将一个相当大的模型从总是从 Excel 读取参数值转换为使用数据库、表函数、自定义分布等,并在示例中找到了一些帮助。我在这里监视新问题,因此将在可能的情况下添加实用答案。例如,在我上面的转换代码的原始代码中,我转换为双精度数组的原因是我可以将它传递给自定义分布,而不必“手动”迭代所有值来创建阈值用于循环代理集合并伪随机分配配置文件。以上是关于如何对 Anylogic 中的表进行动态引用?的主要内容,如果未能解决你的问题,请参考以下文章