gpt4 book ai didi

java - 克隆链式规划实体

转载 作者:行者123 更新时间:2023-12-02 09:39:06 26 4
gpt4 key购买 nike

我正在为 vrp 问题实现一个自定义克隆器。

文档概述如下:

Cloning an entity with a chained variable is devious: a variable of an entity A might point to another entity B. If A is cloned, then its variable must point to the clone of B, not the original B.

因此,如果我们使用计划变量 previousStandstill 克隆 Customer,我们需要执行以下操作:


public Customer safeClone() {
Customer clonedCustomer = new Customer(<CONSTRUCTOR_ARGS>);
if (previousStandstill != null) {
if (previousStandstill instanceof Vehicle) {
clonedCustomer.setPreviousStandstill( ((Vehicle)previousStandstill).safeClone();
} else if (previousStandstill instanceof Customer) {
clonedCustomer.setPreviousStandstill( ((Customer)previousStandstill).safeClone();
}
}
// What to do with shadow variables ?
return clonedCustomer;

}

Vehicle.safeClone()

Vehicle clonedVehicle = new Vehicle(<CONSTRUCTOR_ARGS>);
// clone shadow variables ?
clonedVehicle.setNextCustomer(customer.safeClone);

但是,上面的示例不起作用,因为克隆的解决方案不再相同。有关如何安全克隆链式规划实体的任何指示?我需要深度克隆其计划变量吗?那么如何处理影子变量呢?这些也需要深度克隆吗?

最佳答案

就类而言,您需要计划克隆具有或继承 @PlanningEntity 的类的每个实例。 (无论它是真实实体还是影子实体)或 @PlanningSolution类注释。目标是在工作解决方案发生变化时记住最佳解决方案的状态。通常所有其他类不需要正常计划克隆(但也有异常(exception))。

因此,在 VRP 中,这意味着规划克隆 VehicleRoutingSolution、Standstill、Vehicle 和 Customer。但不是 Depot 或 Location。

然后考虑关系的 2 个陷阱:

  • 不要计划克隆同一实例两次。因此,如果您计划克隆 A - 并且 B 和 C 都指向它 - 那么之后 B' 和 C' 应该都指向同一个 A'。不可能有 A' 和 A''。例如:A、B、C 是 Customer 的实例,因此如果 B.previous = A 且 C.next = A,则 B'.previous = A' 且 C'.next = A'。
  • 计划克隆绝不能指向原始工作解决方案的实例,即必须计划克隆的类的实例。所以你不能留下客户 C'。下一个 = A,它也必须是 A'。

验证这些陷阱的最佳方法是在克隆器末尾放置一个断点,并比较每个客户、车辆等的工作解决方案与其规划克隆之间的内存地址号。IntelliJ 将内存地址显示为灰色在调试停靠栏的变量窗口中。

话虽这么说,不要进行自定义规划克隆。使用@DeepPlanningClone如果你这样做是因为正确性。如果您是为了性能或 Graal 的目的,请等待 OptaPlanner-Kogito 生成自定义克隆器。

关于java - 克隆链式规划实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57248533/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com