From 7635dc25bd2a4d565df496b2d96354639966768d Mon Sep 17 00:00:00 2001
From: Junjie <xjj@123>
Date: 星期四, 25 九月 2025 11:09:44 +0800
Subject: [PATCH] #
---
src/main/java/com/zy/common/utils/NavigateSolution.java | 163 +++++++++++++++++++++++++-----------------------------
1 files changed, 75 insertions(+), 88 deletions(-)
diff --git a/src/main/java/com/zy/common/utils/NavigateSolution.java b/src/main/java/com/zy/common/utils/NavigateSolution.java
index d9887d3..681c54d 100644
--- a/src/main/java/com/zy/common/utils/NavigateSolution.java
+++ b/src/main/java/com/zy/common/utils/NavigateSolution.java
@@ -5,6 +5,7 @@
import com.core.common.SpringUtils;
import com.core.exception.CoolException;
import com.zy.common.model.NavigateNode;
+import com.zy.common.model.enums.NavigationMapType;
import com.zy.core.enums.MapNodeType;
import com.zy.core.model.PythonResult;
import com.zy.system.entity.Config;
@@ -13,9 +14,7 @@
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.PriorityQueue;
+import java.util.*;
/**
* 鍥涘悜搴撴牳蹇�
@@ -27,10 +26,10 @@
int[][] map = {{}};
- public NavigateSolution(Integer mapType, Integer lev, List<int[]> whitePoints, List<int[]> shuttlePoints) {
+ public NavigateSolution(List<NavigationMapType> mapTypes, Integer lev, List<int[]> whitePoints, List<int[]> shuttlePoints) {
//杞藉叆鍦板浘鎸囧畾灞傞珮鍦板浘
NavigateMapData mapData = SpringUtils.getBean(NavigateMapData.class);
- int[][] data = mapData.getDataFromRedis(lev, mapType, whitePoints, shuttlePoints);
+ int[][] data = mapData.getDataFromRedis(lev, mapTypes, whitePoints, shuttlePoints);
if (data == null) {
throw new CoolException("鍦板浘鏈浇鍏ワ紒");
}
@@ -45,10 +44,10 @@
public PriorityQueue<NavigateNode> Open = new PriorityQueue<NavigateNode>();
//Close琛ㄧ敤鏅�氱殑鏁扮粍
public ArrayList<NavigateNode> Close = new ArrayList<NavigateNode>();
- //Exist琛ㄧ敤鏉ュ瓨鏀惧凡缁忓嚭鐜拌繃鐨勭粨鐐广��
- public ArrayList<NavigateNode> Exist = new ArrayList<NavigateNode>();
+ //鐢ㄦ潵瀛樻斁宸茬粡鍑虹幇杩囩殑缁撶偣銆�
+ Map<String, Integer> bestGMap = new HashMap<>();
- public String astarSearch(NavigateNode start, NavigateNode end, String pythonScriptPath) {
+ public String astarSearchPython(NavigateNode start, NavigateNode end, String pythonScriptPath) {
String maps = JSON.toJSONString(map);
String startStr = start.getX() + "-" + start.getY();
String targetStr = end.getX() + "-" + end.getY();
@@ -104,59 +103,60 @@
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) {
+ public NavigateNode astarSearchJava(NavigateNode start, NavigateNode end) {
//榛樿鍦板浘姣嶈建鏂瑰悜x
String mapDirection = "x";
ConfigService configService = SpringUtils.getBean(ConfigService.class);
if (configService != null) {
Config config = configService.selectOne(new EntityWrapper<Config>()
- .eq("config", "direction_map")
+ .eq("code", "direction_map")
.eq("status", 1));
if (config != null) {
mapDirection = config.getValue();
}
}
+ //鎶婄涓�涓紑濮嬬殑缁撶偣鍔犲叆鍒癘pen琛ㄤ腑
+ this.Open.add(start);
+ //涓诲惊鐜�
+ while (Open.size() > 0) {
+ //鍙栦紭鍏堥槦鍒楅《閮ㄥ厓绱犲苟涓旀妸杩欎釜鍏冪礌浠嶰pen琛ㄤ腑鍒犻櫎
+ NavigateNode current_node = Open.poll();
+
+ if (current_node.getX() == end.getX() && current_node.getY() == end.getY()) {//鎵惧埌鐩爣缁撶偣灏辫繑鍥�
+ return current_node;
+ }
+
+ //灏嗚繖涓粨鐐瑰姞鍏ュ埌Close琛ㄤ腑
+ Close.add(current_node);
+ //瀵瑰綋鍓嶇粨鐐硅繘琛屾墿灞曪紝寰楀埌涓�涓洓鍛ㄧ粨鐐圭殑鏁扮粍
+ ArrayList<NavigateNode> neighbour_node = extend_current_node(current_node, mapDirection);
+ //瀵硅繖涓粨鐐归亶鍘嗭紝鐪嬫槸鍚︽湁鐩爣缁撶偣鍑虹幇
+ for (NavigateNode node : neighbour_node) {
+ // G + H + E (瀵瑰惎鍙戝嚱鏁板鍔犲幓鎷愮偣鏂规calcNodeExtraCost)
+ int gCost = calcNodeExtraCost(current_node, node, end);
+
+ //杩涜璁$畻瀵笹, F, H 绛夊��
+ node.setG(1 + gCost);
+ node.init_node(current_node, end);
+ node.setH(calcNodeCost(node, end));
+ node.setF(node.getG() + node.getH());
+
+ String key = node.getX() + "_" + node.getY();
+ Integer recordedG = bestGMap.get(key);
+ if (recordedG == null || node.getG() <= recordedG) {
+ bestGMap.put(key, node.getG());
+
+ Open.add(node);
+ }
+ }
+ }
+ //濡傛灉閬嶅巻瀹屾墍鏈夊嚭鐜扮殑缁撶偣閮芥病鏈夋壘鍒版渶缁堢殑缁撶偣锛岃繑鍥瀗ull
+ return null;
+ }
+
+
+ public ArrayList<NavigateNode> extend_current_node(NavigateNode current_node, String mapDirection) {
//鑾峰彇褰撳墠缁撶偣鐨剎, y
int x = current_node.getX();
int y = current_node.getY();
@@ -193,56 +193,56 @@
if (mapDirection.equals("x")) {//姣嶈建x鏂瑰悜
if (map[x][y] == MapNodeType.MAIN_PATH.id) {
//姣嶈建鎵嶈兘杩涜涓婁笅绉诲姩
- if (is_valid(x + 1, y))
- {
+ if (is_valid(x + 1, y)) {
NavigateNode node = new NavigateNode(x + 1, y);
+ node.setNodeValue(map[x + 1][y]);
neighbour_node.add(node);
}
- if (is_valid(x - 1, y))
- {
- NavigateNode node = new NavigateNode(x -1, y);
+ if (is_valid(x - 1, y)) {
+ NavigateNode node = new NavigateNode(x - 1, y);
+ node.setNodeValue(map[x - 1][y]);
neighbour_node.add(node);
}
}
- 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 (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.CONVEYOR.id || map[x][y] == MapNodeType.CHARGE.id || map[x][y] == MapNodeType.LIFT.id) {
//瀛愯建鍜屾瘝杞ㄣ�佸皬杞﹀彲璧拌緭閫佺嚎銆佸厖鐢垫々銆佹彁鍗囨満鎵嶈兘杩涜宸﹀彸绉诲姩
- if (is_valid(x, y + 1))
- {
+ if (is_valid(x, y + 1)) {
NavigateNode node = new NavigateNode(x, y + 1);
+ node.setNodeValue(map[x][y + 1]);
neighbour_node.add(node);
}
- if (is_valid(x, y - 1))
- {
+ if (is_valid(x, y - 1)) {
NavigateNode node = new NavigateNode(x, y - 1);
+ node.setNodeValue(map[x][y - 1]);
neighbour_node.add(node);
}
}
- }else if (mapDirection.equals("y")) {//姣嶈建y鏂瑰悜
+ } else if (mapDirection.equals("y")) {//姣嶈建y鏂瑰悜
if (map[x][y] == MapNodeType.MAIN_PATH.id) {
//姣嶈建鎵嶈兘杩涜宸﹀彸绉诲姩
- if (is_valid(x, y + 1))
- {
+ if (is_valid(x, y + 1)) {
NavigateNode node = new NavigateNode(x, y + 1);
+ node.setNodeValue(map[x][y + 1]);
neighbour_node.add(node);
}
- if (is_valid(x, y - 1))
- {
+ if (is_valid(x, y - 1)) {
NavigateNode node = new NavigateNode(x, y - 1);
+ node.setNodeValue(map[x][y - 1]);
neighbour_node.add(node);
}
}
- 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 (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.CONVEYOR.id || map[x][y] == MapNodeType.CHARGE.id || map[x][y] == MapNodeType.LIFT.id) {
//瀛愯建鍜屾瘝杞ㄣ�佸皬杞﹀彲璧拌緭閫佺嚎銆佸厖鐢垫々銆佹彁鍗囨満鎵嶈兘杩涜涓婁笅绉诲姩
- if (is_valid(x + 1, y))
- {
+ if (is_valid(x + 1, y)) {
NavigateNode node = new NavigateNode(x + 1, y);
+ node.setNodeValue(map[x + 1][y]);
neighbour_node.add(node);
}
- if (is_valid(x - 1, y))
- {
- NavigateNode node = new NavigateNode(x -1, y);
+ if (is_valid(x - 1, y)) {
+ NavigateNode node = new NavigateNode(x - 1, y);
+ node.setNodeValue(map[x - 1][y]);
neighbour_node.add(node);
}
}
@@ -264,22 +264,9 @@
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)
- {
- for (NavigateNode exist_node : Exist) {
- if (node.getX() == exist_node.getX() && node.getY() == exist_node.getY()) {
- return true;
- }
- }
- return false;
}
//------------------A*鍚彂鍑芥暟------------------//
@@ -294,12 +281,12 @@
// 绗竴涓偣鎴栫洿绾跨偣
if (currNode.getFather() == null || nextNode.getX() == currNode.getFather().getX()
|| nextNode.getY() == currNode.getFather().getY()) {
- return 1;
+ return 0;
}
// 鎷愬悜缁堢偣鐨勭偣
if (nextNode.getX() == endNode.getX() || nextNode.getY() == endNode.getY()) {
- return 2;
+ return 1;
}
// 鏅�氭嫄鐐�
@@ -308,7 +295,7 @@
鎷垮埌鐖惰妭鐐瑰拰涓嬩竴鑺傜偣
閫氳繃鍒ゆ柇鐖惰妭鐐瑰拰涓嬩竴鑺傜偣鐨剎鏁版嵁鍜寉鏁版嵁閮戒笉鐩稿悓鏃讹紝鍒欒〃鏄庡綋鍓嶅潗鏍囨槸涓�涓嫄鐐�
*/
- return 3;
+ return 1;
}
//------------------A*鍚彂鍑芥暟-end------------------//
--
Gitblit v1.9.1