| | |
| | | import com.doumee.core.exception.BusinessException; |
| | | import com.google.ortools.Loader; |
| | | import com.google.ortools.constraintsolver.*; |
| | | import com.google.protobuf.Duration; |
| | | import com.google.protobuf.DurationOrBuilder; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import com.google.protobuf.Internal.IntListAdapter.IntConverter; |
| | | import com.google.ortools.constraintsolver.mainJNI; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | |
| | | RoutingModel routing = new RoutingModel(manager); |
| | | |
| | | // 注册回调函数 |
| | | final int transitCallbackIndex = |
| | | /* final int transitCallbackIndex = |
| | | routing.registerTransitCallback((long fromIndex, long toIndex) -> { |
| | | int fromNode = manager.indexToNode(fromIndex); |
| | | int toNode = manager.indexToNode(toIndex); |
| | |
| | | |
| | | // 定义回调函数至每条路线 |
| | | routing.setArcCostEvaluatorOfAllVehicles(transitCallbackIndex); |
| | | // 增加距离维度约束 |
| | | routing.addDimension(transitCallbackIndex, 0, 300000000, |
| | | routing.addDimension(transitCallbackIndex, 0, 30000000, |
| | | true, |
| | | "Distance"); |
| | | RoutingDimension distanceDimension = routing.getMutableDimension("Distance"); |
| | | distanceDimension.setGlobalSpanCostCoefficient(100); |
| | | // // 添加容量限制 |
| | | distanceDimension.setGlobalSpanCostCoefficient(100);*/ |
| | | // 注册回调函数 |
| | | final int transitCallbackIndex1 = |
| | | routing.registerTransitCallback((long fromIndex, long toIndex) -> { |
| | | return 1; |
| | | }); |
| | | for (int d = 0; d < data.vehicleMaxNodes.length; d++) { |
| | | // 增加距离维度约束 |
| | | routing.addDimension(transitCallbackIndex1, 0, data.vehicleMaxNodes[d], |
| | | true, |
| | | "customer_"+d); |
| | | RoutingDimension distanceDimension1 = routing.getMutableDimension("customer_"+d); |
| | | distanceDimension1.setGlobalSpanCostCoefficient(100); |
| | | } |
| | | // 添加容量限制 |
| | | final int demandCallbackIndex = routing.registerUnaryTransitCallback((long fromIndex) -> { |
| | | int fromNode = manager.indexToNode(fromIndex); |
| | | return data.demands[fromNode]; |
| | | }); |
| | | routing.addDimensionWithVehicleCapacity(demandCallbackIndex, 0, data.vehicleCapacities, true, "Capacity"); |
| | | // routing.addDimensionWithVehicleTransits() |
| | | Solver solver = routing.solver(); |
| | | |
| | | //设置搜索方法 |
| | | /* |
| | | // 添加容量限制 |
| | | final int demandCallbackIndex1 = routing.registerUnaryTransitCallback((long fromIndex) -> { |
| | | return 1; |
| | | }); |
| | | routing.addDimensionWithVehicleCapacity(demandCallbackIndex1, 0, data.vehicleMaxNodes, true, "Capacity"); |
| | | */ |
| | | |
| | | Solver solver = routing.solver(); |
| | | //设置搜索方法( |
| | | RoutingSearchParameters searchParameters = |
| | | main.defaultRoutingSearchParameters() |
| | | .toBuilder() |
| | | .setTimeLimit(Duration.newBuilder().setSeconds(60*60).build())//最久1小时 |
| | | .setFirstSolutionStrategy(FirstSolutionStrategy.Value.PATH_CHEAPEST_ARC) |
| | | .build(); |
| | | |
| | |
| | | public long[] demands; |
| | | //车辆最大容载 |
| | | public long[] vehicleCapacities ; |
| | | public long[] vehicleMaxNodes ; |
| | | public long[][] distanceMatrix ; |
| | | |
| | | public List<TspSolverSolutions> getSolutions() { |
| | |
| | | this.solutions = solutions; |
| | | } |
| | | |
| | | public void initDataInfo(int vehicleNumber1, long[] demands1, long[] vehicleCapacities1, long[][] distanceMatrix1){ |
| | | public void initDataInfo(int vehicleNumber1, long[] demands1, long[] vehicleCapacities1, long[][] distanceMatrix1,long[] vehicleMaxNodes){ |
| | | this.demands = demands1; |
| | | this.vehicleNumber = vehicleNumber1; |
| | | this.vehicleCapacities=vehicleCapacities1; |
| | | this.distanceMatrix=distanceMatrix1; |
| | | this.vehicleMaxNodes =vehicleMaxNodes; |
| | | } |
| | | public void initDataList(){ |
| | | lenght = 100; |
| | | vehicleNumber = 7; |
| | | lenght = 20; |
| | | vehicleNumber = 5; |
| | | demands = new long[lenght]; |
| | | vehicleCapacities =new long[vehicleNumber]; |
| | | vehicleMaxNodes =new long[vehicleNumber]; |
| | | distanceMatrix = new long[lenght][lenght]; |
| | | int total0 =0; |
| | | for (int i = 0; i <vehicleNumber ; i++) { |
| | | long tem = (long) (Math.random() * 1000 + 20000); |
| | | vehicleCapacities[i] = tem; |
| | | vehicleMaxNodes[i] =5; |
| | | total0+=tem; |
| | | System.out.print(tem+" ,"); |
| | | } |