AnyLogic:在模拟启动时用代理填充托盘架
Posted
技术标签:
【中文标题】AnyLogic:在模拟启动时用代理填充托盘架【英文标题】:AnyLogic: Fill a pallet rack on simulation startup with agents 【发布时间】:2021-10-21 18:18:55 【问题描述】:对于托盘架系统的模拟,我想用代理预填充该系统(例如,给定 80% 的填充等级)。在预填充之后,盒子应该由不同的源块生成。
我认为理论上我可以在main方法中使用命令palletrack.put(int row, int position, int level, boolean leftAisle, Agent agent)
手动添加代理。
但是,我需要在启动时添加数千个代理,手动操作会很乏味(特别是如果我想从不同的填充等级情况开始)。
这些代理的数据在 Excel 文件中可用。
有没有办法实现 Excel 文件作为启动情况? 在 Excel 文件中,我拥有代理所需的所有属性,包括其存储位置的行、位置、级别和深度。
非常感谢。
【问题讨论】:
您可以轻松加载 Excel 数据并在其中循环,以便在开始时以编程方式填充您的托盘。查看帮助和示例模型,有大量关于如何加载 xls 数据并应用它的信息。 【参考方案1】:你有两个选择
选项 1:Excel 文件
使用连接面板中的对象,只需在模型中链接一个 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
函数,将代理放入托盘架所在的空间网络内的空间节点中。但是,如果代理事先不在空间网络中,它们不会“完全”添加到网络中,当您尝试从架子。 (我怀疑内部实际发生的情况是机架中的每个单元都有与之关联的网络内坐标,但代理直到您选择它的那一刻才明确在网络中。无论如何在内部,关键是代理必须在被选中之前被“告知”它在空间网络中的某个时间点。)
您可以通过以下几种方式实现这一点:
(i) 在put
之后添加一个显式的setNetwork
调用;例如,
rackSystem.put(row, position, level, leftAisle, agent);
agent.setNetwork(network);
(其中network
是您的托盘货架所在的空间网络)。
(ii) 让您的代理在初始位置设置为同一空间网络中的某个任意节点的群体中(因此当您 put
他们在托盘架中时,他们将已经在网络中)
(iii) 让 Enter 块(见上文)将它们的初始位置设置为空间网络中的某个任意节点。 (与上述 (ii) 的想法相同。)
(iv) 切换到使用材料处理库中的新存储元素和存储/检索块(在 AnyLogic 8.7.7 中添加)。这些没有上述网络设置问题,并取代了流程建模库元素(现在永远不会更新)。您使用store
函数而不是put
以编程方式将代理添加到存储元素。
选项 2:AnyLogic 内部数据库
只需将 Excel 工作表导入 AnyLogic 数据库,然后使用 for 循环遍历表中的条目
List<Tuple> rows = selectFrom(db_table).list();
for (Tuple row : rows)
traceln(
row.get( db_table.db_column )
);
【讨论】:
非常感谢,它按预期工作。但是,关于我创建的代理,我还有两个问题: - 代理按预期逻辑放置在托盘架中,但它们没有视觉上放置在托盘架的 3D 动画中。有没有办法解决这个问题? - 当我想挑选一个托盘时,一旦托盘到达 RackPick 块,我会收到一条错误消息,表明代理不在网络中。如何手动评估应将代理放入每个代理的网络? 感谢@Alex 的反馈。 3D 问题不是原始问题的一部分,所以我将在这里回答。在高级部分下的 RackSystem 对象检查中,您可以选择选项 doDraw stored agents:
并选择 At the default position
。为了确保代理在以编程方式创建它们后进入网络,请根据我更新的答案使用输入块(FMI - 你之前做了什么让我们创建的代理回到流程图中?)
再次非常感谢。我已经尝试了您之前提出的两个建议,但是,我犯了一些小错误,导致程序无法正常工作。但经过仔细检查和您的帮助,我让它正常运行。回答您的问题:到目前为止,我在没有启动代理的情况下运行模型。我在源代码块中创建了它们,并将我实验的“有用”部分推迟到最后一个盒子被放置。然而,启动技巧减少了模拟时间以获得有用的结果,所以我一定会坚持下去。再次感谢您的友好和快速的帮助。
@Jaco-BenVosloo 这是正确的解决方案,但由于在您通过put
明确添加代理时托盘架的行为方式存在一些怪癖,因此它不起作用。尽管put
有效地使它们生活在托盘架空间标记内的(隐藏)节点中(即在空间网络中),但代理实际上并不在网络中另一方面,所以您必须在代理上显式调用 setNetwork
才能将其添加到托盘架所属的网络中。需要 Enter 块才能将它们添加到 process 中(因此正如您所说,它们是可以选择的)但不能解决网络部分。
OK 做了一个建议的编辑,希望能解释它。 (我知道我可以添加一个单独的答案,甚至可以将答案编辑为社区 wiki,但考虑到编辑的性质,如果我们同意有一个编辑过的答案,IMO 会更好。(我将我的名字放在编辑中以表示“可追溯性” '.)以上是关于AnyLogic:在模拟启动时用代理填充托盘架的主要内容,如果未能解决你的问题,请参考以下文章