如何找到数据库填充的 MoveTo 目的地?

How to find a MoveTo destination filled by database?

我可能需要 Anylogic 模型方面的帮助。

模型(短):订单在单个路线中移动的制造场景。工作场所 (WP) 是由模拟启动动态创建的。它们的名称、数量和其他参数存储在数据库中(excel 导入)。此外,订单是根据导入创建的。 Agent 群体 "order" 有一个集合 routing,其中包含它必须按特定顺序停止的工作场所。

目标:我想要 main 中的 moveTo 块,它找到代理 order 的下一个目的地。 问题和解决路径:

  1. 我将目标类型设置为代理,并在代理字段中键入了函数 agent.getDestination()。此函数在 顺序 中,return 是集合 WP destinationName = routing.get(i) 的下一个条目。有了这个我得到一个数据类型错误(而 运行 没有编译)。我怀疑这是因为数据库没有将条目保存为 WP 类型,而只保存了字符串。 是否可以从 Excel 创建一个包含代理的集合?

  2. 在此之后,我尝试使用与字符串相同的 getDestination,因此通过 findFirst 找到匹配 returned 名称和 return 它作为 WP。 WP targetWP = findFirst(wps, w->w.name == destinationName); 当然找不到 wps(工作场所的人口)。 如何搜索人口? 也许使用 Agentlink?

我认为这并不难,但找不到答案或解决方案。如您所知,我是初学者...希望描述很好,有人可以帮助我或给我提示:) 谢谢

欢迎使用 Stack Overflow :) 要通过 Excel Import 创建一个 Population,您必须创建一个方法并像这样调用代码。您还需要一个空的 Population。
int n = excelFile.getLastRowNum(YOUR_SHEET_NAME); for(int i = FIRST_ROW; i <= n; i++){ String name = excelFile.getCellStringValue(YOUR_SHEET_NAME, i, 1); double SEC_PARAMETER_TO_READ= excelFile.getCellNumericValue(YOUR_SHEET_NAME, i, 2); WP workplace = add_wps(name, SEC_PARAMETER_TO_READ); }

现在如果你想通过名字获得一个工作场所,你必须创建一个类似于你的尝试的方法。
函数体:
WP workplaceToFind = wps.findFirst(w -> w.name.equals(destinationName)); if(workplaceToFind != null){ //do what ever you want }

Is there a possiblity to create a collection with agents from an Excel?

不直接使用集合的属性,如您所见,您不能拥有作为代理类型的数据库 (DB) 列类型。1

但这直接通过 Java 代码来做相对简单(您可以使用 插入数据库查询 向导为您构建框架代码)。

After this I tried to use the same getDestination as String an so find via findFirst the WP matching the returned name and return it as WP

是的,这是一种方法。如果您的订单详细信息在 Excel/the 数据库中,它们可能是通过一些字符串 ID 引用工作场所(这将是您从单独的 Excel worksheet/database 创建的工作场所代理的参数) table)。您需要使用 Java equals 方法来比较字符串,而不是 == (用于比较数字或两个对象是否是同一对象)。

I want a moveTo block in main which finds the next destination of the agent order

所以一般的整体解决方案是

  • 从数据库中创建 Workplace 个代理(假设在 Main 中称为 workplaces),每个代理都有一个字符串参数 id 或从中映射的类似参数数据库列。

  • 从数据库中创建 Order 个代理(假设在 Main 中称为 orders),然后在它们的启动操作中,设置它们的集合工作场所 ID(类型 ArrayList,元素 class String;假设称为 workplaceIDsList使用来自另一个数据库的数据 table.

  • Order 可能还需要一个工作变量来存储它需要访问的列表中的下一个索引(所以假设一个 int 变量 nextWorkplaceIndex从 0 开始)。

  • 在 Main 中编写一个名为 getWorkplaceByID 的函数,它有一个 String 参数 id 和 returns 一个 Workplace。这从匹配ID的人群中获取工作场所;与您类似的单行方式是 findFirst(workplaces, w -> w.id.equals(id)).

  • MoveTo 块(我假设在 Main 中)需要将 Order 移动到 getWorkplaceByID(agent.workplaceIDsList.get(nextWorkplaceIndex++)) 定义的代理。 (++ 位在 计算表达式后递增索引 ,以便为下一个工作场所做好准备。)

为了填充集合,您需要两个 table,如下所示(假设使用字符串作为工作场所和订单的 ID):

  • orders table: 您订单的参数列(包括一些String id列) other than工作场所列表。 (每行创建一个 Order 个代理。)

  • order_workplaces table:列 order_idsequence_numworkplace_id(因此多行指定工作场所 ID 的顺序用于订单 ID)。

OrderOn startup 操作中,通过 Insert Database Query 向导设置骨架查询代码作为下面(我们想遍历此订单 ID 的所有行并做一些事情 --- 我们将更改骨架代码以将条目添加到集合中,而不是像骨架代码那样仅通过 traceln 打印内容) .

然后我们将框架代码编辑为如下所示。 (请注意,我们在初始查询中添加了一个 orderBy 子句,以确保我们以序列号升序获取行。)

List<Tuple> rows = selectFrom(order_workplaces)
    .where(order_workplaces.order_id.eq(id))
    .orderBy(order_workplaces.sequence_num.asc())
    .list();

for (Tuple row : rows) {
    workplaceIDsList.add(row.get(order_workplaces.workplace_id));
}

1 AnyLogic 数据库是一个普通的关系数据库 --- HSQLDB 事实上 --- 数据库只理解它们自己的特定数据类型,如 VARCHAR,使用 AnyLogic 及其使用的库将这些转换为 Java 类型,如 String。在用户界面中,AnyLogic 使它 看起来像 您将列类型设置为 intString 等,但这些实际上是 Java列的内容最终将转换成的类型。

AnyLogic 确实支持具有选项列表类型的列(以及包含execu[的列的特殊Code类型列=138=] Java 代码)但这些是特殊情况,在幕后使用特殊逻辑将列数据(最终仍然是字符串)转换为适当的选项列表实例或(对于 Code 列) 编译为即时编译然后执行 Java).