如何在 JSprit 中使用具有自身成本矩阵的车辆类型
Posted
技术标签:
【中文标题】如何在 JSprit 中使用具有自身成本矩阵的车辆类型【英文标题】:How to use vehicle types with own cost matrix in JSprit 【发布时间】:2016-04-26 08:47:06 【问题描述】:是否可以在 Jsprit 中为每种车辆类型定义单独的成本矩阵?我有许多非常不同的车辆类型(卡车、自行车、汽车、电动皮卡等),每种类型都有自己的成本矩阵。这些矩阵不是线性相关的,因此对于距离和时间使用不同的成本因素不是一种选择。 VRP 的舰队规模是无限的。
我使用 JSprit 1.6.2 并实现了AbstractForwardVehicleRoutingTransportCosts-接口。它的两个方法都有一个车辆参数,我用它来选择正确的矩阵,但传递的值始终为 null,随后会引发 NullPointerException。任何想法为什么这种方法不起作用以及如何让它起作用?
提前致谢!
【问题讨论】:
我很想知道为什么成本矩阵不是线性相关的?这是因为您的车辆有某种不同的访问限制,例如自行车穿过护柱,或类似不同的最高速度? 完全正确。不同的运输方式可能在相同的两个地点之间有完全不同的路线。此外,在许多情况下,例如由于访问重构(例如最大重量或高度超过某个阈值),卡车甚至无法服务于某种关系。 【参考方案1】:问题似乎类似于邮件列表中的帖子:Vehicle dependent velocities in Jsprit。以下是 Stefan 在该帖子中的回答:
您需要实现自己的 VehicleRoutingTransportCosts。在这里,您需要区分车辆类型。例如,如果您有两个行程时间矩阵 motorbikeMatrix 和 truckMatrix,那么您在实现中指定如果车辆是摩托车类型,则应该使用 motorbikeMatrix。
我想你已经有了那些依赖于车辆类型的成本矩阵,你的问题是在 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;
....
【讨论】:
这正是我的实现正在做的事情。问题是,这行 vehicle.getType().getTypeId().equals("motorbike") 会抛出 NullPointerException,因为车辆参数是 null。你能想出为什么会出现这种情况的原因吗? @Jan:是的,您需要在 getTransportCost() 方法中处理车辆 == null 的情况。您可以查看 com.graphhopper.jsprit.core.util 包中的任何运输成本计算器,例如 CrowFlyCosts、FastVehicleRoutingTransportCostsMatrix 等。他们都处理了车辆 == null 的情况,在这种情况下他们只是使成本 = 距离。请注意,在他们的情况下,距离不取决于车辆类型,但在您的情况下取决于车辆类型。我想你能做的是在这种情况下使用一些默认的车辆类型。至于为什么vehicle可以为null,请看下一条评论。 @Jan:vehicle 可以为null,因为该方法在算法中被称为vehicle = null。例如,github.com/graphhopper/jsprit/blob/master/jsprit-core/src/main/…、github.com/graphhopper/jsprit/blob/master/jsprit-core/src/main/… 和 github.com/graphhopper/jsprit/blob/master/jsprit-core/src/main/…。 谢谢黄鹤以上是关于如何在 JSprit 中使用具有自身成本矩阵的车辆类型的主要内容,如果未能解决你的问题,请参考以下文章