在 groupby 之后获取平均值以获得公平的平衡
Get average after groupby for a fair balancing
我想测试计数(按技术人员分组后,numberOfTasksByTechnician)是否高于平均水平,以实现技术人员任务的良好平衡(每个技术人员必须完成相同数量的任务),我如何获得平均值(硬编码值 4)
Constraint technicianCharge(ConstraintFactory constraintFactory) {
return constraintFactory.from(Task.class)
.groupBy(
Task::getTechnician, ConstraintCollectors.countDistinct()
)
.filter((technician, count)-> {
return count > 4; // return count > (?average)
})
.penalize("technicianCharge", HardSoftScore.ONE_SOFT);
}
目前,要收集平均值,您需要编写自定义约束收集器。这并不难,查看 count() implementation 寻找灵感。当您拥有约束收集器时,您的约束流将如下所示:
Constraint technicianCharge(ConstraintFactory constraintFactory) {
return constraintFactory.from(Task.class)
.groupBy(
Task::getTechnician,
ConstraintCollectors.countDistinct(),
MyConstraintCollectors.average(task -> ...)
)
.filter((technician, count, average)-> {
return count > average;
})
.penalize("technicianCharge",
HardSoftScore.ONE_SOFT,
(technician, count, average) -> count - average);
}
以后我们可能会提供平均约束收集器out-of-the-box。
作为脚注,既然您提到了公平,您可能希望在 OptaPlanner load balancing and fairness 上查看我们的博客。
从 OptaPlanner 8.11 开始。0.Final,'average' 开箱即用。
https://www.optaplanner.org/blog/2021/08/19/ConstraintStreamsSomeMoreLove.html
干杯:D
我想测试计数(按技术人员分组后,numberOfTasksByTechnician)是否高于平均水平,以实现技术人员任务的良好平衡(每个技术人员必须完成相同数量的任务),我如何获得平均值(硬编码值 4)
Constraint technicianCharge(ConstraintFactory constraintFactory) {
return constraintFactory.from(Task.class)
.groupBy(
Task::getTechnician, ConstraintCollectors.countDistinct()
)
.filter((technician, count)-> {
return count > 4; // return count > (?average)
})
.penalize("technicianCharge", HardSoftScore.ONE_SOFT);
}
目前,要收集平均值,您需要编写自定义约束收集器。这并不难,查看 count() implementation 寻找灵感。当您拥有约束收集器时,您的约束流将如下所示:
Constraint technicianCharge(ConstraintFactory constraintFactory) {
return constraintFactory.from(Task.class)
.groupBy(
Task::getTechnician,
ConstraintCollectors.countDistinct(),
MyConstraintCollectors.average(task -> ...)
)
.filter((technician, count, average)-> {
return count > average;
})
.penalize("technicianCharge",
HardSoftScore.ONE_SOFT,
(technician, count, average) -> count - average);
}
以后我们可能会提供平均约束收集器out-of-the-box。
作为脚注,既然您提到了公平,您可能希望在 OptaPlanner load balancing and fairness 上查看我们的博客。
从 OptaPlanner 8.11 开始。0.Final,'average' 开箱即用。
https://www.optaplanner.org/blog/2021/08/19/ConstraintStreamsSomeMoreLove.html
干杯:D