1 回答

TA貢獻1799條經驗 獲得超8個贊
在類方面,您需要計劃克隆具有或繼承@PlanningEntity
(無論它是真實實體還是影子實體)或@PlanningSolution
類注釋的類的每個實例。目標是在工作解決方案發(fā)生變化時記住最佳解決方案的狀態(tài)。通常所有其他類不需要正常計劃克隆(但也有例外)。
所以在 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 生成自定義克隆器。
添加回答
舉報