В Drools, что значит сравнивать идентификаторы

Теперь я понимаю основы написания правил слюни, но не могу понять, что в примерах, которые я видел (optaplanner), есть сравнения идентификаторов. Это необходимо? Почему это там?

// 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: Lecture()
$b: Lecture()

с двумя фактами лекции 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).

Учитывая 2 королевы A и B, сравнение идентификаторов в ограничении "нет 2 королев на одном горизонтальном ряду" гарантирует, что мы сопоставляем только AB, а не BA, AA и BB.

Тот же принцип для лекций.

Другие вопросы по тегам