From 802c12dcbc63ee1662c15723d27c8fc1f4fd36e6 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期六, 21 十二月 2024 08:42:56 +0800
Subject: [PATCH] #拐点算法优化

---
 src/main/java/com/zy/common/utils/NavigateUtils.java |  148 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 143 insertions(+), 5 deletions(-)

diff --git a/src/main/java/com/zy/common/utils/NavigateUtils.java b/src/main/java/com/zy/common/utils/NavigateUtils.java
index 7a592cb..9bf8643 100644
--- a/src/main/java/com/zy/common/utils/NavigateUtils.java
+++ b/src/main/java/com/zy/common/utils/NavigateUtils.java
@@ -1,6 +1,15 @@
 package com.zy.common.utils;
 
+import com.core.common.SpringUtils;
+import com.zy.asrs.utils.Utils;
+import com.zy.common.model.MapNode;
 import com.zy.common.model.NavigateNode;
+import com.zy.common.model.enums.NavigationMapType;
+import com.zy.core.cache.SlaveConnection;
+import com.zy.core.enums.ShuttleTaskModeType;
+import com.zy.core.enums.SlaveType;
+import com.zy.core.model.protocol.NyShuttleProtocol;
+import com.zy.core.thread.NyShuttleThread;
 
 import java.util.*;
 
