首页 > 解决方案 > 过滤器阻止分配事实

问题描述

我使用 OptaPlanner 安排考试。关于规划的一切都很好。

但是:要部分固定考试(修复房间或时间段,但不能同时修复),我使用了 Selection-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>

标签: optaplanner

解决方案


半固定(半固定)规划实体尚不支持开箱即用。为这个问题投票。

解决方法

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

推荐阅读