筛选器阻止分配事实



我使用OptaPlanner来安排考试。规划方面的一切都很好。

但是:为了部分固定检查(固定房间或时间段,但不能同时固定两者(,我使用了选择ChnageMove过滤器。如果指定了其中一个,则此操作有效。但是,如果两者都未初始化,则构建阶段始终只指定一个(房间(。过滤器设置为接受所有内容,因此不应该有任何影响。当启用跟踪日志记录时,我可以看到OptaPlanner建议移动(null->TimeGrain(,但最终,它从未选择其中一个移动,并导致-Xinit/0hard/0soft,因此本地搜索阶段无法启动。

我的配置可能有问题吗?或者我错过了OptaPlanner的特定行为?

相关类的摘录粘贴在下面。

考试类别:

@PlanningEntity()
public class Exam {
...

@PlanningVariable(valueRangeProviderRefs = "roomRange")
private Room room;
@ValueRangeProvider(id = "timeGrainRange")
private List<TimeGrain> availableTimeGrains;

过滤器类别:

public class PartiallyLockedExamChangeMoveFilter implements SelectionFilter<ExamTimetable, ChangeMove<ExamTimetable>> {
@Override
public boolean accept(ScoreDirector<ExamTimetable> scoreDirector, ChangeMove<ExamTimetable> selection) {
return true;
}
}

解算器配置:

<solver ...>
<constructionHeuristic>
<changeMoveSelector>
<filterClass>ch.package.PartiallyLockedExamChangeMoveFilter</filterClass>
</changeMoveSelector>
</constructionHeuristic>
...
</solver>

半固定(半不可移动(规划实体还不支持开箱即用。投票支持这个问题。

解决方案

  • 以太币不过滤它,只添加一个硬约束来固定一个变量。这不是100%的效率,但它是有效的
  • 为ConstructionHeuristic和LocalSearch定制所有移动:不过滤时隙的ChangeMoves,但在固定的房间实体上过滤房间的ChangeMoves。筛选changeMoves的实体选择器,而不是移动选择器。对于SwapMoves来说,这更为复杂,因为它们同时交换时隙和房间。这种方法工作量很大,需要维护

最新更新