2016-04-26 60 views
1

是否可以爲Jsprit中的每種車型定義單獨的成本矩陣?我有很多不同類型的車輛(卡車,自行車,汽車,電動皮卡等),每種類型都有自己的成本矩陣。這些矩陣不是線性相關的,因此,針對距離和時間使用不同的成本因素不是一種選擇。 VRP擁有無限的艦隊規模。如何在JSprit中使用具有自己的成本矩陣的車輛類型

我使用JSprit 1.6.2並實現了AbstractForwardVehicleRoutingTransportCosts -Interface。它的兩個方法都有一個車輛參數,用於選擇正確的矩陣,但傳遞的值始終爲空,隨後拋出NullPointerException。任何想法,爲什麼這種方法不工作,我怎樣才能使它工作?

提前致謝!

+0

我很想知道爲什麼成本矩陣不是線性相關的?這是因爲您的車輛具有某種不同的訪問限制,例如通過柱子的自行車,或不同的最高速度? – roganjosh

+0

這是絕對正確的。不同的交通方式可能在相同的兩個地點之間有完整的不同路線。此外,在很多情況下,例如,卡車由於通道重建而無法提供某種關係(例如最大重量或高度超過某個閾值)。 – Jan

回答

5

該問題與郵件列表中的帖子類似:Vehicle dependent velocities in Jsprit。下面是斯特凡在那篇文章中的回答:

你需要實現你自己的VehicleRoutingTransportCosts。在這裏你需要區分車型。例如,如果您有兩個旅行時間矩陣motorbikeMatrix和truckMatrix,則在您的實施中指定如果車輛是摩托車類型,則應使用摩托車矩陣。

我想你已經有了那些與車型相關的成本矩陣,你的問題將是在VehicleRoutingTransportCosts類中調用相應的成本矩陣。

喜歡的東西:

vrpBuilder.setRoutingCost(new MultiVehTypeCosts(vrpBuilder.getLocations(), motorbikeMatrix, truckMatrix, ...)); 

然後在MultiVehTypeCosts類,在

getTransportCost(Location from, Location to, double time, Driver driver, Vehicle vehicle) {} 

getTransportTime(Location from, Location to, double time, Driver driver, Vehicle vehicle) {} 

你有這樣的:

if (vehicle.getType().getTypeId().equals("motorbike")) { 
     double time = motorbikeMatrix[from.getIndex()][to.getIndex()][1]; 
     double distance = motorbikeMatrix[from.getIndex()][to.getIndex()][0]; 
     VehicleTypeImpl.VehicleCostParams costParams = vehicle.getType().getVehicleCostParams(); 
     double cost = costParams.perDistanceUnit * distance + costParams.perTimeUnit * time; 
     .... 
    } 
+0

這就是我的實現正在做的事情。問題是,這條線_vehicle.getType()。getTypeId()。equals(「摩托車」)_拋出一個NullPointerException,因爲車輛參數是_null_。你能否想到爲什麼會出現這種情況? – Jan

+1

@Jan:是的,您需要在getTransportCost()方法中處理案例vehicle == null。您可以檢查包com.graphhopper.jsprit.core.util中的任何運輸成本計算器,例如CrowFlyCosts,FastVehicleRoutingTransportCostsMatrix等等。它們都處理了case == null的情況,並且它們只是在這種情況下制定成本=距離。請注意,距離不取決於車輛類型,但它在您的情況。我猜你可以做的是在這種情況下使用某種默認的車輛類型。至於爲什麼車輛可以爲空,請參閱下一條評論。 –

+1

@Jan:車輛可以爲null,因爲該算法中的方法被稱爲vehicle = null。例如,https:// github。com/graphhopper/jsprit/blob/master/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/ruin/distance/AvgServiceAndShipmentDistance.java#L86,https://github.com/graphhopper/ jsprit/blob/master/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/DefaultScorer.java#L76和https://github.com/graphhopper/jsprit/blob/master/ jsprit核心/ src目錄/主/ JAVA/COM/graphhopper/jsprit /核心/算法/廢墟/ DBSCANClusterer.java#L86。 –

相關問題