在 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)。
我现在了解了编写 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)。