【问题标题】:OptaPlanner multiple entity classes with chained variablesOptaPlanner 具有链式变量的多个实体类
【发布时间】:2018-02-27 11:55:45
【问题描述】:

我正在使用 OptaPlanner 解决车辆路线问题的变体,其中车辆服务的客户要求差异很大。我有一些最常见的客户类型,并希望使用不同的实体类对它们进行建模。由于单个司机可以参加不同的类型,他们应该能够形成异构链,其中包含所有类的实例。

我尝试通过修改 VRP 示例来进行概念验证。我提取了ICustomer,这是我所有客户的接口,并更改了Standstill,以便getNextCustomer 返回ICustomer。 当我尝试使用实现 ICustomer 的 Customer 和 Customer2(客户类的副本)运行它时,我收到此错误:

Exception in thread "main" java.lang.IllegalArgumentException: The entityClass 
(interface org.optaplanner.examples.vehiclerouting.domain.Standstill) has a 
InverseRelationShadowVariable annotated property (nextCustomer) with a masterClass 
(interface org.optaplanner.examples.vehiclerouting.domain.ICustomer) which is not a 
valid planning entity.

在最坏的情况下,我将在单个计划实体中使用枚举和“ifs”对不同的客户类型进行建模,以获得相同的行为。不过,很高兴知道我是否遇到了 API 限制,或者有人知道实现此目的的更好方法。谢谢:)

【问题讨论】:

    标签: java optimization optaplanner


    【解决方案1】:

    OptaPlanner 完全支持多态性、类层次结构等。我们对其进行了测试(并且经常发现已解决的错误 - 直到最近的 7.3.final IIRC)。另请参见 TestDataSolution.java 等。当然,欢迎新的复制者作为 PR。

    这个例外讲述了一个不同的故事。检查您在哪里使用@InverseRelationShadowVariable,即该字段/方法的返回类型 - 我怀疑您的重构可能没有正确影响该代码。

    【讨论】:

    • 您对问题中的例外情况是正确的,这是因为我忘记在求解器配置中将 ICustomer 添加为计划实体。在这个和其他一些小细节之后,我能够让构造启发式工作。它会生成有效的链,并且每个客户的锚(车辆)都会正确更新。但是,车辆和客户的逆关系影子 getNext() 都不会更新。
    • (更多细节)我在 ICustomer 接口及其实现 Customer1 和 Customer2 中注释了真正的 PV(previousStandstill)。对面,@InverseRelationShadowVariable (getNext) 在 ICustomer 和 Standstill 接口中注释。我尝试在每个实现(客户 1 和客户 2)中将此注释添加到 getNext,但它没有帮助是否有可能具有 2 个实现的接口会以某种方式混淆影子变量更新器的触发,我的注释是否适合这种情况?任何进一步的指针都非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多