为了账号安全,请及时绑定邮箱和手机立即绑定

克隆链式规划实体

克隆链式规划实体

跃然一笑 2023-04-26 17:07:36
我正在为 vrp 问题实施自定义克隆器。该文档概述了以下内容:使用链接变量克隆实体是不正当的:实体 A 的变量可能指向另一个实体 B。如果 A 被克隆,那么它的变量必须指向 B 的克隆,而不是原始 B。因此,如果我们要克隆一个Customer带有计划变量的变量,previousStandstill我们需要执行以下操作: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);但是,上面的示例不起作用,因为克隆的解决方案不再相同。有关如何安全克隆链式规划实体的任何指示?我需要深度克隆它的规划变量吗?以及如何处理影子变量?这些是否也需要深度克隆?
查看完整描述

1 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

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

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

然后考虑到关系的两个陷阱:

  • 不要计划将同一个实例克隆两次。因此,如果您计划克隆 A - 并且 B 和 C 都指向它 - 那么之后 B' 和 C' 应该都指向同一个 A'。不能有 A' 和 A''。例如:A、B、C 是 Customer 的一个实例,那么如果 B.previous = A 和 C.next = A,则 B'.previous = A' 和 C'.next = A'。

  • 计划克隆绝不能指向原始工作解决方案的实例,该实例必须是计划克隆的类。所以你不能留下一个Customer C'.next = A,它必须也是A'。

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

也就是说,不要进行自定义计划克隆@DeepPlanningClone如果您出于正确性而这样做,请使用。如果您是为了提高性能或 Graal,请等待 OptaPlanner-Kogito 生成自定义克隆器。


查看完整回答
反对 回复 2023-04-26
  • 1 回答
  • 0 关注
  • 88 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信