AnyLogic中按距离筛选Pharma设施并选取最优设施的问题求助
基于距离筛选Pharma并选取服务质量最优设施的问题解决
问题背景
需要实现以下逻辑:从Pharma类设施集合中,通过findAll函数(接收集合和筛选条件两个参数)筛选出与指定Person距离在范围内的设施,再从中选取服务质量最优的项。当前代码中findAll的条件参数报错,提示方法不适用。
用户代码示例:
Pharma nearest = this.getNearestAgent(main.pharmas); for (int i=0; i<main.people.size(); i++){ Person p = main.people.get(i); if (p.getConnectionsNumber()>0){ List <Pharma> x = findAll(main.pharmas, p.agentsInRange(100));//[Problem is here] Pharma y = top(x, s->s.serviceQuality); return y; }else{ return nearest; } }
问题原因
findAll的第二个参数需要的是判断单个Pharma是否符合条件的断言(Predicate),但你直接传入了p.agentsInRange(100)的返回值——这应该是一个Agent集合,类型不匹配,导致方法调用报错。
解决方案
方案1:修正findAll的条件参数
先获取Person范围内的Agent集合,再通过断言判断每个Pharma是否属于这个集合:
Pharma nearest = this.getNearestAgent(main.pharmas); for (int i=0; i<main.people.size(); i++){ Person p = main.people.get(i); if (p.getConnectionsNumber()>0){ // 先拿到范围内的所有Agent集合 Collection<Agent> inRangeAgents = p.agentsInRange(100); // 用断言判断Pharma是否在范围内集合中 List<Pharma> x = findAll(main.pharmas, pharma -> inRangeAgents.contains(pharma)); // 取服务质量最优的项 Pharma y = top(x, s->s.serviceQuality); return y; }else{ return nearest; } }
如果你的Person类提供了直接判断单个对象是否在范围内的方法(比如isInRange(T agent, int distance)),可以更简洁:
List<Pharma> x = findAll(main.pharmas, pharma -> p.isInRange(pharma, 100));
方案2:用Java Stream API替代findAll
如果项目允许使用Stream,可以直接完成筛选+取最优的逻辑,代码更简洁:
Pharma nearest = this.getNearestAgent(main.pharmas); for (int i=0; i<main.people.size(); i++){ Person p = main.people.get(i); if (p.getConnectionsNumber()>0){ Pharma y = main.pharmas.stream() // 筛选范围内的Pharma .filter(pharma -> p.agentsInRange(100).contains(pharma)) // 按服务质量倒序取第一个(即最优) .max(Comparator.comparing(Pharma::getServiceQuality)) // 如果筛选结果为空,返回最近的设施 .orElse(nearest); return y; }else{ return nearest; } }
内容的提问来源于stack exchange,提问作者Morshed Dolon
相关产品推荐
相关产品推荐

