OptaPlanner三规划实体装箱建模:我的方案是否高效可简化?
样本存储分配建模优化建议请求
场景说明
我正在优化样本(Aliquot)到盒子(Box)的分配,以及盒子到可用冰柜货架(Rack)的分配场景,涉及数十万份Aliquot、数百个Box及数十台冰柜。由于存在两种高度的样本管,对应不同高度的Box,且较高的Box在Rack上会占用两个较矮Box的空间,同时Aliquot带有SampleType属性,因此随着样本不断收集,所需Box的数量无法提前确定。
核心约束条件
- 尽量减少每个冰柜中的样本类型数量(理想状态:同一冰柜内所有Aliquot为同一SampleType)
- 同一样本采集事件产生的Aliquot需分配至且仅分配至两个冰柜,避免因冰柜故障导致样本丢失
- 遵守Rack和Box的容量限制
- 每份Aliquot和每个Box必须完成存储分配
- Rack中存放较高Box时需移除层隔板,该层仅可放置高Box;每层有5列位,每放5个高Box会损失5个矮Box的容量
当前建模方案
我担心当前的问题建模不够合理,认为或许可以无需使用Shadow Variable,仅将Aliquot和Box作为Planning Entity即可,现寻求改进建议。
当前的领域模型代码如下:
@PlanningEntity public class Rack { @InverseRelationShadowVariable(sourceVariableName = "box") private List<Box> boxes = new ArrayList<>(); private Long boxCapacity; } @PlanningEntity public class Box { @PlanningVariable(valueRangeProviderRefs = "rackRange", nullable = true) private Rack rack; @InverseRelationShadowVariable(sourceVariableName = "aliquot") private List<Aliquot> aliquots = new ArrayList<>(); private Long boxHeight; private Long aliquotCapacity; } @PlanningEntity public class Aliquot { @PlanningVariable(valueRangeProviderRefs = "boxRange", nullable = true) private Box box; private Long aliquotHeight; private SampleType sampleType; } public class SampleType { private String name; } @PlanningSolution public class AliquotMap { @ValueRangeProvider(id = "rackRange") @ProblemFactCollectionProperty private List<Rack> rackList; @ValueRangeProvider(id = "boxRange") @PlanningEntityCollectionProperty private List<Box> boxList; @ValueRangeProvider(id = "aliquotRange") @PlanningEntityCollectionProperty private List<Aliquot> aliquotList; }
当前模型使用了影子变量和三个规划实体,整体过于复杂,请问能否简化这些元素,或有其他更优的建模方法?
内容的提问来源于stack exchange,提问作者nogretz
相关产品推荐
相关产品推荐

