我正在使用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倍于配置权重的奖励。
我觉得我的要求没有那么复杂,所以我觉得可能有办法做到这一点。
有什么想法吗?
如果没有其他软约束,可以直接使用接受matchWeigher的重载奖励方法。
private Constraint scheduleHighPriorityTasks(ConstraintFactory factory) {
return factory.from(ShiftAssignment.class)
.reward('High priority work done', HardSoftScore.ONE_SOFT, ShiftAssignment::getTaskPriority);
}
如果有其他软约束,但这是... 始终 更重要,那么这就不是一个软约束,而是一个中等约束(而且没有其他中等约束)。
如果还有其他的软约束可以超过或不超过这个优先级约束,那么就有点复杂了。在这种情况下,我可能会使用getTaskPrioritySoftWeight而不是getTaskPriority。