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

问题描述 投票:0回答:1

我正在使用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倍于配置权重的奖励。

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

有什么想法吗?

constraints optaplanner
1个回答
1
投票

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

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

如果有其他软约束,但这是... 始终 更重要,那么这就不是一个软约束,而是一个中等约束(而且没有其他中等约束)。

如果还有其他的软约束可以超过或不超过这个优先级约束,那么就有点复杂了。在这种情况下,我可能会使用getTaskPrioritySoftWeight而不是getTaskPriority。

© www.soinside.com 2019 - 2024. All rights reserved.