2014-05-20 37 views
0

在車輛路徑問題中,我想消除每個客戶必須服務的限制,但是爲服務的人添加獎勵。optaplanner:修改車輛路線以使客戶不被服務

我想爲每個客戶c_i添加一個虛擬車輛v_i,以便v_i只能爲客戶c_i提供服務,並且在發生這種情況時意味着不會爲客戶提供服務。因此,當有N個客戶時,有M個真實車輛加上N個虛擬車輛。

我的疑問是:如何設置Customer類的valueRangeProviderRefs以避免客戶端c_j由車輛v_i服務,也就是說,如果重新使用靜態列表,我可以使「vehicleRange」取決於特定的客戶車輛?

回答

0

這稱爲過度約束規劃。從技術上講,@PlanningVariable(nullable=true)應該允許這樣做,但OptaPlanner 6.0(和6.1目前太)不支持nullablechained變量尚未...

解決方法:創建1個虛擬Vehicle,這是在所有的評分規則忽略並添加評分規則來獎勵任何由非虛擬車輛提供服務的客戶。

+0

謝謝你的回答。 我已經嘗試過nullable = true,實際上它會是最好的解決方案...(讓previousStand == null爲未提供服務的客戶)。 我還想到了創建虛擬車輛v_d的解決方法,但我認爲,即使我可以編寫不考慮v_d服務的客戶的規則,該算法仍會嘗試優化v_d下的客戶鏈,即浪費計算資源。我錯了嗎? – user1403546

+0

在您的PDF指南(第70頁),我發現這個例子 @ValueRangeProvider(ID = 「possibleRoomRange」) 公開名單 getPossibleRoomList(){ 回報getCourse()getTeacher()getPossibleRoomList()。 } 它似乎規劃變量可以被限制在一個範圍取決於其規劃實體,對吧?如果是這樣,這將阻止優化器通過優化沒有服務的客戶來浪費時間。 – user1403546

+0

在v_d下優化鏈確實是一些計算資源的浪費,但我現在仍然建議這種方法。爲了避免這種浪費,你總是可以在移動選擇器上添加一個過濾器來忽略這樣的移動......隨意創建一個鏈接和nullable = true的jira也應該一起工作(這雖然有一些含義)。 –