AnyLogic动态执行字符串校验设置智能体参数的方法咨询
AnyLogic动态匹配停车场的可行解决方案
你所使用的executeExpression方法需要严格匹配执行上下文,一旦变量作用域传递错误就会返回null,后续操作空对象就会触发你遇到的报错,且该方法解析成本高,完全没必要用这种方式实现需求,可通过AnyLogic原生的findAgentByName方法实现需求,两种可行方案如下:
方案一:提前缓存停车场列表(最高效,推荐)
- 在停车场所在的上层智能体(通常是Main)中定义一个
List<ParkingLot>类型的变量,命名为parkingLots - 在该智能体的「启动时」动作中写入初始化代码,一次性把所有停车场存入列表:
parkingLots = new ArrayList<>(); for(int i = 0; i <= 200; i++){ parkingLots.add((ParkingLot)findAgentByName("parkingLot" + i)); }
- 为DetachedTrailer智能体分配车位时直接遍历列表即可:
for(ParkingLot lot : parkingLots){ if(lot.getOccupancy() == 0){ agent.parking = lot; lot.enter(agent); // 占用车位 break; } }
方案二:直接循环匹配(适合临时调用场景)
如果不想额外缓存列表,也可以在需要分配车位时直接遍历查找:
ParkingLot freeLot = null; for(int i = 0; i <= 200; i++){ ParkingLot temp = (ParkingLot)findAgentByName("parkingLot" + i); if(temp.getOccupancy() == 0){ freeLot = temp; break; } } if(freeLot != null){ agent.parking = freeLot; freeLot.enter(agent); }
提示:如果你的匹配逻辑写在非停车场所在的上层智能体中,需要先获取到停车场所在智能体的实例再调用查找方法,比如停车场都在Main智能体中,就调用
main.findAgentByName("parkingLot" + i)。
内容的提问来源于stack exchange,提问作者Yashar Ahmadov
相关产品推荐
相关产品推荐

