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