在规划期间更新规划变量的 属性

update planning variable's property during planning

我正在使用 optaplanner 来解决调度问题。出于专有原因,我使用类比来提出问题而不是发布实际问题

我需要根据某些限制将书籍分配给不同的人。这是我建模问题的方式:

角色 - 问题事实 [主管、主管等]

Person - ProblemFact [不同人员的列表,每个人都分配了一个角色]

书籍 - 问题事实和计划变量。它有 bookCodebookStatus 属性。

BookAssignment - 规划实体。它有书和人对象。

每本书都有一些合乎逻辑的状态(新的,用过的)。每本书的状态都根据一些历史初始化为 new/used。书籍分配取决于我在 drools 文件中处理的书籍的状态。其中一个要求是,一本新书应该被分配到某个角色,分配后在计划期间,书的状态应该从新变为已用​​。

例如规则是:角色 = 行政人员获得新书,所有其他角色获得旧书 假设我有 3 本书:books1 = new,book2 = new,book3 = used

在计划期间,当计划者将 'book1' 分配给角色 = 'executive' 的人时,此分配后 book1 状态应更改为 "used"。对于下一个分配给另一个具有执行角色的人,不能使用 book1,因为它的状态已使用。

我需要在规划过程中更新规划变量 (Book) 的 属性(bookStatus)。我如何使用 optaplanner 实现此功能?

我读到了影子变量,但它不适合我的模型。

非常感谢您的帮助!

FWIW 只是在这里关闭循环。我希望它能帮助那些对 optaplanner 和 drools 不熟悉的人:)

我用不同的方式解决了这个问题details here

我的用例只需要使用 'book1' 新状态一次,所以我在使用 accumulate 函数的 drools 文件中实施了硬约束。

rule "Every new book is used once" when $total: Number(this > 1) from accumulate ( BookAssignment(book != null , book.status == BookStatusEnum.NEW), sum(1)) then scoreHolder.addHardConstraintMatch(kcontext, -10); end