关于在 optapy 中使用影子变量的说明

Clarification on using shadow variables in optapy

我正在尝试在 optapy 中使用影子变量,但我不确定我是否理解如何正确更新它们的值。 OptaPlanner 的文档建议更新影子变量,OptaPlanner 使用 VariableListener,但 optapy 似乎还不支持它们。我读错了吗,我不需要 VariableListener?

如果我使用 optapy 文档中的示例:

from optapy import planning_entity, planning_variable
from optapy.types import PlanningVariableGraphType

@planning_entity
class Customer:
    @planning_variable(object, graph_type = PlanningVariableGraphType.CHAINED, ...)
        def get_previous_standstill(self):
        return self.previous_standstill

        def set_previous_standstill(previous_standstill):
        ...

from optapy import planning_entity, inverse_relation_shadow_variable

@planning_entity
class Standstill:
    @inverse_relation_shadow_variable(Customer, source_variable_name ="previous_standstill")
    def get_next_customer(self):
        return self.next_customer

    def set_next_customer(Customer nextCustomer):
        ...

如何更新变量 next_customer?

目前不支持自定义影子变量(使用自定义 VariableListeners)(跟踪问题:https://github.com/optapy/optapy/issues/75),但支持内置影子变量(使用预定义 VariableListeners)。内建影子变量有:@inverse_relation_shadow_variable,当源变量取对象为值时更新;和 @anchor_shadow_variable 当源链接变量的链开始发生变化时更新。

在上面的示例中,如果我有一个停顿 standstill,那么每当 OptaPy 通过 customer.set_previous_standstill(standstill) 更新客户 customer 时,就会调用 standstill.set_next_customer(customer)