2016-10-27 128 views
0

首先,感謝那些對這個偉大的圖書館感興趣的人。OptaPlanner車輛路線 - 車輛時間窗口

我的約束是:

  • 我有一個已經準備好,並且由於時間的客戶。
  • 也有準備好和到期時間的車輛。

我沒有Java的經驗,我嘗試使用OptaPlanner通過使用提供的示例項目發送和接收xml。對於客戶時間窗口,我已經使用了「VrmTimeWindowedCustomer」,並且沒有問題。對於車輛時間窗約束,我嘗試使用「VrpTimeWindowedDepot」

我腦海裏想的是:當有車庫可用時(ReadyTime),車輛開始從該車庫工作並轉到客戶。然而,在我嘗試OptaPlanner沒有給出如下結果:我期待:

<depotList id="139"> 
    <VrpTimeWindowedDepot id="140"> 
     <id>1</id> 
     <location class="VrpRoadLocation" reference="3"/> 
     <readyTime>540000</readyTime> 
     <dueTime>1020000</dueTime> 
    </VrpTimeWindowedDepot> 
    <VrpTimeWindowedDepot id="141"> 
     <id>2</id> 
     <location class="VrpRoadLocation" reference="5"/> 
     <readyTime>540000</readyTime> 
     <dueTime>1020000</dueTime> 
    </VrpTimeWindowedDepot> 
    </depotList> 

結果是:

<VrpVehicle id="143"> 
     <id>1</id> 
     <capacity>100001002</capacity> 
     <depot class="VrpTimeWindowedDepot" reference="140"/> 
     <nextCustomer class="VrpTimeWindowedCustomer" id="144"> 
     <id>42</id> 
     <location class="VrpRoadLocation" reference="85"/> 
     <demand>206</demand> 
     <previousStandstill class="VrpVehicle" reference="143"/> 
     <nextCustomer class="VrpTimeWindowedCustomer" id="146"> 
      ... 
     <vehicle reference="143"/> 
     <readyTime>0</readyTime> 
     <dueTime>1440000</dueTime> 
     <serviceDuration>12000</serviceDuration> 
     <arrivalTime>22137</arrivalTime> 
     </nextCustomer> 
     <vehicle reference="143"/> 
     <readyTime>0</readyTime> 
     <dueTime>1440000</dueTime> 
     <serviceDuration>12000</serviceDuration> 
     <arrivalTime>8527</arrivalTime> 
    </nextCustomer> 
    </VrpVehicle> 

對客戶ArrivalTime是爲客戶確定,但比汽車的車廠ReadyTime小。

我找不到我在這裏做錯了什麼。 我已閱讀Optaplanner - availability of Vehicles和OptaPlanner文檔;但無法理解並弄清楚爲我的情況做些什麼。

我也無法理解drl文件的語法,也找不到解釋如何編寫它的文檔。

編輯 - 另一個問題傑弗裏·迪斯

傑弗裏·迪斯,非常感謝你對你的快速respose,這是非常讚賞。我已經嘗試過您的更改。根據倉庫的準備時間,到貨時間現在可以確定。然而,有可能是對Depot的duetime參數另一個問題:

<VrpTimeWindowedDepot id="144"> 
     <id>3</id> 
     <location class="VrpRoadLocation" reference="7"/> 
     <readyTime>540000</readyTime> 
     <dueTime>1020000</dueTime> 
    </VrpTimeWindowedDepot> 

最後一個客戶到會參觀從這個倉庫中的一個車輛:

<nextCustomer class="VrpTimeWindowedCustomer" id="183"> 
    <id>36</id> 
    <location class="VrpRoadLocation" reference="73"/> 
    <demand>187</demand> 
    <previousStandstill class="VrpTimeWindowedCustomer" reference="182"/> 
    <vehicle reference="146"/> 
    <readyTime>0</readyTime> 
    <dueTime>1440000</dueTime> 
    <serviceDuration>10000</serviceDuration> 
    <arrivalTime>1082091</arrivalTime> 
</nextCustomer> 

不應該到達時間少於102萬? (在3個車廠有3輛車,解決方案中只涉及2輛車,都有這樣的完成時間。)

我試圖添加這個作爲PLANNER-680 JIRA問題的評論,但我無法唱歌和登錄。我希望按照Stackoverflow的格式進行編輯。

回答

1

我記得在txt導入器(see this line)中與車輛/車廠的到期時間有關的示例中進行了一次黑客攻擊。這還沒有被清理,所以XML可以通過它。但這不是你的問題。

好像有在ArrivalTimeUpdatingVariableListener在這條線的錯誤:不採取vehicle.getDepot().getReadyTime()考慮

protected void updateArrivalTime(ScoreDirector scoreDirector, TimeWindowedCustomer sourceCustomer) { 
     Standstill previousStandstill = sourceCustomer.getPreviousStandstill(); 
     Long departureTime = (previousStandstill instanceof TimeWindowedCustomer) 
? ((TimeWindowedCustomer) previousStandstill).getDepartureTime() : null; 

+1

[Fixed for 7.0.0.Beta3](https://issues.jboss.org/browse/PLANNER-680) –

+0

哇這就是快:)您可以添加錯誤固定代碼;或者有什麼方法可以達到7.0.0.Beta3文件? – Koray

+0

請參閱jira問題中的鏈接。 –