Существует состояние в слюни - PullRequest
0 голосов
/ 13 марта 2020

Контекст - это список смен сотрудников в OptaPlanner с правилами Drools. Предположим, что у меня есть некоторые сдвиги, и что мне нужно проверить, есть ли какие-либо из сдвигов в списке предварительно определенных смен, которые нужно назначить. Последний список смен для назначения, скажем, [S1,S2,S3]; Мне нужно соответствовать следующему условию (я использую двоеточие как «такое, что»):

exists s in [S1,S2,S3] : forall shift (shift != s)

Как я могу реализовать такое правило в Drools?

Ответы [ 2 ]

0 голосов
/ 16 марта 2020

Я думаю, что вам нужно представить список смен, которым нужно присвоить [S1, S2, S3], как факт другого типа (ShiftToAssign):

Shift { // planning entity
  String id;
  LocalDateTime: time;
  Emploee employee;
}

ShiftToAssign { // planning fact
  String id;
}

Затем, вместо добавления / удаления элементов в заранее определенный список смен, которые вы можете назначить, вы просто добавляете их в @ProblemFactCollectionProperty. Они будут автоматически вставлены в рабочую память Drools, и вы сможете соответствовать своему состоянию следующим образом:

$s : ShiftToAssign     // equivalent to: for each Si in [S1, S2, S3]
not Shift(id == $s.id) // equivalent to: there is no Shift whose id is member of the list
0 голосов
/ 14 марта 2020

Следующий шаблон будет соответствовать, если Shift не является членом [S1, S2, S3].

not Shift( this memberOf [S1, S2, S3] )

Не уверен, что литерал списка [S1, S2, S3] совместим с Drools, но я предполагаю, что он будет быть чем-то динамичным c, которое будет вставлено в рабочую память как факт.

...