使用数据库时如何使用 Anylogic 对象 (INode) 作为类型

Posted

技术标签:

【中文标题】使用数据库时如何使用 Anylogic 对象 (INode) 作为类型【英文标题】:How to use an Anylogic Object (INode) as a Type when using Databases 【发布时间】:2020-03-28 18:09:09 【问题描述】:

问题:我有带有 orderslocations 的数据库表(导入的 excel)。订单有一个名为“destination”的列,它被交叉引用(使用“外键”来引用locations.location)到位置列locations表,该表应该代表实际的INode。如何在 moveTo 块中指定此地址?

    我没有看到可以将 INode 指定为数据库表中的类型的选项。如果我选择 Other 作为类型并尝试编写 INode,则会出现权限错误。 如何在代码或操作行中实现此交叉引用?它已经在代理表/参数中设置了外键。

【问题讨论】:

【参考方案1】:

您不能将像 INode 这样的 AnyLogic 对象表示为数据库条目。相反,您可以存储关于节点的特征,并在模型开始时以编程方式创建节点。

所以存储诸如 X/Y 坐标之类的东西。

以下是 GIS 点的示例,可向您展示该方法。您需要对 INode 执行类似的操作(查看 INode API 的 AnyLogic 帮助以了解如何创建它们)。

我将位置名称作为字符串存储在 dbase 中:

在模型启动时,我以编程方式从数据中创建 GISPoint 元素(假设我有一个名为 map 的 GIS 地图):

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

for (Tuple row : rows) 
        GISPoint locationFrom = map.searchFirst(row.get( routes.location_from ));
        GISPoint locationTo = map.searchFirst(row.get( routes.location_to ));
        map.add(locationFrom);
        map.add(locationTo);
        GISRoute route = map.getRoute(locationFrom.getLatitude(), locationFrom.getLongitude(), 
             locationTo.getLatitude(), locationTo.getLongitude());
        route.setLineColor( spectrumColor(uniform_discr(1,10), 10) );

【讨论】:

感谢本杰明的回复,我希望我可以把它留在电子表格中,并在它发生变化时更新它。【参考方案2】:

思路:解析

我同意 Benjamin 的观点:您不能直接保存对 INode 的 Java 对象的引用。如果您仍想使用预定义的 INode,可以将节点的文本名称保存在 Excel/数据库中,然后将其解析(“转换”)为具有此名称的 INode 的引用。

怎么做

为此,最简单的方法是手动将您想要检索的所有 INode 放入一个集合中,在此示例中,我将其命名为 allMyINodes

然后可以使用解析函数,这里有一个建议: INode getINodeByName(String nodeName):

INode myNode;

myNode = allMyINodes.stream()
    .filter(c -> c.getName().equals(nodeName))
    .findAny()
    .orElse(null);

return myNode;

这是Anylogic Cloud中的example project,您也可以在那里运行和下载源文件。

将其应用于您的场景

在您的应用程序中,这意味着例如在 moveTo 块中,您可以编写 getINodeByName(....here the code to get one node name from the db....) 用于 INode 类型的目的地。

关于如何根据找到的订单和按键链接检索位置的第二个问题,我认为这是一个单独的问题,仅与数据库/SQL 相关,也许您使用 SQL 打开一个单独的帖子标记。

【讨论】:

谢谢弗洛里安。并感谢您上传示例。我使用函数和 case/switch 语句有类似的东西。我从来没有使用过过滤器/流,我对 lambda 的了解也只是初步的。所以我会用这个简单的案例来获得更多的曝光。

以上是关于使用数据库时如何使用 Anylogic 对象 (INode) 作为类型的主要内容,如果未能解决你的问题,请参考以下文章

AnyLogic - 在仿真时动态创建对象

AnyLogic - 使用 Key-Value 数据库连接对象

如何在不导入的情况下将excel电子表格导入anylogic数据库,即在主启动时使用代码

如何使用anylogic中的参数变化从图表上的main获取某些数据?

anylogic中的Agent连接: 我在使用Anylogic建立Agent模型时,在系统开始动态运行时,加入Agent,想让新加

如何从 Main 获取文本数据集并使用 anylogic 在参数变化实验中运行?