我可能需要有关Anylogic模型的帮助。
模型(简短):制造场景中订单在一条单独的路线中移动。通过仿真开始动态创建工作场所(WP)。它们的名称,数量和其他参数存储在数据库中(excel导入)。订单也根据导入创建。座席人口“订单”具有集合[[routing,其中包含必须按特定顺序停止的工作场所。
目标:我想在main
中使用moveTo块来查找代理order的下一个目的地。问题和解决方法:agent.getDestination()
。此函数位于order
WP destinationName = routing.get(i)
的下一个条目。有了这个我得到一个数据类型错误(运行时不编译)。我之所以这么问是因为数据库不会将条目另存为WP Type,而只能另存为String。是否可以使用Excel中的代理创建集合?getDestination
WP targetWP = findFirst(wps, w->w.name == destinationName);
找不到合适的wps(工作场所的人口)。我如何搜索人口?也许使用Agentlink? 我认为这并不困难,但找不到答案或解决方案。如您所知,我是一个初学者...希望说明很好,有人可以帮助我或给我提示:)谢谢是否可以通过Excel的代理创建集合?
不直接使用集合的属性,并且如您所见,您不能拥有代理类型的数据库(DB)列类型。
1
但是通过Java代码直接进行操作相对简单(您可以使用Insert Database Query向导为您构造框架代码。
此后,我尝试使用与String相同的getDestination,因此可以通过findFirst查找与返回名称匹配的WP,并将其返回为WP
是的,这是一种方法。如果您的订单详细信息在Excel /数据库中,则可能是通过某些字符串ID(这是您从单独的Excel工作表/数据库表创建的工作场所代理的参数)来引用工作场所的。但是,您需要使用Java equals
方法比较字符串,而不是==
(用于比较数字或两个对象是否是同一对象)来比较字符串。
我想要main中的moveTo块来查找代理订单的下一个目的地
所以一般的整体解决方案是
Workplace
代理(在Main中称为workplaces
),每个代理都具有String参数id
或从DB列映射的类似参数。Order
代理(在Main中称为orders
),然后在启动时设置其工作场所ID的集合(类型ArrayList
,元素类String
;假设称为workplaceIDsList
)使用另一个DB表中的数据。
Order
可能还需要一个工作变量,用于将列表中的下一个索引存储到该索引中(因此,假设一个int
变量nextWorkplaceIndex
从0开始)。]getWorkplaceByID
的函数,该函数具有单个String
参数id
并返回Workplace
。这是从与ID相匹配的人口那里获得的工作场所;与您类似的单行方法是findFirst(workplaces, w -> w.id.equals(id))
。Order
移动到由getWorkplaceByID(agent.workplaceIDsList.get(nextWorkplaceIndex++))
定义的代理。 (++
位使计算表达式的索引after
orders
表:您的订单参数的列(包括一些String id
列])other
Order
代理。)order_workplaces
表:列order_id
,sequence_num
和workplace_id
(因此,多行指定了订单ID的工作场所ID的顺序)。在Order
的
启动时
操作中,通过插入数据库查询向导设置骨架查询代码,如下所示(在这里我们要遍历该订单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));
}
AnyLogic数据库是一个普通的关系数据库-实际上是HSQLDB-并且数据库仅了解它们自己的特定数据类型,例如1
VARCHAR
,AnyLogic及其使用的库将它们转换为Java类型,例如String
。在用户界面中,AnyLogic使外观可以将列类型设置为int
,String
等,但是这些实际上是最终将列内容转换为的Java类型。AnyLogic does
支持具有option list类型的列(对于包含可执行Java代码的列,还有特殊的Code
type列),但是在特殊情况下,使用幕后的特殊逻辑来翻译该列数据(最终仍然是一个字符串)存储到适当的选项列表实例中,或(对于Code
列)存储到即时编译然后执行的Java中。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
}