Anylogic如何向指定状态的n个异类型连接智能体发送消息并计数
可行实现方案
你原有的send("Buy", RANDOM_CONNECTED)是框架内置的通用发送规则,本身不支持自定义过滤和数量控制,直接手动遍历连接链路做筛选、抽样、定向发送即可,同时可以完成计数需求,具体实现如下:
1. 统计符合条件的staff智能体总数
沿employee连接链路拉取所有和owner1关联的智能体,过滤出staff种群、状态为waiting的对象,列表长度即为所需统计值,参考代码:
// 拉取owner1通过employee链路连接的所有智能体,筛选合格目标 List<Staff> eligibleStaff = owner1.getConnections("employee") .filter(agent -> agent instanceof Staff) // 过滤非staff种群的其他类型智能体 .filter(agent -> "waiting".equals(agent.getCurrentState())) // 过滤处于waiting状态的对象 .toList(); // 统计符合条件的总数量 int totalWaitingConnectedStaff = eligibleStaff.size();
2. 随机选n个目标发送"Buy"消息
先对合格目标列表做无偏随机打乱,截取前n个(不足n个则取全部)作为发送目标,逐个定向发送消息,替换原有内置发送逻辑,参考代码:
// 计算实际可发送数量,避免抽样数超过可用目标数触发报错 int actualSendNum = Math.min(n, eligibleStaff.size()); // 随机打乱合格目标列表,实现无偏随机抽样 List<Staff> shuffledTargets = new ArrayList<>(eligibleStaff); Collections.shuffle(shuffledTargets); // 截取指定数量的目标 List<Staff> sendTargets = shuffledTargets.subList(0, actualSendNum); // 逐个定向发送消息 for (Staff target : sendTargets) { send("Buy", target); }
注意事项
- 若你使用的建模框架API命名和示例有差异(比如获取连接、获取状态的方法名不同),直接替换为框架对应原生方法即可,筛选-随机抽样-定向发送的核心逻辑通用
- 若需要复现实验结果,可以给
Collections.shuffle()传入带固定随机种子的Random实例,保证每次抽样结果一致 - 当没有符合条件的staff智能体时,上述逻辑不会执行发送操作,不会触发空指针、索引越界等运行时错误
内容的提问来源于stack exchange,提问作者Jeun Bee
相关产品推荐
相关产品推荐

