Optaplanner 7 ConstraintStream奖励根据每个实例的功能值

时间:2020-05-28 10:12:20

标签: constraints optaplanner

我正在使用Optaplanner 7.37计划日程表,并且正在实施积极的软约束,以便优先安排优先级更高的任务。我想进行增量计分,根据优先级值进行奖励。

我已经尝试了以下方法,但是如您所见,它只会为计划的每个任务添加一个软评分单位(因此它不会根据任务的优先级而变化。

private Constraint scheduleHighPriorityTasks(ConstraintFactory factory) {
    return factory.from(ShiftAssignment.class)
            .reward('High priority work done', HardSoftScore.ONE_SOFT);
}

我想要大致像这样的虚构代码:

private Constraint scheduleHighPriorityTasks(ConstraintFactory factory) {
    return factory.from(ShiftAssignment.class)
            .multiply(ShiftAssignment::getTaskPriority)
            .reward('High priority work done', HardSoftScore.ONE_SOFT);
}

如果getTaskPriority返回的优先级为3,则软得分将获得配置的权重的3倍奖励。

我认为我的要求没有那么复杂,所以我认为可能有一种方法可以实现。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如果没有其他软约束,则可以使用接受matchWeigher的重载奖励方法:

private Constraint scheduleHighPriorityTasks(ConstraintFactory factory) {
    return factory.from(ShiftAssignment.class)
            .reward('High priority work done', HardSoftScore.ONE_SOFT, ShiftAssignment::getTaskPriority);
}

如果还有其他软约束,但这总是更重要的,那么这不是软约束,而是中等约束(并且没有其他中等约束)。

如果还有其他软约束可以超过或不超过此优先级约束,则它会变得更加复杂。在这种情况下,我可能会使用getTaskPrioritySoftWeight而不是getTaskPriority。