在规划期间更新规划变量的 属性
update planning variable's property during planning
我正在使用 optaplanner 来解决调度问题。出于专有原因,我使用类比来提出问题而不是发布实际问题
我需要根据某些限制将书籍分配给不同的人。这是我建模问题的方式:
角色 - 问题事实 [主管、主管等]
Person - ProblemFact [不同人员的列表,每个人都分配了一个角色]
书籍 - 问题事实和计划变量。它有 bookCode 和 bookStatus 属性。
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
我正在使用 optaplanner 来解决调度问题。出于专有原因,我使用类比来提出问题而不是发布实际问题
我需要根据某些限制将书籍分配给不同的人。这是我建模问题的方式:
角色 - 问题事实 [主管、主管等]
Person - ProblemFact [不同人员的列表,每个人都分配了一个角色]
书籍 - 问题事实和计划变量。它有 bookCode 和 bookStatus 属性。
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