Optaplanner 流口水,惩罚一个 1 个实体

Optaplanner drools, penalize one 1 entity

我使用 optaplanner 来创建包含不同课程的时间计划。 我需要帮助解决的一个重要规则是 minimizing/cut 每节课之间的停顿。 我基本上使用时间粒度模式,我需要一个规则来最小化两节课之间的时间粒度。

假设我有一个课程 A。我怎样才能找到之前最近的课程 B(在时间粒度上)?

我的临时解决方案是使用匹配课程 A 和同一天(且早于课程 A)的课程集合的规则。这似乎有效,但当我惩罚课程时,它也会惩罚集合中的所有课程。

所以我的下一个问题是: 基于匹配多个条目的规则匹配,我可以只惩罚其中一个吗? 这是我想要实现的示例:

rule "Horizontal conflict"
    when
        $queen1: Queen($id : id, row != null, $i : rowIndex)
        $queen2: Queen(id > $id, rowIndex == $i)
    then
        //scoreHolder.addConstraintMatch(kcontext, -1);
        only penalize $queen1
end
```

不知道你模型的细节,我假设 Lesson 有一个 startDate 时间粒度:

when
    Lesson($firstStart: startDate)
    Lesson($secondStart: startDate, startDate > $firstStart)
    not Lesson(start > $firstStart, start < $secondStart)
then
    // your penalty is $secondStart - $firstStart
end

您必须根据您的具体要求调整边界条件,但主要技巧是 not - 您正在寻找一对中间没有课程的课程。