AnyLogic:在模拟启动时用代理填充托盘架

AnyLogic: Fill a pallet rack on simulation startup with agents

为了模拟托盘架系统,我想用代理预填充该系统(例如,给出 80% 的填充等级)。在预填充之后,盒子应该由不同的源块生成。

我认为理论上我可以在 main 方法中使用命令 palletrack.put(int row, int position, int level, boolean leftAisle, Agent agent) 手动添加代理。

但是,我需要在启动时添加数千个代理,手工操作会很乏味(特别是如果我想从不同的填充等级情况开始)。

这些代理的数据在 Excel 文件中可用。

有没有办法实现Excel-File作为启动情况? 在 Excel 文件中,我拥有所需代理的所有属性,包括行、位置、级别和存储位置的深度。

非常感谢。

您有 2 个选择

选项 1:Excel 文件

只需 link 模型中的 Excel 文件,使用连接调色板中的对象

然后你可以使用类似于下面的代码初始化所有项目

int excelRow = 2;
String sheetName = "Sheet1!";
String cellName =  sheetName + "A" + excelRow;
while (excelFile.cellExists( cellName )) {
    int row = (int)excelFile.getCellNumericValue( sheetName + "A" +  excelRow);
    int position = (int)excelFile.getCellNumericValue( sheetName + "B" +  excelRow);
    int level = (int)excelFile.getCellNumericValue( sheetName + "C" +  excelRow);
    boolean leftAisle = excelFile.getCellBooleanValue( sheetName + "D" +  excelRow);
    MyAgent agent = add_myAgent();
    
    rackSystem.put(row, position, level, leftAisle, agent);
    
    excelRow ++; // Increase the row that we will lookup in the Excel
}

只是一个 while 循环,只要该行存在,您就可以从一个 excel 行转到下一个,然后创建一个代理并根据需要将其放置在机架中

在这个例子中,我们假设 A 到 D 列包含机架中代理的相关位置数据

编辑:大多数情况下,您需要让代理进入流程,以便您可以再次移动它们(通常通过 RackPick 块),您可以使用 Enter 块 - 请参见下面的示例

你可以直接调用 enter.take(Agent agent)

NB [Stuart Rossiter 编辑]:您可以想到托盘架的 put 函数,将代理放入托盘所在空间网络中的空间节点机架的一部分。但是,如果代理事先不在空间网络中,则它们不会 'fully' 添加到网络中,并且当您尝试选择它时会出现“代理不在网络中”错误从机架上。 (我怀疑内部实际发生的是机架中的每个单元都有与之相关联的网络内坐标,但在您选择之前,代理并未明确 网络中它。无论内部结构如何,关键是代理必须 'told' 它在被选中之前的某个时刻处于空间网络中。)

您可以通过几种方式实现这一点:

(i) 在 put 之后添加显式 setNetwork 调用;例如,

rackSystem.put(row, position, level, leftAisle, agent);
agent.setNetwork(network);

(其中 network 是您的托盘架所属的空间网络)。

(ii) 让你的代理人处于初始位置设置为同一空间网络中某个任意节点的群体中(因此当你 put 他们在托盘架中时,他们已经在网络中)

(iii) 让 Enter 块(见上文)将它们的初始位置设置为空间网络中的某个任意节点。 (与上面(ii)的想法相同。)

(iv) 切换到使用来自 Material 处理库(在 AnyLogic 8.7.7 中添加)的新存储元素和 Store/Retrieve 块。这些没有上述网络设置问题,并取代了流程建模库元素(现在永远不会更新)。您使用 store 函数而不是 put 以编程方式将代理添加到存储元素。

选项 2:AnyLogic 内部数据库

只需将 excel sheet 导入 AnyLogic 数据库,然后使用 for 循环

遍历 table 中的条目
List<Tuple> rows = selectFrom(db_table).list();

for (Tuple row : rows) {
    traceln(
        row.get( db_table.db_column )
    );
}