From 0d04bc5d8080b82338302fba0a59fccff2eaedfc Mon Sep 17 00:00:00 2001 From: Junjie <fallin.jie@qq.com> Date: 星期日, 06 七月 2025 11:28:29 +0800 Subject: [PATCH] # --- zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateSolution.java | 161 +++++++++++++++++++++++++++++++++-------------------- 1 files changed, 101 insertions(+), 60 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 677c6f0..67536be 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,7 +1,13 @@ package com.zy.asrs.wcs.core.utils; +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.enums.MapNodeType; +import com.zy.asrs.wcs.system.entity.Dict; +import com.zy.asrs.wcs.system.service.DictService; + import java.util.ArrayList; import java.util.List; @@ -13,7 +19,7 @@ */ public class NavigateSolution { - // -1 -> 澧欏锛� 1 -> 璧风偣 2 -> 缁堢偣 3-> 姣嶈建 4->绔欑偣 + // -1 -> 澧欏锛� 0 -> 璐т綅锛� 1 -> 璧风偣 2 -> 缁堢偣 3-> 姣嶈建 4->杈撻�佺珯鐐� 5->鍏呯數妗� 66->灏忚溅 67->鎻愬崌鏈� int[][] map = {{}}; @@ -31,7 +37,7 @@ mapData.setLev(lev); int[][] data = mapData.getDataFromRedis(mapType, whitePoints, shuttlePoints); if (data == null) { - data = mapData.getData(mapType, whitePoints, shuttlePoints); + throw new CoolException("鍦板浘鏈浇鍏ワ紒"); } this.map = data; } @@ -67,28 +73,19 @@ if (node.getX() == end.getX() && node.getY() == end.getY()) {//鎵惧埌鐩爣缁撶偣灏辫繑鍥� //init_node鎿嶄綔鎶婅繖涓偦灞呯粨鐐圭殑鐖惰妭鐐硅缃负褰撳墠缁撶偣 //骞朵笖璁$畻鍑篏锛� F锛� H绛夊�� + node.setLastDistance(gCost); node.init_node(current_node, end); return node; } - //(瀵瑰惎鍙戝嚱鏁板鍔犲幓鎷愮偣鏂规calcNodeExtraCost) - if (is_exist(node)) { - if (gCost < node.getG()) { - node.setFather(current_node); - node.setG(gCost); - node.setF(node.getG() + node.getH()); - } - }else { - //娌″嚭鐜拌繃鐨勭粨鐐瑰姞鍏ュ埌Open琛ㄤ腑骞朵笖璁剧疆鐖惰妭鐐� - //杩涜璁$畻瀵笹, F, H 绛夊�� - node.init_node(current_node, end); - node.setG(gCost); - node.setH(calcNodeCost(node, end)); - node.setF(node.getG() + node.getH()); + //杩涜璁$畻瀵笹, 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); - } + Open.add(node); + Exist.add(node); } } //濡傛灉閬嶅巻瀹屾墍鏈夊嚭鐜扮殑缁撶偣閮芥病鏈夋壘鍒版渶缁堢殑缁撶偣锛岃繑鍥瀗ull @@ -97,6 +94,18 @@ public ArrayList<NavigateNode> extend_current_node(NavigateNode current_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(); + } + } + //鑾峰彇褰撳墠缁撶偣鐨剎, y int x = current_node.getX(); int y = current_node.getY(); @@ -129,31 +138,62 @@ // neighbour_node.add(node); // } // } - if (map[x][y] == 3) { - //姣嶈建鎵嶈兘杩涜宸﹀彸绉诲姩 - if (is_valid(x, y + 1)) - { - NavigateNode node = new NavigateNode(x, y + 1); - neighbour_node.add(node); - } - if (is_valid(x, y - 1)) - { - NavigateNode node = new NavigateNode(x, y - 1); - neighbour_node.add(node); - } - } - if (map[x][y] == 0 || map[x][y] == 3 || map[x][y] == 4 || map[x][y] == 5) { - //瀛愯建鍜屾瘝杞ㄣ�佽緭閫佺嚎銆佸厖鐢垫々鎵嶈兘杩涜涓婁笅绉诲姩 - if (is_valid(x + 1, y)) - { - NavigateNode node = new NavigateNode(x + 1, y); - neighbour_node.add(node); + if (mapDirection.equals("x")) {//姣嶈建x鏂瑰悜 + if (map[x][y] == 3) { + //姣嶈建鎵嶈兘杩涜涓婁笅绉诲姩 + if (is_valid(x + 1, y)) + { + NavigateNode node = new NavigateNode(x + 1, y); + neighbour_node.add(node); + } + if (is_valid(x - 1, y)) + { + NavigateNode node = new NavigateNode(x -1, y); + neighbour_node.add(node); + } } - if (is_valid(x - 1, y)) - { - NavigateNode node = new NavigateNode(x -1, y); - neighbour_node.add(node); + + if (map[x][y] == 0 || map[x][y] == 3 || map[x][y] == 4 || map[x][y] == 5 || map[x][y] == 67) { + //瀛愯建鍜屾瘝杞ㄣ�佽緭閫佺嚎銆佸厖鐢垫々銆佹彁鍗囨満鎵嶈兘杩涜宸﹀彸绉诲姩 + if (is_valid(x, y + 1)) + { + NavigateNode node = new NavigateNode(x, y + 1); + neighbour_node.add(node); + } + if (is_valid(x, y - 1)) + { + NavigateNode node = new NavigateNode(x, y - 1); + neighbour_node.add(node); + } + } + }else if (mapDirection.equals("y")) {//姣嶈建y鏂瑰悜 + if (map[x][y] == 3) { + //姣嶈建鎵嶈兘杩涜宸﹀彸绉诲姩 + if (is_valid(x, y + 1)) + { + NavigateNode node = new NavigateNode(x, y + 1); + neighbour_node.add(node); + } + if (is_valid(x, y - 1)) + { + NavigateNode node = new NavigateNode(x, y - 1); + neighbour_node.add(node); + } + } + + if (map[x][y] == 0 || map[x][y] == 3 || map[x][y] == 4 || map[x][y] == 5 || map[x][y] == 67) { + //瀛愯建鍜屾瘝杞ㄣ�佽緭閫佺嚎銆佸厖鐢垫々銆佹彁鍗囨満鎵嶈兘杩涜涓婁笅绉诲姩 + if (is_valid(x + 1, y)) + { + NavigateNode node = new NavigateNode(x + 1, y); + neighbour_node.add(node); + } + if (is_valid(x - 1, y)) + { + NavigateNode node = new NavigateNode(x -1, y); + neighbour_node.add(node); + } } } @@ -161,23 +201,24 @@ } public boolean is_valid(int x, int y) { - try { - // 濡傛灉缁撶偣鐨勪綅缃皬浜�0锛屽垯涓嶅悎娉� - if (map[x][y] < 0) return false; - for (NavigateNode node : Exist) { - //濡傛灉缁撶偣鍑虹幇杩囷紝涓嶅悎娉� - if (node.getX() == x && node.getY() == y) { - return false; - } - if (is_exist(new NavigateNode(x, y))) { - return false; - } - } - //浠ヤ笂鎯呭喌閮芥病鏈夊垯鍚堟硶 - return true; - } catch (Exception e) { + if (x < 0 || x >= this.map.length + || y < 0 || y >= this.map[0].length) { return false; } + // 濡傛灉缁撶偣鐨勪綅缃皬浜�0锛屽垯涓嶅悎娉� + 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; + } + //浠ヤ笂鎯呭喌閮芥病鏈夊垯鍚堟硶 + return true; } public boolean is_exist(NavigateNode node) @@ -202,12 +243,12 @@ // 绗竴涓偣鎴栫洿绾跨偣 if (currNode.getFather() == null || nextNode.getX() == currNode.getFather().getX() || nextNode.getY() == currNode.getFather().getY()) { - return 0; + return 1; } // 鎷愬悜缁堢偣鐨勭偣 if (nextNode.getX() == endNode.getX() || nextNode.getY() == endNode.getY()) { - return 1; + return 2; } // 鏅�氭嫄鐐� @@ -216,7 +257,7 @@ 鎷垮埌鐖惰妭鐐瑰拰涓嬩竴鑺傜偣 閫氳繃鍒ゆ柇鐖惰妭鐐瑰拰涓嬩竴鑺傜偣鐨剎鏁版嵁鍜寉鏁版嵁閮戒笉鐩稿悓鏃讹紝鍒欒〃鏄庡綋鍓嶅潗鏍囨槸涓�涓嫄鐐� */ - return 2; + return 3; } //------------------A*鍚彂鍑芥暟-end------------------// -- Gitblit v1.9.1