Optaplanner - 约束流groupBy

Optaplanner - Constraint streams groupBy

我正在尝试解决一个调度问题,该问题围绕以下安排:

Equipment <- Task <- ShiftAssignment(规划变量)-> Shift

Tasks 在设备使用方面存在问题;每个都可以引用一个特定的 Equipment 实例或实例,并具有以分钟为单位的关联时间。它占用了分配给 Shift 中的该设备的时间。

我应该能够通过 join()groupBy() 实现约束吗?我尝试过以下路线:

    private Constraint doNotOverbookEquipment(ConstraintFactory factory) {
        return factory.from(ShiftAssignment.class)
                // join shift assignments with the shifts they are assignments of
                .join(Shift.class, equal(ShiftAssignment::getShiftId, Shift::getId))
                // join with ALL pieces of equipment
                .join(Equipment.class)
                .groupBy([Shift and Equipment, summing the equipment-usage for each ShiftAssignment])
                .filter([equipment usage greater than a constant])
                .penalizeConfigurable("do not overbook Equipment");

我觉得filter()应该没问题,但是不确定具体怎么弄这个groupBy()来实现我想要的。这里需要 TriConstraintCollector 吗?或者是否有不同的、更好的整体方法?

作为参考,ShiftAssignment class 可以很容易地拥有如下方法:

public LinkedHashSet<Equipment, Integer> getEquipmentUsage()

我认为你的 groupBy() 看起来像这样:

.groupBy(
    (shiftAssignment, shift, equipment) -> shift,
    (shiftAssignment, shift, equipment) -> equipment,
    ConstraintCollectors.sum((shiftAssignment, shift, equipment) ->
        shiftAssignment.getUsage(shift, equipment)
)

在这种情况下,要求和的实际逻辑应该在 shiftAssignment.getUsage(...) 或您选择在那里使用的任何其他方法中实现。