簡體   English   中英

在 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() 實現以獲取靈感。 當您擁有約束收集器時,您的約束流將如下所示:

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);
}

將來,我們可能會提供開箱即用的平均約束收集器。

作為腳注,既然您提到了公平性,您可能希望查看我們關於OptaPlanner 負載平衡和公平性的博客。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM