【问题标题】:Optaplanner 7 ConstraintStream reward according to value from function per instanceOptaplanner 7 ConstraintStream 根据每个实例的函数值奖励
【发布时间】:2020-05-28 10:12:20
【问题描述】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      相关资源
      最近更新 更多