From 23733d8b91d0a5e83dc47978db12f6aea102975a Mon Sep 17 00:00:00 2001
From: zjj <3272660260@qq.com>
Date: 星期四, 27 二月 2025 08:58:16 +0800
Subject: [PATCH] #
---
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateUtils.java | 166 +++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 125 insertions(+), 41 deletions(-)
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateUtils.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateUtils.java
index 6792085..1013656 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateUtils.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateUtils.java
@@ -1,22 +1,36 @@
package com.zy.asrs.wcs.core.utils;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
import com.zy.asrs.framework.common.SpringUtils;
import com.zy.asrs.wcs.core.model.MapNode;
import com.zy.asrs.wcs.core.model.NavigateNode;
+import com.zy.asrs.wcs.core.model.PythonSimilarityResult;
import com.zy.asrs.wcs.core.model.enums.MapNodeType;
import com.zy.asrs.wcs.core.model.enums.NavigationMapType;
+import com.zy.asrs.wcs.rcs.News;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.HashMap;
import java.util.List;
/**
* A*绠楁硶浣跨敤宸ュ叿
*/
+@Component
public class NavigateUtils {
- public static List<NavigateNode> calc(String startPoint, String endPoint, Integer mapType, List<int[]> shuttlePoints) {
+ @Value("${pythonCalcPath}")
+ private String pythonCalcPath;
+
+ @Value("${pythonCalcSimilarity}")
+ private String pythonCalcSimilarity;
+
+ public List<NavigateNode> calc(String startPoint, String endPoint, Integer mapType, List<int[]> shuttlePoints) {
//閫氳繃寮�濮嬬紪鍙峰拰缁撴潫缂栧彿鑾峰彇瀵瑰簲鐨剎y杞村潗鏍�
int[] startArr = NavigatePositionConvert.positionToXY(startPoint);//寮�濮嬭妭鐐�
int[] endArr = NavigatePositionConvert.positionToXY(endPoint);//缁撴潫鑺傜偣
@@ -36,36 +50,42 @@
NavigateSolution solution = new NavigateSolution(mapType, lev, whiteList, shuttlePoints);
//寮�濮嬭妭鐐癸紝涓嶇撼鍏ョ鐢ㄨ妭鐐瑰唴璁$畻
- NavigateNode res_node = solution.astarSearch(start, end);
- if (res_node == null) {
- System.err.println("鏈壘鍒拌矾寰�");
+ String pathStr = solution.astarSearch(start, end, pythonCalcPath);
+ if (pathStr == null) {
+ News.error("{} dash {} can't find navigate path!", startPoint, endPoint);
return null;
}
- ArrayList<NavigateNode> list = new ArrayList<>();
- //娓叉煋
+ List<NavigateNode> list = new ArrayList<>();
+
NavigateNode fatherNode = null;//褰撳墠寰幆涓婁竴鑺傜偣锛岀敤浜庢嫄鐐硅绠�
- while (res_node != null) {
- res_node.setDirection(null);
- res_node.setIsInflectionPoint(false);
- res_node.setZ(lev);//璁剧疆灞傞珮
+ JSONArray rows = JSON.parseArray(pathStr);
+
+ for (int i = 0; i < rows.size(); i++) {
+ Object currentObj = rows.get(i);
+
+ NavigateNode nextNode = null;
+ if ((i + 1) < rows.size()) {
+ Object object = rows.get(i + 1);
+ nextNode = pythonObjTransferNode(object, lev);
+ }
+
+ NavigateNode node = pythonObjTransferNode(currentObj, lev);
//瀵绘壘鎷愮偣
- HashMap<String, Object> result = searchInflectionPoint(res_node, fatherNode, res_node.getFather());//鍒嗗埆浼犲叆褰撳墠鑺傜偣銆佺埗鑺傜偣銆佷笅涓�鑺傜偣
+ HashMap<String, Object> result = searchInflectionPoint(node, fatherNode, nextNode);//鍒嗗埆浼犲叆褰撳墠鑺傜偣銆佺埗鑺傜偣銆佷笅涓�鑺傜偣
//鍒ゆ柇褰撳墠鑺傜偣鏄惁涓烘嫄鐐�
if (Boolean.parseBoolean(result.get("result").toString())) {
//褰撳墠涓烘嫄鐐�
- res_node.setIsInflectionPoint(true);
+ node.setIsInflectionPoint(true);
//鎷愮偣鏂瑰悜
- res_node.setDirection(result.get("direction").toString());
+ node.setDirection(result.get("direction").toString());
}
- list.add(res_node);
- fatherNode = res_node;//鎶婂綋鍓嶈妭鐐逛繚瀛樻垚涓�涓埗鑺傜偣
- res_node = res_node.getFather();//杩唬鎿嶄綔
+ list.add(node);
+
+ fatherNode = node;//鎶婂綋鍓嶈妭鐐逛繚瀛樻垚涓�涓埗鑺傜偣
}
-
- Collections.reverse(list);
//灏嗘瘡涓妭鐐归噷闈㈢殑fatherNode鑷充负null(鏂逛究鍚庣画璁$畻鏃剁埗鑺傜偣杩囧瀵艰嚧鏄剧ず鐨勮妭鐐瑰お澶�)
for (NavigateNode navigateNode : list) {
@@ -84,7 +104,7 @@
}
//鍒ゆ柇褰撳墠鑺傜偣鍒颁笅涓�涓妭鐐规槸鍚︿负鎷愮偣
- public static HashMap<String,Object> searchInflectionPoint(NavigateNode currentNode, NavigateNode fatherNode, NavigateNode nextNode) {
+ public HashMap<String,Object> searchInflectionPoint(NavigateNode currentNode, NavigateNode fatherNode, NavigateNode nextNode) {
HashMap<String, Object> map = new HashMap<>();
map.put("result", false);//鏄惁涓烘嫄鐐癸紝true锛氭嫄鐐癸紝false锛氱洿绾�
// 绗竴涓偣鎴栫洿绾跨偣
@@ -103,7 +123,7 @@
/**
* 璁$畻鏂瑰悜
*/
- public static String calcDirection(NavigateNode currentNode, NavigateNode fatherNode) {
+ public String calcDirection(NavigateNode currentNode, NavigateNode fatherNode) {
//鎷愮偣鏂瑰悜
String direction = "";
// 鏅�氭嫄鐐�
@@ -139,7 +159,7 @@
* 鍔犺浆寮妭鐐�
* 鑾峰彇鍒嗘璺緞锛屾瘡褰撴湁涓�涓嫄鐐瑰垯杩涜涓�娆″垎娈碉紝鏈�缁堣繑鍥炴�诲垎娈垫暟鎹�
*/
- public static ArrayList<ArrayList<NavigateNode>> getSectionPath(List<NavigateNode> mapList) {
+ public ArrayList<ArrayList<NavigateNode>> getSectionPath(List<NavigateNode> mapList) {
ArrayList<ArrayList<NavigateNode>> list = new ArrayList<>();
ArrayList<NavigateNode> data = new ArrayList<>();
@@ -169,7 +189,7 @@
}
//鑾峰彇浠巟鐐瑰埌涓嬩竴鐐圭殑琛岃蛋璺濈
- public static Integer getXToNextDistance(NavigateNode xNode) {
+ public Integer getXToNextDistance(NavigateNode xNode) {
NavigateMapData mapData = SpringUtils.getBean(NavigateMapData.class);
mapData.setLev(xNode.getZ());
List<List<MapNode>> lists = mapData.getJsonData(NavigationMapType.NONE.id, null, null);
@@ -195,11 +215,11 @@
/**
* 鏍规嵁鍘熷鑺傜偣缁撴灉锛岃绠楁�昏璧拌窛绂�
*/
- public static Integer getOriginPathAllDistance(List<NavigateNode> path) {
- ArrayList<ArrayList<NavigateNode>> sectionPath = NavigateUtils.getSectionPath(path);
+ public Integer getOriginPathAllDistance(List<NavigateNode> path) {
+ ArrayList<ArrayList<NavigateNode>> sectionPath = getSectionPath(path);
Integer allDistance = 0;
for (ArrayList<NavigateNode> navigateNodes : sectionPath) {
- Integer distance = NavigateUtils.getCurrentPathAllDistance(navigateNodes);
+ Integer distance = getCurrentPathAllDistance(navigateNodes);
allDistance += distance;
}
return allDistance;
@@ -208,7 +228,7 @@
/**
* 鑾峰彇褰撳墠璺緞鎬昏璧拌窛绂�
*/
- public static Integer getCurrentPathAllDistance(List<NavigateNode> path) {
+ public Integer getCurrentPathAllDistance(List<NavigateNode> path) {
if (path.size() == 1) {
//璺緞鍙湁涓�鏉℃暟鎹紝鍒欑洿鎺ヨ繑鍥炶璧拌窛绂�
return path.get(0).getMoveDistance();
@@ -225,7 +245,7 @@
/**
* 鑾峰彇涓棿鐐瑰埌鐩爣鐐硅璧拌窛绂�
*/
- public static Integer getMiddleToDistDistance(List<NavigateNode> path, NavigateNode middlePath) {
+ public Integer getMiddleToDistDistance(List<NavigateNode> path, NavigateNode middlePath) {
//鏈�鍚庝竴鏉¤妭鐐逛笉璁$畻杩涜璧拌窛绂�
NavigateNode lastPath = path.get(path.size() - 1);
//鎬昏窛绂�
@@ -250,7 +270,7 @@
/**
* 妫�娴嬭矾寰勬槸鍚﹀彲鐢�(鍙蛋)
*/
- public static boolean checkPathIsAvailable(List<NavigateNode> path, Integer shuttleNo, Integer lev) {
+ public 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) {
@@ -262,19 +282,83 @@
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);
+ private NavigateNode pythonObjTransferNode(Object obj, Integer z) {
+ List<Integer> pathData = JSON.parseArray(obj.toString(), Integer.class);
+ Integer x = pathData.get(0);
+ Integer y = pathData.get(1);
+
+ NavigateNode node = new NavigateNode(x, y);
+ node.setDirection(null);
+ node.setIsInflectionPoint(false);
+ node.setZ(z);
+ return node;
+ }
+
+ public Double similarityPath(List<NavigateNode> firstPath, List<NavigateNode> secondPath) {
+ try {
+ List<int[]> first = new ArrayList<>();
+ for (NavigateNode node : firstPath) {
+ first.add(new int[]{node.getX(), node.getY()});
+ }
+
+ List<int[]> second = new ArrayList<>();
+ for (NavigateNode node : secondPath) {
+ second.add(new int[]{node.getX(), node.getY()});
+ }
+
+ ProcessBuilder processBuilder = new ProcessBuilder("python", pythonCalcSimilarity, JSON.toJSONString(first), JSON.toJSONString(second));
+ processBuilder.redirectErrorStream(true);
+
+ Process process = processBuilder.start();
+
+ // 璇诲彇Python鑴氭湰鐨勮緭鍑�
+ BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+ String line;
+ StringBuilder builder = new StringBuilder();
+ while ((line = reader.readLine()) != null) {
+ builder.append(line);
+ }
+
+ // 绛夊緟Python鑴氭湰鎵ц瀹屾垚
+ int exitCode = process.waitFor();
+ if (exitCode != 0) {
+ System.out.println("Python script exited with error code: " + exitCode);
+ return null;
+ }
+ reader.close();
+
+ if (builder.length() <= 0) {
+ return null;
+ }
+
+ PythonSimilarityResult result = JSON.parseObject(builder.toString(), PythonSimilarityResult.class);
+ if (result.getCalcResult() != 200) {
+ return 0D;
+ }
+
+ Double similarity = result.getSimilarity();
+ return similarity;
+ } catch (Exception e) {
+ e.printStackTrace();
}
+ return 0D;
+ }
+
+ 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);
+// }
+
+ System.loadLibrary("example");
}
--
Gitblit v1.9.1