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

问题描述 投票:0回答:2

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

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

目标:我想在

main

中使用moveTo块来查找代理order的下一个目的地。问题和解决方法:
  1. 我将目标类型设置为代理,并在“代理”字段中键入了一个函数agent.getDestination()。此函数位于

    order

中,该函数返回集合WP destinationName = routing.get(i)的下一个条目。有了这个我得到一个数据类型错误(运行时不编译)。我之所以这么问是因为数据库不会将条目另存为WP Type,而只能另存为String。是否可以使用Excel中的代理创建集合?
  • 此后,我尝试使用与String相同的

    getDestination

  • 作为字符串,因此可以通过findFirst查找与返回名称匹配的WP,并将其作为WP返回。WP targetWP = findFirst(wps, w->w.name == destinationName);找不到合适的wps(工作场所的人口)。我如何搜索人口?也许使用Agentlink? 我认为这并不困难,但找不到答案或解决方案。如您所知,我是一个初学者...希望说明很好,有人可以帮助我或给我提示:)谢谢
    database search collections anylogic population
    2个回答
    0
    投票
    是否可以通过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开始)。]
    • 在Main中编写一个名为getWorkplaceByID的函数,该函数具有单个String参数id并返回Workplace。这是从与ID相匹配的人口那里获得的工作场所;与您类似的单行方法是findFirst(workplaces, w -> w.id.equals(id))
    • MoveTo块(我认为是在Main中)需要将Order移动到由getWorkplaceByID(agent.workplaceIDsList.get(nextWorkplaceIndex++))定义的代理。 (++位使计算表达式的索引

      after

    • 递增,以便为下一个工作场所准备就绪。)
    为了填充集合,您将有两个表,如下所示(假设使用字符串作为工作场所和订单的ID):

    • [orders表:您的订单参数的列(包括一些String id列])

      other

    ,而不是工作场所列表。 (每行创建一个Order代理。)
  • [order_workplaces表:列order_idsequence_numworkplace_id(因此,多行指定了订单ID的工作场所ID的顺序)。
  • Order

    启动时

    操作中,通过插入数据库查询向导设置骨架查询代码,如下所示(在这里我们要遍历该订单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-并且数据库仅了解它们自己的特定数据类型,例如VARCHAR,AnyLogic及其使用的库将它们转换为Java类型,例如String。在用户界面中,AnyLogic使外观可以将列类型设置为intString等,但是这些实际上是最终将列内容转换为的Java类型。AnyLogic

    does

    支持具有option list类型的列(对于包含可执行Java代码的列,还有特殊的Code type列),但是在特殊情况下,使用幕后的特殊逻辑来翻译该列数据(最终仍然是一个字符串)存储到适当的选项列表实例中,或(对于Code列)存储到即时编译然后执行的Java中。

    0
    投票
    欢迎使用堆栈溢出:)要通过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, 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 }

    © www.soinside.com 2019 - 2024. All rights reserved.