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

我可能需要有关Anylogic模型的帮助。

模型(简短):带有在单个路径中移动订单的制造场景。通过模拟开始动态创建工作场所(WP)。它们的名称,数量和其他参数存储在数据库中(excel导入)。订单也根据导入创建。座席人口“订单”有一个 routing 集合,其中包含必须按特定顺序停止的工作场所。

目标:我想在 main 中使用moveTo块来查找代理 order 的下一个目的地。 问题和解决方法:

  1. 我将目标类型设置为代理,并在“代理”字段中键入了函数agent.getDestination()。此函数的顺序为 order ,该函数返回集合WP destinationName = routing.get(i)的下一个条目。有了这个我得到一个数据类型错误(运行时不编译)。我之所以这样是因为数据库不会将条目另存为 WP Type,而只能将其保存为String。 是否可以通过Excel使用代理创建收藏夹?

  2. 此后,我尝试使用与String相同的 getDestination ,因此可以通过findFirst查找与返回名称匹配的WP并将其作为WP返回。 WP targetWP = findFirst(wps,w->w.name == destinationName); 找不到合适的wps(工作场所的人口)。 如何搜索人群? 也许使用Agentlink?

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

ls_liusong 回答:如何找到数据库填充的MoveTo目标?

欢迎使用堆栈溢出:)要通过Excel Import创建填充,您必须创建一个方法并调用这样的代码。您还需要一个空人口。
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,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 }

,

是否可以使用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使用另一个数据库表中的数据

  • Order可能还需要一个工作变量,用于将列表中的下一个索引存储在该索引中(因此,假设int变量nextWorkplaceIndex从0开始)。

  • 在Main中编写一个名为getWorkplaceByID的函数,该函数具有单个String参数id并返回Workplace。这是从与ID相匹配的人口那里获得的工作场所;与您类似的单行方法是findFirst(workplaces,w -> w.id.equals(id))

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

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

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

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

  • p>

Order启动时操作中,通过 Insert Database Query 向导设置框架查询代码,如下所示(我们要在其中循环浏览该订单ID的所有行,然后执行某些操作---我们将更改框架代码以向集合中添加条目,而不是像框架代码那样通过traceln打印内容。

Insert Database Query setup

然后,我们将骨架代码编辑为如下所示。 (请注意,我们在初始查询中添加了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 ---并且数据库仅通过AnyLogic理解自己特定的数据类型,例如VARCHAR以及它使用的库将它们转换为Java类型,例如String。在用户界面中,AnyLogic使看起来像,您将列类型设置为intString等,但这实际上是列内容将使用的Java类型。最终被翻译成。

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

本文链接:https://www.f2er.com/2796372.html

大家都在问