首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Optaplanner 7 ConstraintStream按每个实例的函数值奖励

Optaplanner 7 ConstraintStream按每个实例的函数值奖励
EN

Stack Overflow用户
提问于 2020-05-28 10:12:20
回答 1查看 149关注 0票数 0

我正在使用Optaplanner 7.37计划一个时间表,并且正在实现一个积极的软约束,这样就可以先安排更高优先级的任务。我想做增量分数的计算,这是根据优先值奖励。

我已经尝试过以下方法,但正如您所看到的,它只会在每个任务计划中添加一个软分数单位(因此它不会因任务的优先级而有所不同。

代码语言:javascript
复制
private Constraint scheduleHighPriorityTasks(ConstraintFactory factory) {
    return factory.from(ShiftAssignment.class)
            .reward('High priority work done', HardSoftScore.ONE_SOFT);
}

我想要的大概是这个虚构的代码:

代码语言:javascript
复制
private Constraint scheduleHighPriorityTasks(ConstraintFactory factory) {
    return factory.from(ShiftAssignment.class)
            .multiply(ShiftAssignment::getTaskPriority)
            .reward('High priority work done', HardSoftScore.ONE_SOFT);
}

这样,如果getTaskPriority返回优先级为3,则软分数将以配置权重的3倍作为奖励。

我不认为我的要求那么复杂,所以我认为可能有办法做到这一点。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-28 12:46:15

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

代码语言:javascript
复制
private Constraint scheduleHighPriorityTasks(ConstraintFactory factory) {
    return factory.from(ShiftAssignment.class)
            .reward('High priority work done', HardSoftScore.ONE_SOFT, ShiftAssignment::getTaskPriority);
}

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62062203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档