Optaplanner - 具有相同 blockId 的多个计划实体 - 如何"move all"或"chain"或"shadow"到同一个计划变量?



我正在尝试将时隙分配给planningEntity(包含由约束流处理的房间、组和人员(。

其中一些规划实体具有blockId。当实体具有blockId时,目标是与具有相同blockId的其他实体共享时隙。

我为此定义了一个约束,但我可以看到解算器执行了大量不必要的移动。

public Constraint groupBlockConstraint(ConstraintFactory constraintFactory){
return constraintFactory.forEachUniquePair(Lesson.class,
Joiners.equal(Lesson::getSequenceGroup),
Joiners.filtering((a, b) ->
!Lesson.withoutBlock(a, b)
&& !Lesson.sameTimeslot(a,b)))
.penalize("BlockSequence not in same timeslot", HardSoftScore.ofHard(15));
}

有没有办法更有效地处理这个问题?

约束不会决定解算器将尝试哪些移动。约束仅用于对已执行移动后获得的解决方案进行评分。

因此,如果你看到了你认为不应该执行的动作,你需要配置你的选择器。使用禁忌搜索可能也有帮助。

也就是说,如果没有一个更详细的问题,我就无法提供一个不那么笼统的答案。

最新更新