From 1b4fbdb92537036aed4d648967ef7e7ab8842aec Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期四, 13 十一月 2025 16:37:11 +0800
Subject: [PATCH] #
---
src/main/java/com/zy/common/utils/NavigateUtils.java | 309 ++++++++-------------------------------------------
1 files changed, 50 insertions(+), 259 deletions(-)
diff --git a/src/main/java/com/zy/common/utils/NavigateUtils.java b/src/main/java/com/zy/common/utils/NavigateUtils.java
index fd09ac6..b0ff36d 100644
--- a/src/main/java/com/zy/common/utils/NavigateUtils.java
+++ b/src/main/java/com/zy/common/utils/NavigateUtils.java
@@ -1,278 +1,69 @@
package com.zy.common.utils;
-import com.zy.asrs.utils.Utils;
-import com.zy.common.model.MapNode;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import org.springframework.stereotype.Component;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.core.exception.CoolException;
import com.zy.common.model.NavigateNode;
-import com.zy.common.model.enums.NavigationMapType;
-import com.zy.core.enums.ShuttleTaskModeType;
-import java.util.*;
-
-/**
- * A*绠楁硶浣跨敤宸ュ叿
- */
+@Component
public class NavigateUtils {
- public static List<NavigateNode> calc(String startPoint, String endPoint, Integer mapType, List<int[]> shuttlePoints) {
- //閫氳繃寮�濮嬬紪鍙峰拰缁撴潫缂栧彿鑾峰彇瀵瑰簲鐨剎y杞村潗鏍�
- int[] startArr = NavigatePositionConvert.positionToXY(startPoint);//寮�濮嬭妭鐐�
- int[] endArr = NavigatePositionConvert.positionToXY(endPoint);//缁撴潫鑺傜偣
+ public synchronized List<NavigateNode> calcByStationId(Integer startStationId, Integer endStationId) {
+ NavigateSolution navigateSolution = new NavigateSolution();
+ List<List<NavigateNode>> stationMap = navigateSolution.getStationMap();
- ArrayList<int[]> whiteList = new ArrayList<>();//璁剧疆璁$畻鑺傜偣鐨勭櫧鍚嶅崟
- whiteList.add(startArr);//灏嗗紑濮嬭妭鐐硅缃负鐧藉悕鍗曪紝浠ラ槻琚繃婊�
+ NavigateNode startNode = navigateSolution.findStationNavigateNode(stationMap, startStationId);
+ if (startNode == null){
+ throw new CoolException("鏈壘鍒拌 璧风偣 瀵瑰簲鐨勮妭鐐�");
+ }
- //鑾峰彇褰撳墠鑺傜偣璁$畻鐨勫眰楂橈紝骞惰祴鍊煎埌姣忎竴涓妭鐐逛腑
- int lev = Utils.getLev(startPoint);
+ NavigateNode endNode = navigateSolution.findStationNavigateNode(stationMap, endStationId);
+ if (endNode == null){
+ throw new CoolException("鏈壘鍒拌 缁堢偣 瀵瑰簲鐨勮妭鐐�");
+ }
- //鍒濆鍖栧紑濮嬭妭鐐�
- NavigateNode start = new NavigateNode(startArr[0], startArr[1]);
- //寮�濮嬭妭鐐规棤鐖惰妭鐐�
- start.setFather(null);
-
- NavigateNode end = new NavigateNode(endArr[0], endArr[1]);
- NavigateSolution solution = new NavigateSolution(mapType, lev, whiteList, shuttlePoints);
- //寮�濮嬭妭鐐癸紝涓嶇撼鍏ョ鐢ㄨ妭鐐瑰唴璁$畻
-
- NavigateNode res_node = solution.astarSearch(start, end);
+ NavigateNode res_node = navigateSolution.astarSearchJava(stationMap, startNode, endNode);
if (res_node == null) {
- System.out.println("鏈壘鍒拌矾寰�");
- return null;
- } else {
- ArrayList<NavigateNode> list = new ArrayList<>();
-
- //娓叉煋
- NavigateNode fatherNode = null;//褰撳墠寰幆涓婁竴鑺傜偣锛岀敤浜庢嫄鐐硅绠�
- 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());//鍒嗗埆浼犲叆褰撳墠鑺傜偣銆佺埗鑺傜偣銆佷笅涓�鑺傜偣
- //鍒ゆ柇褰撳墠鑺傜偣鏄惁涓烘嫄鐐�
- if (Boolean.parseBoolean(result.get("result").toString())) {
- //褰撳墠涓烘嫄鐐�
- res_node.setIsInflectionPoint(true);
- //鎷愮偣鏂瑰悜
- res_node.setDirection(result.get("direction").toString());
- }
- list.add(res_node);
-
- fatherNode = res_node;//鎶婂綋鍓嶈妭鐐逛繚瀛樻垚涓�涓埗鑺傜偣
- res_node = res_node.getFather();//杩唬鎿嶄綔
- }
-
- Collections.reverse(list);
-
- //灏嗘瘡涓妭鐐归噷闈㈢殑fatherNode鑷充负null(鏂逛究鍚庣画璁$畻鏃剁埗鑺傜偣杩囧瀵艰嚧鏄剧ず鐨勮妭鐐瑰お澶�)
- for (NavigateNode navigateNode : list) {
- //鐖惰妭鐐硅缃负null锛屼笉褰卞搷璁$畻缁撴灉锛屼笉褰卞搷鍚庣画鎿嶄綔銆�
- //姝ゆ搷浣滀粎涓哄悗缁帓鏌ュ鐞嗘彁渚涜瑙夋柟渚裤��
- navigateNode.setFather(null);
- }
-
- //璧峰鑺傜偣璁$畻鏂瑰悜
- String direction = calcDirection(list.get(0), list.get(1));
- NavigateNode startNode = list.get(0);
- startNode.setDirection(direction);
- //鏇存柊鑺傜偣鍒楄〃
- list.set(0, startNode);
- return list;
- }
- }
-
- //鍒ゆ柇褰撳墠鑺傜偣鍒颁笅涓�涓妭鐐规槸鍚︿负鎷愮偣
- public static HashMap<String,Object> searchInflectionPoint(NavigateNode currentNode, NavigateNode fatherNode, NavigateNode nextNode) {
- HashMap<String, Object> map = new HashMap<>();
- map.put("result", false);//鏄惁涓烘嫄鐐癸紝true锛氭嫄鐐癸紝false锛氱洿绾�
- // 绗竴涓偣鎴栫洿绾跨偣
- if (fatherNode == null || nextNode == null || nextNode.getX() == fatherNode.getX() || nextNode.getY() == fatherNode.getY()) {
- return map;//涓嶆槸鎷愮偣鐩存帴杩斿洖
+ throw new CoolException("鏈壘鍒拌璺緞");
}
- //鎷愮偣鏂瑰悜
- String direction = calcDirection(currentNode, fatherNode);
+ ArrayList<NavigateNode> list = new ArrayList<>();
+ // 浣跨敤 visited 闆嗗悎闃叉鐖堕摼鍑虹幇鐜鑷存寰幆锛屽悓鏃惰缃畨鍏ㄦ鏁颁笂闄�
+ HashSet<NavigateNode> visited = new HashSet<>();
+ int maxSteps = stationMap.size() * stationMap.get(0).size() + 5; // 瀹夊叏涓婇檺
+ int steps = 0;
+ while (res_node != null && visited.add(res_node) && steps++ < maxSteps) {
+ list.add(res_node);
+ res_node = res_node.getFather();//杩唬鎿嶄綔
+ }
+ if (steps >= maxSteps) {
+ throw new CoolException("璺緞鍥炴函瓒呭嚭瀹夊叏涓婇檺锛岀枒浼煎瓨鍦ㄧ埗閾惧惊鐜�");
+ }
+ Collections.reverse(list);
+ //灏嗘瘡涓妭鐐归噷闈㈢殑fatherNode鑷充负null(鏂逛究鍚庣画璁$畻鏃剁埗鑺傜偣杩囧瀵艰嚧鏄剧ず鐨勮妭鐐瑰お澶�)
+ for (NavigateNode navigateNode : list) {
+ //鐖惰妭鐐硅缃负null锛屼笉褰卞搷璁$畻缁撴灉锛屼笉褰卞搷鍚庣画鎿嶄綔銆�
+ //姝ゆ搷浣滀粎涓哄悗缁帓鏌ュ鐞嗘彁渚涜瑙夋柟渚裤��
+ navigateNode.setFather(null);
+ }
- map.put("result", true);//鎷愮偣
- map.put("direction", direction);//鎷愮偣鏂瑰悜锛堜粠褰撳墠鑺傜偣瑙嗚鐪嬬殑鏂瑰悜锛�
- return map;
- }
-
- /**
- * 璁$畻鏂瑰悜
- */
- public static String calcDirection(NavigateNode currentNode, NavigateNode fatherNode) {
- //鎷愮偣鏂瑰悜
- String direction = "";
- // 鏅�氭嫄鐐�
- //璁$畻鎷愮偣鏂瑰悜
- if (fatherNode.getX() != currentNode.getX()) {
- //x杞存暟鎹湁宸紓锛屽垽鏂瓁杞存柟鍚�
- //褰撳墠鑺傜偣X - 鐖惰妭鐐筙
- if (currentNode.getX() - fatherNode.getX() > 0) {
- //澶т簬0锛屾柟鍚憈op
- direction = "top";
- }else {
- //灏忎簬0锛屾柟鍚慴ottom
- direction = "bottom";
+ //鍘婚噸
+ HashSet<Integer> set = new HashSet<>();
+ List<NavigateNode> fitlerList = new ArrayList<>();
+ for(NavigateNode navigateNode : list){
+ JSONObject valuObject = JSON.parseObject(navigateNode.getNodeValue());
+ if(set.add(valuObject.getInteger("stationId"))){
+ fitlerList.add(navigateNode);
}
}
- if (fatherNode.getY() != currentNode.getY()) {
- //y杞存暟鎹湁宸紓锛屽垽鏂瓂杞存柟鍚�
- //褰撳墠鑺傜偣Y - 鐖惰妭鐐筜
- if (currentNode.getY() - fatherNode.getY() > 0) {
- //澶т簬0锛屾柟鍚憀eft
- direction = "left";
- }else {
- //灏忎簬0锛屾柟鍚憆ight
- direction = "right";
- }
- }
-
- return direction;
- }
-
- /**
- * 鑾峰彇鍒嗘璺緞锛屾瘡褰撴湁涓�涓嫄鐐瑰垯杩涜涓�娆″垎娈碉紝鏈�缁堣繑鍥炴�诲垎娈垫暟鎹�
- */
- public static ArrayList<ArrayList<NavigateNode>> getSectionPath(List<NavigateNode> mapList) {
- ArrayList<ArrayList<NavigateNode>> list = new ArrayList<>();
- ArrayList<NavigateNode> data = new ArrayList<>();
- String direction = mapList.get(0).getDirection();//琛岃蛋鏂瑰悜
-
- for (int i = 0; i < mapList.size(); i++) {
- NavigateNode mapNode = mapList.get(i);
- boolean isInflectionPoint = mapNode.getIsInflectionPoint();
- data.add(mapNode);
- if (isInflectionPoint) {
- //鎷愮偣
- //鍒嗗壊鏁版嵁
- list.add(data);//娣诲姞鏌愪竴娈垫暟鎹�
- direction = mapNode.getDirection();//鏇存柊琛岃蛋鏂瑰悜
- data = new ArrayList<>();
- data.add(mapNode);//灏嗘嫄鐐圭殑缁堢偣锛屾洿鏂版垚涓嬩竴娈靛懡浠ょ殑璧风偣鍧愭爣
- }else {
- //鐩磋绾胯矾
- mapNode.setDirection(direction);//璁剧疆琛岃蛋鏂瑰悜
- }
- Integer distance = getXToNextDistance(mapNode);//鑾峰彇褰撳墠鐐瑰埌涓嬩竴鐐圭殑琛岃蛋璺濈
- mapNode.setMoveDistance(distance);
- }
-
- //灏嗘渶鍚庝竴娈垫暟鎹坊鍔犺繘鍏�
- list.add(data);
-
- return list;
- }
-
- //鑾峰彇浠巟鐐瑰埌涓嬩竴鐐圭殑琛岃蛋璺濈
- public static Integer getXToNextDistance(NavigateNode xNode) {
- NavigateMapData mapData = new NavigateMapData();
- List<List<MapNode>> lists = mapData.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) {
- NavigateSolution solution = new NavigateSolution(NavigationMapType.DFX.id, lev, null, 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", "1800201", NavigationMapType.NONE.id, 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);
- }
-
+ return fitlerList;
}
}
--
Gitblit v1.9.1