Optaplanner 7 ConstraintStream 根据每个实例的函数值进行奖励

Optaplanner 7 ConstraintStream reward according to value from function per instance

我正在使用 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 returns 优先级为 3,则软分数将按配置权重的 3 倍奖励。

我认为我的要求没有那么复杂,所以我认为可能有办法做到这一点。

有什么想法吗?

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

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

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

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