Anylogic人道主义物流模型:多卡车无法独立选择可用近距仓库求助
修复Anylogic卡车调度算法:确保每辆卡车独立计算最近可用仓库
问题根源
- 循环内重复执行排序逻辑,每次以不同仓库为参照排序,导致最终排序结果完全混乱,并非基于当前卡车到仓库的距离排序
sortmag = subsetlist是直接引用原集合,未创建独立副本,后续操作会干扰原仓库数据distance列表如果是卡车的成员变量,未在每次计算前清空,会残留之前卡车的计算数据- 代码中
Magazzini和Warehouses类型混用,可能引发类型匹配问题
修复后的代码
// 筛选所有有可用物资的仓库 List<Magazzini> availableWarehouses = findAll(main.magazzinis, w -> w.availabilty > 0); // 无可用仓库时的兜底处理,避免索引越界 if(availableWarehouses.isEmpty()){ System.out.println("当前无可用仓库"); return; } // 创建独立副本,避免修改原仓库集合 List<Magazzini> sortedWarehouses = new ArrayList<>(availableWarehouses); // 核心逻辑:按当前卡车到仓库的距离升序排序 sortedWarehouses = sortAscending(sortedWarehouses, warehouse -> distanceTo(warehouse)); // 移动到最近的可用仓库 moveTo(sortedWarehouses.get(0)); System.out.println("选中仓库:" + sortedWarehouses.get(0)); // 清空临时列表(若为局部变量可省略,方法结束后会自动回收) sortedWarehouses.clear();
关键修复说明
- 一次性精准排序:直接以当前卡车的
distanceTo方法为排序依据,一次完成升序排序,确保结果是仓库到当前卡车的距离从近到远 - 独立集合副本:用
new ArrayList<>(availableWarehouses)创建独立副本,避免操作影响原仓库集合的原始数据 - 空集合校验:添加空集合判断,防止无可用仓库时抛出索引越界异常
- 统一类型:全程使用
Magazzini类型,消除类型混用带来的潜在错误
额外注意事项
- 仓库物资被提取后,要及时将
availabilty更新为0,避免后续卡车误判仓库可用性 - 若
distance是卡车的成员变量,需在每次计算前执行distance.clear(),防止前次计算的数据累积干扰结果
内容的提问来源于stack exchange,提问作者Alfonso
相关产品推荐
相关产品推荐

