如何从ResourcePool中选取距离指定工位最近的可用资源
AnyLogic资源池最近资源调度解决方案
核心实现方法
无需依赖GIS模块,通过类型强转+评分排序即可实现,操作步骤如下:
方法1:使用「Unit with top rating」配置(最简便,推荐)
你之前配置不生效的核心原因是两点:没有对unit做类型强转、距离参照对象错误,正确配置如下:
- 进入Service/Station模块的
Resource selection配置栏,下拉选择Unit with top rating - 在Rating输入框中填入代码:
-((Operario)unit).distanceTo(agent)
规则说明:
((Operario)unit)是将默认的Agent类型资源单元强转为你自定义的Operario类型,才能调用位置计算方法- 加负号是因为AnyLogic会优先调度评分最高的资源,距离越小负数值越大,刚好符合最近优先的逻辑
- 如果需要以工位固定位置为参照,将代码中的
agent(指当前进入模块的物料实体)替换为工位对应的节点对象即可,例如stationNode1
方法2:通过Customize resource choice实现
如果你需要叠加其他筛选规则,可以用自定义资源选择条件,操作如下:
- 在请求资源的模块(如Service)的
On enter动作中,先计算当前所有空闲工人到目标位置的最小距离,存为临时变量:
// 示例:resourcePool1为你的工人资源池对象,agent为物料/工位参照对象 double minWorkerDistance = Collections.min( findAll(resourcePool1.idle(), unit -> ((Operario)unit).distanceTo(agent)) );
- 进入
Customize resource choice配置栏,在Resource choice condition输入框中填入:((Operario)unit).distanceTo(agent) == minWorkerDistance
常见问题排查
- 若报语法错误,优先检查类型强转的括号是否完整,
((Operario)unit)的两层括号不能省略 - 若调度逻辑不符合预期,可在Rating代码处加打印日志验证距离计算是否正确:
traceln(((Operario)unit).distanceTo(agent));
内容的提问来源于stack exchange,提问作者Manu_CS
相关产品推荐
相关产品推荐

