Search code examples
jsprit

How to use vehicle types with own cost matrix in JSprit


Is it possible to define a seperate cost matrix for every vehicle type in Jsprit? I have a number of very different vehicle types (trucks, bikes, cars, electrical pickups etc.) and every type has its own cost matrix. The matrices are not linearly dependent, therefore working with different cost factors for distance and time is not an option. The VRP has infinite fleet size.

I use JSprit 1.6.2 and implemented the AbstractForwardVehicleRoutingTransportCosts-Interface. Both of its methods have a vehicle parameter that I use to select the correct matrix, but the passed values are always null and subsequently a NullPointerException is thrown. Any ideas why this approach is not working and how I can get it to work?

Thanks in advance!


Solution

  • The problem seems similar to a post in the mailing list: Vehicle dependent velocities in Jsprit. Below is Stefan's answer in that post:

    You need to implement your own VehicleRoutingTransportCosts. Here you need to differentiate between vehicle types. For example, if you have two travel time matrices motorbikeMatrix and truckMatrix, then you specify in your implementation that motorbikeMatrix should be used if vehicle is of type motorbike.

    I suppose you already have those vehicle-type-dependent cost matrices, and your problem would be to call corresponding cost matrix in the VehicleRoutingTransportCosts class.

    Something like:

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

    Then in the MultiVehTypeCosts class, in

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

    and

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

    you have something like:

        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;
            ....
        }