AnyLogic调用pedWait.free()释放等待行人及吸引点排序实现咨询
free() 传参报错解决
你遇到的报错是因为传入了Pedestrian(行人类型)作为参数,pedWait.free() 方法要求传入具体的某一个处于等待状态的行人代理实例,而非类型本身。
无优先级需求时的最简调用代码(直接放在source块的「到达前」动作中即可):
// 先判断等候室还有等待的行人,避免空指针报错 if (pedWait.size() > 0) { // 取出等候室中第一个等待的行人并释放 pedWait.free(pedWait.getAgents().get(0)); }
按吸引点顺序释放的实现方案
- 第一步:预定义排序规则,给所有等候室关联的吸引点按你需要的释放顺序编号,优先级越高编号越小,比如优先释放的吸引点编为1,次之为2,依此类推。
- 第二步:给行人代理新增参数,在行人代理的类型定义中,新增一个int类型的变量
attractorOrder,用于存储该行人当前所在吸引点的编号。 - 第三步:赋值排序字段,在行人进入
pedWait块的前一个动作(比如pedGoTo的on enter,或者pedWait的on enter动作)中,给行人的attractorOrder赋值为他所前往的吸引点的编号。 - 第四步:修改source块的「到达前」动作代码,每次释放前先排序再取最高优先级的行人:
if (pedWait.size() > 0) { // 按吸引点编号升序排序,取优先级最高的行人 List<Pedestrian> sortedWaitingPeds = sort(pedWait.getAgents(), ped -> ped.attractorOrder); pedWait.free(sortedWaitingPeds.get(0)); }
如果你的吸引点已经保存在一个有序集合(比如List类型的myAttractors)中,可以不用额外给行人加变量,直接通过吸引点在集合中的索引排序:
if (pedWait.size() > 0) { List<Pedestrian> sortedWaitingPeds = sort(pedWait.getAgents(), ped -> myAttractors.indexOf(ped.getTargetAttractor())); pedWait.free(sortedWaitingPeds.get(0)); }
内容的提问来源于stack exchange,提问作者w-.
相关产品推荐
相关产品推荐

