在 Drools 中,比较 ID 是什么意思

In Drools, what does it mean to compare IDs

我现在了解了编写 drools 规则的基础知识,但在我看到的示例 (optaplanner) 中,我似乎无法理解,其中有 ID 的比较。这是必要的吗?它为什么在那里?

// RoomOccupancy: Two lectures in the same room at the same period.
// Any extra lecture in the same period and room counts as one more violation.
rule "roomOccupancy"
    when
        Lecture($leftId : id, period != null, $period : period, room != null, $room : room)
        // $leftLecture has lowest id of the period+room combo
        not Lecture(period == $period, room == $room, id < $leftId)
        // rightLecture has the same period
        Lecture(period == $period, room == $room, id > $leftId, $rightId : id)
    then
        scoreHolder.addHardConstraintMatch(kcontext, -1);
end

根据我的理解,删除带有 not Lecture(.. 的行并保留 Lecture(period == $period, room == $room) 应该可以解决问题。我的理解是否正确,还是我遗漏了一些用例?

给定 2 个皇后 A 和 B,"no 2 queens on the same horizontal row" 约束中的 id 比较确保我们只匹配 A-B 而不是 B-A、A-A 和 B-B。

讲课同理。

你应该明白像

这样的模式
$a: Lecture()
$b: Lecture()

系统中有两个 Lecture facts A 和 B 将产生以下匹配和触发:

$a-A, $b-B   (1)
$a-B, $b-A   (2)
$a-A, $b-A
$a-B, $b-B

因此,为了减少不需要的组合,您需要有一种方法来确定没有相同的事实匹配(绑定到)$a 和 $b:

$a: Lecture( $ida: id )
$b: Lecture( $idb: id != $ida )

但是,使用不等于仍然会产生组合 (1) 和 (2)。