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。
我正在使用 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。