optaplanner - 过滤器阻止分配事实
问题描述
我使用 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>
解决方案
半固定(半固定)规划实体尚不支持开箱即用。为这个问题投票。
解决方法
- 以太不过滤它,只是添加一个硬约束来保持一个变量固定。这不是 100% 有效的,但它确实有效。
- 为 ConstructionHeuristic 和 LocalSearch 定制所有移动:不过滤时隙的 ChangeMoves,但在固定的房间实体上过滤房间的 changeMoves。过滤 changeMoves 的实体选择器,而不是移动选择器。对于 SwapMoves,它甚至更复杂,因为它们同时交换时间段和房间。这种方法工作量很大,需要维护。
推荐阅读
- java - 在 macOS Mojave 中无法识别 OpenJDK
- javascript - TypeError:tempItems.map 不是函数
- r - 在 R 中将语料库分成 N 个单词的块
- nginx - 如果未设置同意 Cookie,Nginx 将重定向到 Cookie 同意页面
- assembly - 为什么编译器在寄存器分配中构造图?
- c# - 动态按钮 c# 和 Asp.net 的问题
- powerapps - 如何使用powerapp在列表中显示仅显示一次的下拉值
- c# - 当我关闭并重新打开窗口时,WPF数据网格有时不显示数据
- apache-kafka - kafka 连接异常,复制因子:3 大于可用代理:1
- react-native - Native Base Tabs内容透明背景