From 11da5829433e788d8f901ee5cd910d5923f0806a Mon Sep 17 00:00:00 2001 From: Junjie <540245094@qq.com> Date: 星期四, 13 六月 2024 09:51:37 +0800 Subject: [PATCH] #小车地图严格模式 --- zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateSolution.java | 150 +++++++++++++++++++++++++++++++------------------ 1 files changed, 95 insertions(+), 55 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 1934fc0..4dbd761 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,6 +1,11 @@ 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.system.entity.Dict; +import com.zy.asrs.wcs.system.service.DictService; import java.util.ArrayList; import java.util.List; @@ -12,23 +17,25 @@ */ public class NavigateSolution { - // -1 -> 澧欏锛� 1 -> 璧风偣 2 -> 缁堢偣 3-> 姣嶈建 4->绔欑偣 + // -1 -> 澧欏锛� 0 -> 璐т綅锛� 1 -> 璧风偣 2 -> 缁堢偣 3-> 姣嶈建 4->绔欑偣 int[][] map = {{}}; public NavigateSolution() { //杞藉叆鍦板浘 - NavigateMapData mapData = new NavigateMapData(); + NavigateMapData mapData = SpringUtils.getBean(NavigateMapData.class); + mapData.setLev(1); int[][] data = mapData.getData(); this.map = data; } public NavigateSolution(Integer mapType, Integer lev, List<int[]> whitePoints, List<int[]> shuttlePoints) { //杞藉叆鍦板浘鎸囧畾灞傞珮鍦板浘 - NavigateMapData mapData = new NavigateMapData(lev); + NavigateMapData mapData = SpringUtils.getBean(NavigateMapData.class); + 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; } @@ -64,28 +71,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 @@ -94,6 +92,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(); @@ -126,31 +136,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) { + //瀛愯建鍜屾瘝杞ㄣ�佽緭閫佺嚎銆佸厖鐢垫々鎵嶈兘杩涜宸﹀彸绉诲姩 + 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) { + //瀛愯建鍜屾瘝杞ㄣ�佽緭閫佺嚎銆佸厖鐢垫々鎵嶈兘杩涜涓婁笅绉诲姩 + 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); + } } } @@ -158,16 +199,15 @@ } public boolean is_valid(int x, int y) { + if (x < 0 || x >= this.map.length + || y < 0 || y >= this.map[0].length) { + return false; + } // 濡傛灉缁撶偣鐨勪綅缃皬浜�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; - } + NavigateNode navigateNode = new NavigateNode(x, y); + if (is_exist(navigateNode)) { + return false; } //浠ヤ笂鎯呭喌閮芥病鏈夊垯鍚堟硶 return true; @@ -195,12 +235,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; } // 鏅�氭嫄鐐� @@ -209,7 +249,7 @@ 鎷垮埌鐖惰妭鐐瑰拰涓嬩竴鑺傜偣 閫氳繃鍒ゆ柇鐖惰妭鐐瑰拰涓嬩竴鑺傜偣鐨剎鏁版嵁鍜寉鏁版嵁閮戒笉鐩稿悓鏃讹紝鍒欒〃鏄庡綋鍓嶅潗鏍囨槸涓�涓嫄鐐� */ - return 2; + return 3; } //------------------A*鍚彂鍑芥暟-end------------------// -- Gitblit v1.9.1