В 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.
Тот же принцип для лекций.