如何找到数据库填充的 MoveTo 目的地?
How to find a MoveTo destination filled by database?
我可能需要 Anylogic 模型方面的帮助。
模型(短):订单在单个路线中移动的制造场景。工作场所 (WP) 是由模拟启动动态创建的。它们的名称、数量和其他参数存储在数据库中(excel 导入)。此外,订单是根据导入创建的。 Agent 群体 "order" 有一个集合 routing,其中包含它必须按特定顺序停止的工作场所。
目标:我想要 main 中的 moveTo 块,它找到代理 order 的下一个目的地。
问题和解决路径:
我将目标类型设置为代理,并在代理字段中键入了函数 agent.getDestination()
。此函数在 顺序 中,return 是集合 WP destinationName = routing.get(i)
的下一个条目。有了这个我得到一个数据类型错误(而 运行 没有编译)。我怀疑这是因为数据库没有将条目保存为 WP 类型,而只保存了字符串。
是否可以从 Excel 创建一个包含代理的集合?
在此之后,我尝试使用与字符串相同的 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_id
、sequence_num
和 workplace_id
(因此多行指定工作场所 ID 的顺序用于订单 ID)。
在 Order
的 On 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 使它 看起来像 您将列类型设置为 int
、String
等,但这些实际上是 Java列的内容最终将转换成的类型。
AnyLogic 确实支持具有选项列表类型的列(以及包含execu[的列的特殊Code
类型列=138=] Java 代码)但这些是特殊情况,在幕后使用特殊逻辑将列数据(最终仍然是字符串)转换为适当的选项列表实例或(对于 Code
列) 编译为即时编译然后执行 Java).
我可能需要 Anylogic 模型方面的帮助。
模型(短):订单在单个路线中移动的制造场景。工作场所 (WP) 是由模拟启动动态创建的。它们的名称、数量和其他参数存储在数据库中(excel 导入)。此外,订单是根据导入创建的。 Agent 群体 "order" 有一个集合 routing,其中包含它必须按特定顺序停止的工作场所。
目标:我想要 main 中的 moveTo 块,它找到代理 order 的下一个目的地。 问题和解决路径:
我将目标类型设置为代理,并在代理字段中键入了函数
agent.getDestination()
。此函数在 顺序 中,return 是集合WP destinationName = routing.get(i)
的下一个条目。有了这个我得到一个数据类型错误(而 运行 没有编译)。我怀疑这是因为数据库没有将条目保存为 WP 类型,而只保存了字符串。 是否可以从 Excel 创建一个包含代理的集合?在此之后,我尝试使用与字符串相同的 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
,元素 classString
;假设称为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: 您订单的参数列(包括一些Stringid
列) other than工作场所列表。 (每行创建一个Order
个代理。)order_workplaces
table:列order_id
、sequence_num
和workplace_id
(因此多行指定工作场所 ID 的顺序用于订单 ID)。
在 Order
的 On 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 使它 看起来像 您将列类型设置为 int
、String
等,但这些实际上是 Java列的内容最终将转换成的类型。
AnyLogic 确实支持具有选项列表类型的列(以及包含execu[的列的特殊Code
类型列=138=] Java 代码)但这些是特殊情况,在幕后使用特殊逻辑将列数据(最终仍然是字符串)转换为适当的选项列表实例或(对于 Code
列) 编译为即时编译然后执行 Java).