我正在使用optaplanner解决计划问题。出于专有原因,我使用类比来问问题,而不是发布实际问题
我需要根据一些限制为不同的人分配书籍。这是我 建模 问题的方式:
角色-问题事实 [行政,主管等]
人员-问题事实 [列出不同的人员,每个人员都分配了角色]
书-问题事实和计划变量。它具有 bookCode 和 bookStatus 属性。
BookAssignment-计划实体。它有书和人对象。
每本书都有某种逻辑状态(新的,二手的)。每本书的状态都会根据一些历史记录初始化为新书/二手书。书籍分配取决于我在drools文件中处理的书籍的状态。要求之一是应将新书分配给特定角色,在分配后,在计划过程中将书的状态从新书更改为已使用书。
例如,规则是:角色=执行官获取新书,所有其他角色获取旧书 可以说我有3本书:books1 =新书,book2 =新书,book3 =旧书
在计划过程中,当计划者将“ book1”分配给角色为“执行”的人员时,在分配之后,book1的状态应更改为“已使用”。对于下一次分配给具有执行角色的其他人员,由于使用了book1的状态,因此无法使用book1。
我需要在计划期间更新计划变量(Book)的属性(bookStatus)。如何使用optaplanner实现此功能?
我阅读了有关阴影变量的信息,但它不适合我的模型。
非常感谢您的帮助!
答案 0 :(得分:0)
FWIW只是在这里关闭循环。我希望它能帮助对optaplanner和流口水也陌生的其他人:)
我以另一种方式details here解决了这个问题
我的用例只需要使用具有新状态的'book1',所以我在使用累计功能的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