如何在 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 中使用具有自身成本矩阵的车辆类型的主要内容,如果未能解决你的问题,请参考以下文章

对 VehicleRoutingTransportCosts 的不必要的运输距离/时间查询

JSprit:剩余车辆时未分配的工作

JSprit:如何最大化可用车辆数量以减少时间

jsprit如何将取件添加到车辆

限制车辆数量 JSPRIT

jsprit如何将货物添加到指定车辆