@@ -9,10 +18,19 @@
  */
 public class NavigateUtils {
 
-    public static List<NavigateNode> calc(String startPoint, String endPoint, String mapType) {
+    public static List<NavigateNode> calc(String startPoint, String endPoint, Integer mapType, List<int[]> shuttlePoints, List<int[]> whites) {
         //閫氳繃寮�濮嬬紪鍙峰拰缁撴潫缂栧彿鑾峰彇瀵瑰簲鐨剎y杞村潗鏍�
         int[] startArr = NavigatePositionConvert.positionToXY(startPoint);//寮�濮嬭妭鐐�
         int[] endArr = NavigatePositionConvert.positionToXY(endPoint);//缁撴潫鑺傜偣
+
+        ArrayList<int[]> whiteList = new ArrayList<>();//璁剧疆璁$畻鑺傜偣鐨勭櫧鍚嶅崟
+        whiteList.add(startArr);//灏嗗紑濮嬭妭鐐硅缃负鐧藉悕鍗曪紝浠ラ槻琚繃婊�
+        if (whites != null && !whites.isEmpty()) {
+            whiteList.addAll(whites);//鎵归噺娣诲姞鐧藉悕鍗曡妭鐐�
+        }
+
+        //鑾峰彇褰撳墠鑺傜偣璁$畻鐨勫眰楂橈紝骞惰祴鍊煎埌姣忎竴涓妭鐐逛腑
+        int lev = Utils.getLev(startPoint);
 
         //鍒濆鍖栧紑濮嬭妭鐐�
         NavigateNode start = new NavigateNode(startArr[0], startArr[1]);
@@ -20,10 +38,12 @@
         start.setFather(null);
 
         NavigateNode end = new NavigateNode(endArr[0], endArr[1]);
-        NavigateSolution solution = new NavigateSolution(mapType);
+        NavigateSolution solution = new NavigateSolution(mapType, lev, whiteList, shuttlePoints);
+        //寮�濮嬭妭鐐癸紝涓嶇撼鍏ョ鐢ㄨ妭鐐瑰唴璁$畻
+
         NavigateNode res_node = solution.astarSearch(start, end);
         if (res_node == null) {
-            System.out.println("鏈壘鍒拌矾寰�");
+            System.out.println(start + "," + end + "锛氭湭鎵惧埌璺緞");
             return null;
         } else {
             ArrayList<NavigateNode> list = new ArrayList<>();
@@ -33,6 +53,7 @@
             while (res_node != null) {
                 res_node.setDirection(null);
                 res_node.setIsInflectionPoint(false);
+                res_node.setZ(lev);//璁剧疆灞傞珮
 
                 //瀵绘壘鎷愮偣
                 HashMap<String, Object> result = searchInflectionPoint(res_node, fatherNode, res_node.getFather());//鍒嗗埆浼犲叆褰撳墠鑺傜偣銆佺埗鑺傜偣銆佷笅涓�鑺傜偣
@@ -127,7 +148,9 @@
         ArrayList<ArrayList<NavigateNode>> list = new ArrayList<>();
         ArrayList<NavigateNode> data = new ArrayList<>();
         String direction = mapList.get(0).getDirection();//琛岃蛋鏂瑰悜
-        for (NavigateNode mapNode : mapList) {
+
+        for (int i = 0; i < mapList.size(); i++) {
+            NavigateNode mapNode = mapList.get(i);
             boolean isInflectionPoint = mapNode.getIsInflectionPoint();
             data.add(mapNode);
             if (isInflectionPoint) {
@@ -136,10 +159,13 @@
                 list.add(data);//娣诲姞鏌愪竴娈垫暟鎹�
                 direction = mapNode.getDirection();//鏇存柊琛岃蛋鏂瑰悜
                 data = new ArrayList<>();
+                data.add(mapNode);//灏嗘嫄鐐圭殑缁堢偣锛屾洿鏂版垚涓嬩竴娈靛懡浠ょ殑璧风偣鍧愭爣
             }else {
                 //鐩磋绾胯矾
                 mapNode.setDirection(direction);//璁剧疆琛岃蛋鏂瑰悜
             }
+            Integer distance = getXToNextDistance(mapNode);//鑾峰彇褰撳墠鐐瑰埌涓嬩竴鐐圭殑琛岃蛋璺濈
+            mapNode.setMoveDistance(distance);
         }
 
         //灏嗘渶鍚庝竴娈垫暟鎹坊鍔犺繘鍏�
@@ -148,15 +174,127 @@
         return list;
     }
 
+    //鑾峰彇浠巟鐐瑰埌涓嬩竴鐐圭殑琛岃蛋璺濈
+    public static Integer getXToNextDistance(NavigateNode xNode) {
+        NavigateMapData navigateMapData = SpringUtils.getBean(NavigateMapData.class);
+        navigateMapData.setLev(xNode.getZ());
+
+        List<List<MapNode>> lists = navigateMapData.getJsonData(NavigationMapType.NONE.id, null, null);
+        if (lists != null) {
+            MapNode mapNode = lists.get(xNode.getX()).get(xNode.getY());
+            if (mapNode != null) {
+                switch (xNode.getDirection()) {
+                    case "top":
+                        return mapNode.getTop();
+                    case "bottom":
+                        return mapNode.getBottom();
+                    case "left":
+                        return mapNode.getLeft();
+                    case "right":
+                        return mapNode.getRight();
+                }
+            }
+            return 0;
+        }
+        return 0;
+    }
+
+    /**
+     * 鏍规嵁鍘熷鑺傜偣缁撴灉锛岃绠楁�昏璧拌窛绂�
+     */
+    public static Integer getOriginPathAllDistance(List<NavigateNode> path) {
+        ArrayList<ArrayList<NavigateNode>> sectionPath = NavigateUtils.getSectionPath(path);
+        Integer allDistance = 0;
+        for (ArrayList<NavigateNode> navigateNodes : sectionPath) {
+            Integer distance = NavigateUtils.getCurrentPathAllDistance(navigateNodes);
+            allDistance += distance;
+        }
+        return allDistance;
+    }
+
+    /**
+     * 鑾峰彇褰撳墠璺緞鎬昏璧拌窛绂�
+     */
+    public static Integer getCurrentPathAllDistance(List<NavigateNode> path) {
+        if (path.size() == 1) {
+            //璺緞鍙湁涓�鏉℃暟鎹紝鍒欑洿鎺ヨ繑鍥炶璧拌窛绂�
+            return path.get(0).getMoveDistance();
+        }
+
+        //鎬昏窛绂�
+        int allDistance = 0;
+        for (int i = 0; i < path.size() - 1; i++) {//璺緞涓渶鍚庝竴涓妭鐐逛笉缁熻鍒版�昏窛绂伙紝鏈�鍚庝竴涓妭鐐瑰苟涓嶄細鍐嶈璧�
+            allDistance += path.get(i).getMoveDistance();
+        }
+        return allDistance;
+    }
+
+    /**
+     * 鑾峰彇涓棿鐐瑰埌鐩爣鐐硅璧拌窛绂�
+     */
+    public static Integer getMiddleToDistDistance(List<NavigateNode> path, NavigateNode middlePath) {
+        //鏈�鍚庝竴鏉¤妭鐐逛笉璁$畻杩涜璧拌窛绂�
+        NavigateNode lastPath = path.get(path.size() - 1);
+        //鎬昏窛绂�
+        int allDistance = 0;
+        boolean flag = false;
+        for (NavigateNode navigateNode : path) {
+            if (!flag && navigateNode.equals(middlePath)) {
+                flag = true;
+            }
+
+            if (navigateNode.equals(lastPath)) {
+                continue;//鏈�鍚庝竴鏉¤妭鐐逛笉璁$畻杩涜璧拌窛绂�
+            }
+
+            if (flag) {
+                allDistance += navigateNode.getMoveDistance();
+            }
+        }
+        return allDistance;
+    }
+
+    /**
+     * 妫�娴嬭矾寰勬槸鍚﹀彲鐢�(鍙蛋)
+     */
+    public static boolean checkPathIsAvailable(List<NavigateNode> path, Integer shuttleNo, Integer lev, List<int[]> whitePoints) {
+        NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
+        if (shuttleThread == null) {
+            return false;
+        }
+        NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
+        if (shuttleProtocol == null) {
+            return false;
+        }
+
+        Integer mapType = NavigationMapType.DFX.id;
+        if (shuttleProtocol.getLiftPosition() == 1) {
+            //涓嬮檷浣嶇疆
+            mapType = NavigationMapType.NORMAL.id;
+        }
+
+        NavigateSolution solution = new NavigateSolution(mapType, lev, whitePoints, Utils.getShuttlePoints(shuttleNo, lev));//鑾峰彇鏃犵櫧鍚嶅崟鍦板浘(璇ュ湴鍥惧寘鍚皬杞﹀潗鏍�)
+        int[][] map = solution.map;
+        for (NavigateNode node : path) {
+            int value = map[node.getX()][node.getY()];
+            if (value != 0 && value != 3 && value != 5) {//姣嶈建閬�3銆佸瓙杞ㄩ亾0銆佸厖鐢垫々5
+                return false;
+            }
+        }
+        return true;
+    }
+
     public static void main(String[] args) {
         //璁$畻璺緞
-        List<NavigateNode> calc = calc("1000901", "0201801", "out");
+        List<NavigateNode> calc = calc("1000901", "1800201", NavigationMapType.NONE.id, null, null);
         System.out.println(calc);
         System.out.println("------------------------");
 //        List<NavigateNode> calc = calc("0501401", "0201801", "out");
         //灏嗚矾寰勫垎鍓叉垚澶氭
         ArrayList<ArrayList<NavigateNode>> data = getSectionPath(calc);
         for (ArrayList<NavigateNode> list : data) {
+            Integer currentPathAllDistance = getCurrentPathAllDistance(list);//璁$畻褰撳墠璺緞鎬昏窛绂�
+            System.out.println(currentPathAllDistance);
             System.out.println(list);
         }
 

--
Gitblit v1.9.1