有能力的车辆路线问题 - Google OR 工具

问题描述

我正在运行具有容量限制的 VRP。这是我的代码

        List<Order> orders =. getorders()
        final DataModel data = new DataModel();
        data.distanceMatrix = distanceMatrix.constructdistanceMatrix(orders);
        data.vehicleNumber = noOfVehicles;
        data.vehicleCapacities = new long[noOfVehicles];
        data.depot = 0;
        data.demands = new long[orders.size() + 1];
        capacityAndDemandMatrix.prefillCapacitiesAndDemands(data.demands,data.getVehicleCapacities(),orders);

        // Create Routing Index Manager
        RoutingIndexManager manager =
                new RoutingIndexManager(data.distanceMatrix.length,data.vehicleNumber,data.depot);

        // Create Routing Model.
        RoutingModel routing = new RoutingModel(manager);

        // Create and register a transit callback.
        final int transitCallbackIndex =
                routing.registerTransitCallback((long fromIndex,long toIndex) -> {
                    // Convert from routing variable Index to user NodeIndex.
                    int fromNode = manager.indexToNode(fromIndex);
                    int toNode = manager.indexToNode(toIndex);
                    return data.distanceMatrix[fromNode][toNode];
                });


        // Define cost of each arc.
        routing.setArcCostEvaluatorOfAllVehicles(transitCallbackIndex);

        // Add Capacity constraint.
        final int demandCallbackIndex = routing.registerUnaryTransitCallback((long fromIndex) -> {
            // Convert from routing variable Index to user NodeIndex.
            int fromNode = manager.indexToNode(fromIndex);
            return data.demands[fromNode];
        });

        routing.addDimensionWithVehicleCapacity(demandCallbackIndex,// null capacity slack
                                                data.vehicleCapacities,// vehicle maximum capacities
                                                true,// start cumul to zero
                                                "Capacity");

        // Setting first solution heuristic.
        RoutingSearchParameters searchParameters =
                main.defaultRoutingSearchParameters()
                        .toBuilder()
                        .setFirstSolutionStrategy(FirstSolutionStrategy.Value.PATH_CHEApest_ARC)
                        .setLocalSearchMetaheuristic(LocalSearchMetaheuristic.Value.GUIDED_LOCAL_SEARCH)
                        .setTimeLimit(Duration.newBuilder().setSeconds(25).build())
                        .build();

        // Solve the problem.
        Assignment solution = routing.solveWithParameters(searchParameters);

        // Print solution on console.
        return constructroutes(data,routing,manager,solution,orders);
  • I have a capacity limit for each vehicle.
  • I want the short distance for all vehicles.

算法按预期工作,为给定车辆提供整体最短路径。如果我提供更多数量的车辆无法完成的订单。它提供“无解决方案”。

例如,有 40 个订单和 2 辆车。每辆车只能承载10个订单。目前,算法在这种情况下没有给出任何解决方案。但我需要为 40 辆车中的 2 辆车映射 20 个订单的最佳解决方案。

是否可以更改 OR-Tools 代码中的某些内容,以便它可以留下很少的订单,但需要遵守容量限制并始终提供可能的最佳解决方案?

解决方法

您应该查看“处罚和删除访问”文档...

https://developers.google.com/optimization/routing/penalties