From 70b0c325bfd26d2c231b70184175cc4b9dc22019 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期三, 19 十一月 2025 14:58:46 +0800
Subject: [PATCH] 最新版本541200007
---
server/visits/dmvisit_service/src/main/java/com/doumee/core/tsp/TspSolver.java | 48 +++++++++++++++++++++++++++++++++++++-----------
1 files changed, 37 insertions(+), 11 deletions(-)
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/tsp/TspSolver.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/tsp/TspSolver.java
index 8d4ccdc..2aa6bef 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/core/tsp/TspSolver.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/tsp/TspSolver.java
@@ -4,6 +4,8 @@
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.ortools.constraintsolver.mainJNI;
@@ -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+" ,");
}
--
Gitblit v1.9.3