doum
昨天 ba173949df6bf3f0a5a39e04e8265cd43c9cede4
server/visits/dmvisit_service/src/main/java/com/doumee/core/tsp/TspSolver.java
@@ -4,8 +4,10 @@
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;
@@ -85,7 +87,7 @@
        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);
@@ -94,25 +96,45 @@
        // 定义回调函数至每条路线
        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();
@@ -203,6 +225,7 @@
        public   long[] demands;
        //车辆最大容载
        public   long[] vehicleCapacities ;
        public   long[] vehicleMaxNodes ;
        public   long[][] distanceMatrix ;
       public List<TspSolverSolutions> getSolutions() {
@@ -213,22 +236,25 @@
           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+" ,");
            }