AnyLogic技术问询:关联Population与Source及代理创建异常问题
AnyLogic: 关联Population与Source并控制代理创建规模
我来帮你解决这两个AnyLogic的技术问题,都是流程模型里常见的场景:
1. 如何关联Population(种群)与Source(源)?
关联Population和Source主要分两种场景,看你的实际需求:
场景A:Source创建新代理并加入Population
如果你的逻辑是让Source生成新代理,之后把这些代理存入Population中管理,操作很简单:
- 确保Source的Agent type和Population的代理类型完全一致(比如都是
Customer类)。 - 打开Source的属性面板,找到On exit动作(代理离开Source时触发),添加代码:
这样每次Source产出一个代理,就会自动被加入到Population里,实现两者的关联。population.add(agent);
场景B:Source从已有的Population中取出代理
如果你的Population已经预先初始化了一批代理,需要通过Source把这些代理送入流程,那关联的核心是让Source直接调用Population中的代理,而不是新建。具体操作看第二个问题的详细步骤。
2. 让Source仅从指定Population创建/取出代理,一次性完成且不超规模
你提到Source创建的代理数量超过Population规模,大概率是因为Source在新建代理,而不是使用Population中已有的。下面是实现需求的标准步骤:
第一步:预先初始化Population的代理数量
先确保Population里有你需要的固定数量代理:
- 打开Population的属性面板,在Initial number里填写你需要的代理总数(比如100);
- 或者在模型的
Main模块的On startup动作里写代码初始化:// 设置Population容量并创建所有初始代理 population.setCapacity(100); population.createAllAgents();
第二步:修改Source的触发逻辑,一次性取出所有代理
默认Source是按时间间隔创建新代理,我们要改成一次性从Population取出所有代理:
- 打开Source的属性面板,把Type of arrival改成
Arrival defined by code; - 找到Source的On startup动作(模型启动时触发),添加以下代码:
(注意把// 遍历Population中的所有代理 List<MyAgent> agentsToSend = new ArrayList<>(population.getAgents()); for(MyAgent agent : agentsToSend) { // 从Population中移除代理(如果不需要保留Population里的副本) population.remove(agent); // 将代理发送到Source的输出端口,进入后续流程 send(agent, out); }MyAgent替换成你实际的代理类名称)
额外说明:如果需要保留Population中的代理
如果你只是想复制Population中的代理送入流程,而不删除原Population里的内容,那可以修改代码为:
for(MyAgent originalAgent : population) { // 复制原代理 MyAgent newAgent = new MyAgent(this); newAgent.copyFrom(originalAgent); // 复制属性(需要代理类支持copyFrom方法,或手动复制属性) send(newAgent, out); // 如果需要把新代理也加入Population,记得控制总数不超容量 if(population.size() < population.getCapacity()) { population.add(newAgent); } }
但这种场景下要注意,如果你一次性复制,总数不会超过Population的初始规模,因为你是按原数量复制的。
这样设置后,Source会在模型启动时一次性把Population里的代理全部送入流程,不会出现创建数量超过Population规模的问题。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

