AnyLogic Split块副本索引获取及原代理等待实现问题
解决AnyLogic Split副本索引获取及原代理等待逻辑问题
一、正确获取1-10的副本索引
官方文档提到的index是Split块「New agent (copy)」和「On exit copy」扩展点的局部变量,并非代理自带属性。正确做法是:
- 给你的代理类添加一个自定义整数属性,比如
copyIndex。 - 在Split块的「New agent (copy)」扩展点中,直接用局部变量
index赋值:
此时agent.copyIndex = index;index会从1开始,生成第1到第10个副本时依次返回1、2...10,完全符合需求。
二、原代理等待所有副本完成Delay2后释放的实现
核心思路是让副本完成后通知原代理,累计完成数达标后释放原代理:
- 给原代理添加两个属性:
completedCopies(整数,初始值0):记录已完成Delay2的副本数totalCopies(整数):记录总副本数(这里固定为10)
- Split块设置:勾选「Keep original agent」,将原代理输出到Hold块,副本输出到Delay2块。
- 关联副本与原代理:在Split块的「New agent (copy)」扩展点中,给副本添加一个自定义属性
originalAgent(类型为你的代理类),并赋值:agent.originalAgent = original; - 副本完成后更新计数并触发释放:在Delay2块的「On exit」扩展点中添加代码:
// 获取对应的原代理(替换MyAgent为你的代理类名) MyAgent original = agent.originalAgent; // 完成数+1 original.completedCopies++; // 判断是否所有副本都完成 if (original.completedCopies == original.totalCopies) { // 释放原代理(替换holdBlock为你的Hold块名称) holdBlock.release(original); } - 提前设置总副本数:在Split块的「On split」扩展点中,给原代理赋值总副本数:
original.totalCopies = 10;
这样就能实现原代理在Hold块等待,直到10个副本全部完成Delay2后自动释放的逻辑。
内容的提问来源于stack exchange,提问作者Dr Xorile
相关产品推荐
相关产品推荐

