Optaplanner - 约束流groupBy
Optaplanner - Constraint streams groupBy
我正在尝试解决一个调度问题,该问题围绕以下安排:
Equipment
<- Task
<- ShiftAssignment
(规划变量)-> Shift
Task
s 在设备使用方面存在问题;每个都可以引用一个特定的 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(...)
或您选择在那里使用的任何其他方法中实现。
我正在尝试解决一个调度问题,该问题围绕以下安排:
Equipment
<- Task
<- ShiftAssignment
(规划变量)-> Shift
Task
s 在设备使用方面存在问题;每个都可以引用一个特定的 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(...)
或您选择在那里使用的任何其他方法中实现。