From 3a154bdb0a5aaa2c0ac3eac95a6ba747068bd454 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期二, 13 一月 2026 10:00:37 +0800
Subject: [PATCH] 优化

---
 server/visits/dmvisit_service/src/main/java/com/doumee/core/tsp/Clustering.java |   86 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 86 insertions(+), 0 deletions(-)

diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/tsp/Clustering.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/tsp/Clustering.java
new file mode 100644
index 0000000..0b1ca55
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/tsp/Clustering.java
@@ -0,0 +1,86 @@
+package com.doumee.core.tsp;
+
+/**
+ * 鑱氱被鍒嗙粍
+ */
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.admin.request.SketchCateModel;
+import com.doumee.dao.business.model.JkSketchCustomer;
+import com.doumee.service.business.impl.JkSketchServiceImpl;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Clustering {
+    public static  List<SketchCateModel>  clusterPoints(List<JkSketchCustomer> points, double threshold) {
+
+        List<SketchCateModel> clusters = new ArrayList<>();
+        boolean[] visited = new boolean[points.size()];
+        int index =0;
+        for (int i = 0; i < points.size(); i++) {
+            if (!visited[i]) {
+                List<JkSketchCustomer> cluster = new ArrayList<>();
+                dfs(points, visited, cluster, i, threshold);
+                SketchCateModel sketchCateModel = new SketchCateModel();
+                sketchCateModel.setCustomerList(cluster);
+                sketchCateModel.setId(index);
+                sketchCateModel.setStartPoint(cluster.get(0));
+                for (JkSketchCustomer c : cluster){
+                    sketchCateModel.setTotalNum(Constants.formatBigdecimal(sketchCateModel.getTotalNum()).add(Constants.formatBigdecimal(c.getTotalNum())));
+                }
+                sketchCateModel.setTotalCustomer(cluster.size());
+                clusters.add(sketchCateModel);
+            }
+        }
+        // 鎵撳嵃姣忎釜鑱氱被鐨勭偣
+        for (int i = 0; i < clusters.size(); i++) {
+            System.out.println("Cluster " + (i + 1) + ": " + clusters.get(i).getStartPoint().getName()+ ": " + clusters.get(i).getCustomerList().size());
+        }
+        return  clusters;
+    }
+    public static double distanceTo(JkSketchCustomer self, JkSketchCustomer other) {
+        // ====鏍囪==蹇界暐浜ら�氳鍒掕窛绂�=====
+        /*List<DistanceMapParam> distanceMapParamList  =JkSketchServiceImpl.getListFromJsonStr(self.getDistanceJson());
+        DistanceMapParam param = JkSketchServiceImpl.getParamByCustomerIds( other.getId(),distanceMapParamList);
+        if(param!=null && param.getDistance()!=0){//濡傛灉涔嬪墠宸茬粡鑾峰彇杩�
+          return (param.getDistance());
+        }*/
+        return DistanceCalculator.calculateDistance(Constants.formatBigdecimal(self.getLatitude()).doubleValue()
+                ,Constants.formatBigdecimal(self.getLongitude()).doubleValue()
+                ,Constants.formatBigdecimal(other.getLatitude()).doubleValue()
+                ,Constants.formatBigdecimal(other.getLongitude()).doubleValue());
+    }
+    private static void dfs(List<JkSketchCustomer> points, boolean[] visited, List<JkSketchCustomer> cluster, int startIndex, double threshold) {
+        visited[startIndex] = true;
+        cluster.add(points.get(startIndex));
+        JkSketchCustomer startPoint = points.get(startIndex);
+
+        for (int i = 0; i < points.size(); i++) {
+            if (!visited[i]) {
+                double distance = distanceTo(startPoint,points.get(i));
+                if (distance <= threshold) {
+                    dfs(points, visited, cluster, i, threshold); // 閫掑綊娣诲姞鍒拌仛绫讳腑
+                }
+            }
+        }
+    }
+
+    /**
+     * 117掳40鈥诧綖118掳44鈥层�佸寳绾�30掳19鈥诧綖31掳34鈥�
+     * @param args
+     */
+    public static void main(String[] args) {
+        List<JkSketchCustomer> points = new ArrayList<>();
+        for (int i = 0; i <3000; i++) {
+            JkSketchCustomer a = new JkSketchCustomer();
+            a.setLatitude(new BigDecimal(30.19d+(30.54d-30.19d)*Math.random()));
+            a.setLongitude(new BigDecimal(117.40+(117.74d-117.40d)*Math.random()));
+            a.setName("瀹㈡埛"+i);
+            points.add(a);
+        }
+
+        double threshold = 1000; // 璁剧疆璺濈闃堝�硷紝瓒呰繃杩欎釜璺濈灏变笉灞炰簬鍚屼竴鑱氱被銆�
+        clusterPoints(points, threshold);
+    }
+}

--
Gitblit v1.9.3