2014-12-04 40 views
1

我正在使用OptaPlanner進行業務相關優化。Optaplanner - 時間窗未填滿

關於6.1.0。最終版本:當我修改優化問題時,車輛必須在時間窗口內到達(儘可能最早和最近的可能到達時間,過早或過晚都會受到嚴格的處罰),而當我只帶一輛車時兩個客戶,其中時間窗1比時間窗2早得多(時間窗1結束+到客戶2的旅行時間<時間窗2的開始),則車輛在最早時間與時間窗1相遇,但到達客戶2太早。

example

的車輛(2363)從貯庫270第一客戶13開始(時間窗是8:50-10:50),並在8:50恰好到達。工作時間有75分鐘。出發時間爲10:05,車輛在10:12到達客戶16(時間窗口爲15:45-17:45)。 在一些商業案例中,最好等到時間過早。

我該如何強制車輛等待,以便它及時到達下一個客戶的位置?

PS:圓圈顯示可能到達時間的時間窗口(內圈:0-12h,外圈:12-24h)。時間和地點之間的距離由GraphHopper確定

回答

1

因此,您希望等待前一個停頓(=以前的客戶或倉庫)而不是當前客戶?

在OptaPlanner VRP示例中,departureTime = arrivalTime + duration。所以arrivalTime是一個影子變量(基於previousStandstill),而departureTime只是一個計算(因此departureTime本身不是影子變量,因爲它甚至不是一個字段(或者換句話說,因爲它不是一個Java變量,它不能是規劃變量(正版或影子))

在你的變型,使departureTime影子變量太多,定義如下:。departureTime = Math.max((arrivalTime + duration), nextCustomer.readyTime - drivingTime)這種新的陰影變量(和爲此它VariableListener)取決於規劃變量arrivalTimenextCustomer 。因此,陰影變量取決於陰影變量。 請注意,此提案中沒有循環:使用nextCustomer.readyTime,但readyTime是一個問題。

爲此,您可能需要升級到6.2.0.CR2或更高版本,因爲6.1可能尚不支持依賴影子變量的影子變量(我不記得了)。我也擔心optaplanner不會自動地重新排列變量監聽器的觸發器,但還沒有遵循層次結構(隨便做一個jira),所以這意味着你必須聲明具有變量監聽器的getter,如下所示:previousStandstill,nextCustomer, arrivalTime,departureTime。

VariableListener觸發順序將在未來的版本中形式化。

+0

Optaplanner 6.2.0中的「帶時間窗的車輛路線」示例是否對當前客戶實施了等待時間?我用3個客戶(8-9小時,12-13小時,16-17小時)修改過的XML輸入文件測試了它。工作時間總是30分鐘。早上8點剛剛完成第一項活動。在另外兩次活動中,車輛過早抵達。我看不到車輛正在等待當前客戶。 – mrz 2015-05-20 09:28:10

+0

它有一個serviceDuration,請參閱導入txt文件。但serviceDuration完成後,車輛將離開下一位客戶。如果它到達下一位客戶的時間太早,它會在那裏等待,直到客戶窗口打開,然後停留在此處以獲取serviceDuration。 – 2015-05-21 09:26:32