From a4996f162b0ca63113f573e315e3ce4f5dce7ad3 Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期三, 05 六月 2024 15:39:37 +0800
Subject: [PATCH] #算法优化

---
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/NavigateSolution.java |   56 ++++++++++-----------------
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/NavigateNode.java     |    6 ++-
 2 files changed, 25 insertions(+), 37 deletions(-)

diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/NavigateNode.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/NavigateNode.java
index d432b7c..92e0c82 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/NavigateNode.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/NavigateNode.java
@@ -3,6 +3,7 @@
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.Optional;
 
 /**
  * A*瀵昏矾绠楁硶Node鑺傜偣
@@ -15,6 +16,7 @@
     private int x;//鍧愭爣x
     private int y;//鍧愭爣y
     private int z;//鍧愭爣z(楂樺害)
+    private Integer lastDistance;//姝ユ暟
     private int F;//缁煎悎鑺辫垂鐨勬鏁�
     private int G;//宸茬粡鑺辫垂鐨勬鏁�
     private int H;//灏嗚鑺辫垂鐨勬鏁�
@@ -33,8 +35,8 @@
     public void init_node(NavigateNode father, NavigateNode end) {
         this.Father = father;
         if (this.Father != null) {
-            //璧拌繃鐨勬鏁扮瓑浜庣埗鑺傜偣璧拌繃鐨勬鏁板姞涓�
-            this.G = father.G + 1;
+            //璧拌繃鐨勬鏁扮瓑浜庣埗鑺傜偣璧拌繃鐨勬鏁板姞鏈�鏂版鏁�
+            this.G = father.G + Optional.ofNullable(this.lastDistance).orElse(0);
         } else { //鐖惰妭鐐逛负绌轰唬琛ㄥ畠鏄涓�涓粨鐐�
             this.G = 0;
         }
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 9fc734c..bc4ae37 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
@@ -70,28 +70,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
@@ -207,23 +198,18 @@
     }
 
     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;
+        NavigateNode navigateNode = new NavigateNode(x, y);
+        if (is_exist(navigateNode)) {
+            return false;
+        }
+        //浠ヤ笂鎯呭喌閮芥病鏈夊垯鍚堟硶
+        return true;
     }
 
     public boolean is_exist(NavigateNode node)
@@ -248,12 +234,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;
         }
 
         // 鏅�氭嫄鐐�
@@ -262,7 +248,7 @@
         鎷垮埌鐖惰妭鐐瑰拰涓嬩竴鑺傜偣
         閫氳繃鍒ゆ柇鐖惰妭鐐瑰拰涓嬩竴鑺傜偣鐨剎鏁版嵁鍜寉鏁版嵁閮戒笉鐩稿悓鏃讹紝鍒欒〃鏄庡綋鍓嶅潗鏍囨槸涓�涓嫄鐐�
          */
-        return 2;
+        return 3;
     }
 
     //------------------A*鍚彂鍑芥暟-end------------------//

--
Gitblit v1.9.1