Optaplanner FieldAccessingSolutionCloner:如何模拟外化旅行时间矩阵?
Optaplanner FieldAccessingSolutionCloner: How to model an externalized traveltime matrix?
在 vehicle-routing 或 TSP 问题的上下文中:假设我们想要将两个位置之间的旅行时间外部化为成本矩阵问题事实。
我们可以将 GeoLocation-class 的 distanceTo
方法重写为对矩阵中值的简单查找。但要做到这一点,我们需要在 GeoLocation 实例中存储矩阵实例的引用。
这对 cloning of the solution 和相关规划实体有什么影响?矩阵是否会被深度克隆/不同的规划实体是否会在规划期间指向不同的矩阵实例?当然,这应该避免,因为矩阵在规划和深度克隆期间不会改变,这可能会导致性能下降。相反,每个 GeoLocation 的矩阵引用应指向内存中的相同矩阵对象。
FieldAccessingSolutionCloner
处理得当还是我们需要提供我们自己的 SolutionCloner
?
SolutionCloner 执行规划克隆,它不会克隆问题事实,除非问题事实引用规划解决方案或规划实体。
您的 class 模型应该设计为无需计划克隆您的距离矩阵。
optaplanner-examples 中的 VRP 示例没有克隆它的距离矩阵(Location 实例没有计划克隆)。
重要的是要了解,任何直接或间接引用规划实体或规划解决方案的东西都必须是规划克隆的,否则对工作解决方案的更改会影响最佳解决方案,从而破坏它。
在 vehicle-routing 或 TSP 问题的上下文中:假设我们想要将两个位置之间的旅行时间外部化为成本矩阵问题事实。
我们可以将 GeoLocation-class 的 distanceTo
方法重写为对矩阵中值的简单查找。但要做到这一点,我们需要在 GeoLocation 实例中存储矩阵实例的引用。
这对 cloning of the solution 和相关规划实体有什么影响?矩阵是否会被深度克隆/不同的规划实体是否会在规划期间指向不同的矩阵实例?当然,这应该避免,因为矩阵在规划和深度克隆期间不会改变,这可能会导致性能下降。相反,每个 GeoLocation 的矩阵引用应指向内存中的相同矩阵对象。
FieldAccessingSolutionCloner
处理得当还是我们需要提供我们自己的 SolutionCloner
?
SolutionCloner 执行规划克隆,它不会克隆问题事实,除非问题事实引用规划解决方案或规划实体。 您的 class 模型应该设计为无需计划克隆您的距离矩阵。
optaplanner-examples 中的 VRP 示例没有克隆它的距离矩阵(Location 实例没有计划克隆)。
重要的是要了解,任何直接或间接引用规划实体或规划解决方案的东西都必须是规划克隆的,否则对工作解决方案的更改会影响最佳解决方案,从而破坏它。