2017-04-10 48 views
0

我試圖實現車輛路線示例的一個變體,而不是客戶,我有「拾起」和「脫落」。我的硬約束是:處理鏈式規劃變量中的多個移動

  • 每個相關聯的拾取/落對必須由同一車輛進行(例如,如果車輛的拿起一個項目,該項目不會被車輛B脫落)。
  • 必須在關聯關閉之前進行拾取(例如,除非您已經拿起它,否則不能丟棄任何東西)。
  • 車輛不能超過其最大載客量。

除了這些嚴格的約束,我的解決方案非常類似於車輛路線示例,其中每輛車都有一系列位置(PickUp或DropOff)。

我遇到的問題是,使用默認移動它不能輕易地將PickUp和DropOff移動到不同的車輛。例如,在一個無效的狀態下改變移動的結果,因此將被拒絕:

Change move results in invalid state

要正確地完成移動,我需要做一個額外的移動,使得送機屬於同一鏈作爲皮卡:

Second change move fixes the state

感覺就像正確的事情做是實施某種複合移動的它同時執行兩項舉措,但是我不知道的接近最好的辦法。以前有沒有人遇到類似的問題?

回答

0

我以前見過用戶這樣做。 optaplanner示例本身還沒有VRPPD示例(PD代表拾取和發送),因此您不能複製粘貼。

重用合成物遷移,看到它的靜態方法來建立一個。

什麼通常工作:建立一個自定義MoveListFactory(後來它重構爲一個MoveIteratorFactory向外擴展),並讓它產生CompositeMove「的ChainedChangeMove和/或ChainedSwapMove秒。

+0

謝謝傑弗裏,我會試試看。我也試過使用CartesianProductMoveSelector來創建CompositeMoves。然而,我總是處於一種環狀的環境中,這樣在得分過程中會導致我無限循環。你知道爲什麼會發生這種情況嗎? – DeadPassive

+0

嗨,傑弗裏。你知道創建ChainedChangeMoves的最佳方式是什麼嗎?構造函數需要一個GenuineVariableDescriptor和一個SingletonInverseVariableSupply,但我無法通過MoveListFactory訪問這些。 – DeadPassive