我正在使用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倍奖励。
我认为我的要求没有那么复杂,所以我认为可能有一种方法可以实现。
有什么想法吗?
答案 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。