From d56b8093dc9e3e75f8efe1a0f1aa6d821c9c3dfb Mon Sep 17 00:00:00 2001 From: Junjie <xjj@123> Date: 星期二, 15 四月 2025 13:30:35 +0800 Subject: [PATCH] # --- zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateSolution.java | 150 ++++++++++++++++++++++++++++++++++++------------- 1 files changed, 109 insertions(+), 41 deletions(-) diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateSolution.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateSolution.java index 9568d31..0b3cf6a 100644 --- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateSolution.java +++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateSolution.java @@ -1,12 +1,18 @@ package com.zy.asrs.wcs.core.utils; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.asrs.framework.common.SpringUtils; import com.zy.asrs.framework.exception.CoolException; import com.zy.asrs.wcs.core.model.NavigateNode; +import com.zy.asrs.wcs.core.model.PythonResult; +import com.zy.asrs.wcs.core.model.enums.MapNodeType; import com.zy.asrs.wcs.system.entity.Dict; import com.zy.asrs.wcs.system.service.DictService; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.PriorityQueue; @@ -17,7 +23,7 @@ */ public class NavigateSolution { - // -1 -> 澧欏锛� 0 -> 璐т綅锛� 1 -> 璧风偣 2 -> 缁堢偣 3-> 姣嶈建 4->绔欑偣 + // -1 -> 澧欏锛� 0 -> 璐т綅锛� 1 -> 璧风偣 2 -> 缁堢偣 3-> 姣嶈建 4->杈撻�佺珯鐐� 5->鍏呯數妗� 6->灏忚溅鍙蛋杈撻�佺珯鐐� 66->灏忚溅 67->鎻愬崌鏈� int[][] map = {{}}; @@ -51,44 +57,100 @@ //Exist琛ㄧ敤鏉ュ瓨鏀惧凡缁忓嚭鐜拌繃鐨勭粨鐐广�� public ArrayList<NavigateNode> Exist = new ArrayList<NavigateNode>(); - public NavigateNode astarSearch(NavigateNode start, NavigateNode end) { - //鎶婄涓�涓紑濮嬬殑缁撶偣鍔犲叆鍒癘pen琛ㄤ腑 - this.Open.add(start); - //鎶婂嚭鐜拌繃鐨勭粨鐐瑰姞鍏ュ埌Exist琛ㄤ腑 - this.Exist.add(start); - //涓诲惊鐜� - while (Open.size() > 0) { - //鍙栦紭鍏堥槦鍒楅《閮ㄥ厓绱犲苟涓旀妸杩欎釜鍏冪礌浠嶰pen琛ㄤ腑鍒犻櫎 - NavigateNode current_node = Open.poll(); - //灏嗚繖涓粨鐐瑰姞鍏ュ埌Close琛ㄤ腑 - Close.add(current_node); - //瀵瑰綋鍓嶇粨鐐硅繘琛屾墿灞曪紝寰楀埌涓�涓洓鍛ㄧ粨鐐圭殑鏁扮粍 - ArrayList<NavigateNode> neighbour_node = extend_current_node(current_node); - //瀵硅繖涓粨鐐归亶鍘嗭紝鐪嬫槸鍚︽湁鐩爣缁撶偣鍑虹幇 - for (NavigateNode node : neighbour_node) { - // G + H + E (瀵瑰惎鍙戝嚱鏁板鍔犲幓鎷愮偣鏂规calcNodeExtraCost) - int gCost = calcNodeCost(current_node, node) * calcNodeExtraCost(current_node, node, end); - if (node.getX() == end.getX() && node.getY() == end.getY()) {//鎵惧埌鐩爣缁撶偣灏辫繑鍥� - //init_node鎿嶄綔鎶婅繖涓偦灞呯粨鐐圭殑鐖惰妭鐐硅缃负褰撳墠缁撶偣 - //骞朵笖璁$畻鍑篏锛� F锛� H绛夊�� - node.setLastDistance(gCost); - node.init_node(current_node, end); - return node; - } + public String astarSearch(NavigateNode start, NavigateNode end, String pythonScriptPath) { + String maps = JSON.toJSONString(map); + String startStr = start.getX() + "-" + start.getY(); + String targetStr = end.getX() + "-" + end.getY(); - //杩涜璁$畻瀵笹, F, H 绛夊�� - node.setLastDistance(gCost); - node.init_node(current_node, end); - node.setH(calcNodeCost(node, end)); - node.setF(node.getG() + node.getH()); - - Open.add(node); - Exist.add(node); + //榛樿鍦板浘姣嶈建鏂瑰悜x + String mapDirection = "x"; + DictService dictService = SpringUtils.getBean(DictService.class); + if (dictService != null) { + Dict dict = dictService.getOne(new LambdaQueryWrapper<Dict>() + .eq(Dict::getFlag, "direction_map") + .eq(Dict::getStatus, 1)); + if (dict != null) { + mapDirection = dict.getValue(); } } - //濡傛灉閬嶅巻瀹屾墍鏈夊嚭鐜扮殑缁撶偣閮芥病鏈夋壘鍒版渶缁堢殑缁撶偣锛岃繑鍥瀗ull + + ProcessBuilder processBuilder = new ProcessBuilder("python", pythonScriptPath, maps, startStr, targetStr, mapDirection); + processBuilder.redirectErrorStream(true); + + try { + 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; + } + + PythonResult result = JSON.parseObject(builder.toString(), PythonResult.class); + if (result.getCalcResult() != 200) { + return null; + } + + String path = result.getPath(); + return path; + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } return null; } + +// public NavigateNode astarSearch(NavigateNode start, NavigateNode end) { +// //鎶婄涓�涓紑濮嬬殑缁撶偣鍔犲叆鍒癘pen琛ㄤ腑 +// this.Open.add(start); +// //鎶婂嚭鐜拌繃鐨勭粨鐐瑰姞鍏ュ埌Exist琛ㄤ腑 +// this.Exist.add(start); +// //涓诲惊鐜� +// while (Open.size() > 0) { +// //鍙栦紭鍏堥槦鍒楅《閮ㄥ厓绱犲苟涓旀妸杩欎釜鍏冪礌浠嶰pen琛ㄤ腑鍒犻櫎 +// NavigateNode current_node = Open.poll(); +// //灏嗚繖涓粨鐐瑰姞鍏ュ埌Close琛ㄤ腑 +// Close.add(current_node); +// //瀵瑰綋鍓嶇粨鐐硅繘琛屾墿灞曪紝寰楀埌涓�涓洓鍛ㄧ粨鐐圭殑鏁扮粍 +// ArrayList<NavigateNode> neighbour_node = extend_current_node(current_node); +// //瀵硅繖涓粨鐐归亶鍘嗭紝鐪嬫槸鍚︽湁鐩爣缁撶偣鍑虹幇 +// for (NavigateNode node : neighbour_node) { +// // G + H + E (瀵瑰惎鍙戝嚱鏁板鍔犲幓鎷愮偣鏂规calcNodeExtraCost) +// int gCost = calcNodeCost(current_node, node) * calcNodeExtraCost(current_node, node, end); +// if (node.getX() == end.getX() && node.getY() == end.getY()) {//鎵惧埌鐩爣缁撶偣灏辫繑鍥� +// //init_node鎿嶄綔鎶婅繖涓偦灞呯粨鐐圭殑鐖惰妭鐐硅缃负褰撳墠缁撶偣 +// //骞朵笖璁$畻鍑篏锛� F锛� H绛夊�� +// node.setLastDistance(gCost); +// node.init_node(current_node, end); +// return node; +// } +// +// //杩涜璁$畻瀵笹, F, H 绛夊�� +// node.setLastDistance(gCost); +// node.init_node(current_node, end); +// node.setH(calcNodeCost(node, end)); +// node.setF(node.getG() + node.getH()); +// +// Open.add(node); +// Exist.add(node); +// } +// } +// //濡傛灉閬嶅巻瀹屾墍鏈夊嚭鐜扮殑缁撶偣閮芥病鏈夋壘鍒版渶缁堢殑缁撶偣锛岃繑鍥瀗ull +// return null; +// } public ArrayList<NavigateNode> extend_current_node(NavigateNode current_node) { @@ -138,7 +200,7 @@ // } if (mapDirection.equals("x")) {//姣嶈建x鏂瑰悜 - if (map[x][y] == 3) { + if (map[x][y] == MapNodeType.MAIN_PATH.id) { //姣嶈建鎵嶈兘杩涜涓婁笅绉诲姩 if (is_valid(x + 1, y)) { @@ -152,8 +214,8 @@ } } - if (map[x][y] == 0 || map[x][y] == 3 || map[x][y] == 4 || map[x][y] == 5 || map[x][y] == 67) { - //瀛愯建鍜屾瘝杞ㄣ�佽緭閫佺嚎銆佸厖鐢垫々銆佹彁鍗囨満鎵嶈兘杩涜宸﹀彸绉诲姩 + if (map[x][y] == MapNodeType.NORMAL_PATH.id || map[x][y] == MapNodeType.MAIN_PATH.id || map[x][y] == MapNodeType.CONVEYOR_CAR_GO.id || map[x][y] == MapNodeType.CHARGE.id || map[x][y] == MapNodeType.LIFT.id) { + //瀛愯建鍜屾瘝杞ㄣ�佸皬杞﹀彲璧拌緭閫佺嚎銆佸厖鐢垫々銆佹彁鍗囨満鎵嶈兘杩涜宸﹀彸绉诲姩 if (is_valid(x, y + 1)) { NavigateNode node = new NavigateNode(x, y + 1); @@ -166,7 +228,7 @@ } } }else if (mapDirection.equals("y")) {//姣嶈建y鏂瑰悜 - if (map[x][y] == 3) { + if (map[x][y] == MapNodeType.MAIN_PATH.id) { //姣嶈建鎵嶈兘杩涜宸﹀彸绉诲姩 if (is_valid(x, y + 1)) { @@ -180,8 +242,8 @@ } } - if (map[x][y] == 0 || map[x][y] == 3 || map[x][y] == 4 || map[x][y] == 5 || map[x][y] == 67) { - //瀛愯建鍜屾瘝杞ㄣ�佽緭閫佺嚎銆佸厖鐢垫々銆佹彁鍗囨満鎵嶈兘杩涜涓婁笅绉诲姩 + if (map[x][y] == MapNodeType.NORMAL_PATH.id || map[x][y] == MapNodeType.MAIN_PATH.id || map[x][y] == MapNodeType.CONVEYOR_CAR_GO.id || map[x][y] == MapNodeType.CHARGE.id || map[x][y] == MapNodeType.LIFT.id) { + //瀛愯建鍜屾瘝杞ㄣ�佸皬杞﹀彲璧拌緭閫佺嚎銆佸厖鐢垫々銆佹彁鍗囨満鎵嶈兘杩涜涓婁笅绉诲姩 if (is_valid(x + 1, y)) { NavigateNode node = new NavigateNode(x + 1, y); @@ -204,7 +266,13 @@ return false; } // 濡傛灉缁撶偣鐨勪綅缃皬浜�0锛屽垯涓嶅悎娉� - if (map[x][y] < 0) return false; + if (map[x][y] < 0) { + return false; + } + + if (map[x][y] == MapNodeType.CAR.id) {//鑺傜偣鏄皬杞� + return false; + } NavigateNode navigateNode = new NavigateNode(x, y); if (is_exist(navigateNode)) { return false; -- Gitblit v1.9.1