From d2aa9473613af8cd99c3a6dea0331765ecb830dc Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期二, 17 十二月 2024 13:57:20 +0800
Subject: [PATCH] #

---
 zy-acs-manager/src/main/resources/agv.py |  174 ++++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 103 insertions(+), 71 deletions(-)

diff --git a/zy-acs-manager/src/main/resources/agv.py b/zy-acs-manager/src/main/resources/agv.py
index a366634..2634411 100644
--- a/zy-acs-manager/src/main/resources/agv.py
+++ b/zy-acs-manager/src/main/resources/agv.py
@@ -1,13 +1,12 @@
 import ast
 import sys
-
 import numpy as np
 import json
 import time
 import redis
+from collections import deque
 
 radiusLen = None
-
 
 # 灏嗗瓧绗︿覆杞崲涓烘诞鐐瑰瀷鏁扮粍
 def convert_to_float_array(str_array):
@@ -15,50 +14,63 @@
         return np.array(ast.literal_eval(str_array), dtype=float)
     return str_array
 
-def getWaveScopeByCode(x, y):
-    code = codeMatrix[x, y]
+def getWaveScopeByCode_iterative(x, y):
+    """
+    浣跨敤骞垮害浼樺厛鎼滅储锛圔FS锛夋潵浠f浛閫掑綊锛屼互閬垮厤閫掑綊娣卞害杩囧ぇ鐨勯棶棰樸��
+    """
     includeList = []
     existNodes = set()
-    spreadWaveNode({"x": x, "y": y}, {"x": x, "y": y}, existNodes, includeList)
-    return includeList
+    queue = deque()
 
-def spreadWaveNode(originNode, currNode, existNodes, includeList):
-    x, y = currNode['x'], currNode['y']
-    neighbors = [(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)]
-    for neighbor in neighbors:
-        extendNeighborNodes(originNode, {"x": neighbor[0], "y": neighbor[1]}, existNodes, includeList)
-
-def extendNeighborNodes(originNode, nextNode, existNodes, includeList):
-    x, y = nextNode['x'], nextNode['y']
-    if (x < 0 or x >= codeMatrix.shape[0] or y < 0 or y >= codeMatrix.shape[1]):
-        return
-
-    if (x, y) in existNodes:
-        return
-
+    originNode = {"x": x, "y": y}
+    currNode = {"x": x, "y": y}
+    queue.append(currNode)
     existNodes.add((x, y))
 
-    nextNodeCodeData = codeMatrix[x, y]
+    while queue:
+        node = queue.popleft()
+        node_x, node_y = node['x'], node['y']
+        neighbors = [
+            (node_x + 1, node_y),
+            (node_x - 1, node_y),
+            (node_x, node_y + 1),
+            (node_x, node_y - 1)
+        ]
 
-    if nextNodeCodeData == 'NONE':
-        spreadWaveNode(originNode, nextNode, existNodes, includeList)
-    else:
-        o1Cda = convert_to_float_array(cdaMatrix[originNode['x'], originNode['y']])
-        o2Cda = convert_to_float_array(cdaMatrix[x, y])
+        for neighbor in neighbors:
+            nx, ny = neighbor
+            # 妫�鏌ヨ竟鐣屾潯浠�
+            if (nx < 0 or nx >= codeMatrix.shape[0] or ny < 0 or ny >= codeMatrix.shape[1]):
+                continue
+            if (nx, ny) in existNodes:
+                continue
 
-        num1 = (o1Cda[0] - o2Cda[0]) ** 2
-        num2 = (o1Cda[1] - o2Cda[1]) ** 2
-        if num1 + num2 <= radiusLen ** 2:
-            includeList.append({"x": int(x), "y": int(y), "code": str(codeMatrix[x, y])})
-            spreadWaveNode(originNode, nextNode, existNodes, includeList)
+            existNodes.add((nx, ny))
+            neighbor_code = codeMatrix[nx, ny]
 
-# 鎵惧埌鏌愪釜鍊煎搴旂殑 x, y 涓嬫爣
+            if neighbor_code == 'NONE':
+                queue.append({"x": nx, "y": ny})
+            else:
+                o1Cda = convert_to_float_array(cdaMatrix[x, y])
+                o2Cda = convert_to_float_array(cdaMatrix[nx, ny])
+
+                num1 = (o1Cda[0] - o2Cda[0]) ** 2
+                num2 = (o1Cda[1] - o2Cda[1]) ** 2
+                if num1 + num2 <= radiusLen ** 2:
+                    includeList.append({
+                        "x": int(nx),
+                        "y": int(ny),
+                        "code": str(codeMatrix[nx, ny])
+                    })
+                    queue.append({"x": nx, "y": ny})
+
+    return includeList
+
 def find_value_in_matrix(value):
     indices = np.where(codeMatrix == value)
     return list(zip(indices[0], indices[1]))
 
 def initWaveMatrix():
-    lev = 1
     waveMatrix = np.empty_like(codeMatrix, dtype=object)
 
     for x in range(codeMatrix.shape[0]):
@@ -73,7 +85,10 @@
 # 浼樺寲鐗堟湰锛氫娇鐢ㄩ泦鍚堟潵鎻愰珮鎬ц兘
 def mergeWave(originWave, vehicle):
     # 灏嗗瓧绗︿覆瑙f瀽涓洪泦鍚�
-    set_data = set(ast.literal_eval(originWave))
+    try:
+        set_data = set(ast.literal_eval(originWave))
+    except (ValueError, SyntaxError):
+        set_data = set()
     # 濡傛灉 vehicle 涓嶅湪闆嗗悎涓紝鍒欐坊鍔�
     set_data.add(vehicle)
     # 杩斿洖搴忓垪鍖栧悗鐨勫瓧绗︿覆
@@ -90,6 +105,8 @@
 
 # 浣跨敤 numpy 鍔犻�熺殑浠g爜
 def process_dynamic_matrix(dynamicMatrix, codeMatrix):
+    global waveMatrix  # 纭繚 waveMatrix 鏄叏灞�鍙橀噺
+
     # 灏� dynamicMatrix 杞崲涓虹粨鏋勫寲鏁扮粍
     dynamicMatrix = convert_to_structured_array(dynamicMatrix)
 
@@ -104,57 +121,72 @@
 
     # 閬嶅巻婊¤冻鏉′欢鐨勫潗鏍�
     for x, y in zip(x_indices, y_indices):
-        # print(code)
-        data = dynamicMatrix[x][y]
-        vehicle = data['vehicle']
-        includeList = getWaveScopeByCode(x,y)
+        vehicle = dynamicMatrix[x][y]['vehicle']
+        includeList = getWaveScopeByCode_iterative(x, y)
         for include in includeList:
             originWave = waveMatrix[include['x']][include['y']]
             waveMatrix[include['x']][include['y']] = mergeWave(originWave, vehicle)
 
-radiusLenStr = sys.argv[1]
-radiusLen = float(radiusLenStr)
+def main():
+    global radiusLen, codeMatrix, cdaMatrix, waveMatrix  # 澹版槑涓哄叏灞�鍙橀噺
 
-redisHost = sys.argv[2]
-redisPwd = sys.argv[3]
-redisPort = sys.argv[4]
-redisIdx = sys.argv[5]
+    if len(sys.argv) != 6:
+        print("Usage: python script.py <radiusLen> <redisHost> <redisPwd> <redisPort> <redisIdx>")
+        sys.exit(1)
 
-startTime = time.perf_counter()
+    radiusLenStr = sys.argv[1]
+    radiusLen = float(radiusLenStr)
 
-# 鍒涘缓涓�涓繛鎺ユ睜
-pool = redis.ConnectionPool(host=redisHost, port=int(redisPort), password=redisPwd, db=int(redisIdx))
-r = redis.Redis(connection_pool=pool)
+    redisHost = sys.argv[2]
+    redisPwd = sys.argv[3]
+    redisPort = sys.argv[4]
+    redisIdx = sys.argv[5]
 
-codeMatrixStr = r.get('KV.AGV_MAP_ASTAR_CODE_FLAG.1')
-codeMatrix = np.array(json.loads(codeMatrixStr))
+    startTime = time.perf_counter()
 
-cdaMatrixStr = r.get('KV.AGV_MAP_ASTAR_CDA_FLAG.1')
-cdaMatrix = np.array(json.loads(cdaMatrixStr))
+    # 鍒涘缓涓�涓繛鎺ユ睜
+    pool = redis.ConnectionPool(host=redisHost, port=int(redisPort), password=redisPwd, db=int(redisIdx))
+    r = redis.Redis(connection_pool=pool)
 
-dynamicMatrixStr = r.get('KV.AGV_MAP_ASTAR_DYNAMIC_FLAG.1')
-dynamicMatrix = np.array(json.loads(dynamicMatrixStr))
+    # 鑾峰彇骞跺姞杞� codeMatrix
+    codeMatrixStr = r.get('KV.AGV_MAP_ASTAR_CODE_FLAG.1')
+    if codeMatrixStr is None:
+        print("Error: 'KV.AGV_MAP_ASTAR_CODE_FLAG.1' not found in Redis.")
+        sys.exit(1)
+    codeMatrix = np.array(json.loads(codeMatrixStr))
 
-waveMatrix = initWaveMatrix()
+    # 鑾峰彇骞跺姞杞� cdaMatrix
+    cdaMatrixStr = r.get('KV.AGV_MAP_ASTAR_CDA_FLAG.1')
+    if cdaMatrixStr is None:
+        print("Error: 'KV.AGV_MAP_ASTAR_CDA_FLAG.1' not found in Redis.")
+        sys.exit(1)
+    cdaMatrix = np.array(json.loads(cdaMatrixStr))
 
-# # 浣跨敤 numpy 鍔犻�熺殑浠g爜
-process_dynamic_matrix(dynamicMatrix, codeMatrix)
+    # 鑾峰彇骞跺姞杞� dynamicMatrix
+    dynamicMatrixStr = r.get('KV.AGV_MAP_ASTAR_DYNAMIC_FLAG.1')
+    if dynamicMatrixStr is None:
+        print("Error: 'KV.AGV_MAP_ASTAR_DYNAMIC_FLAG.1' not found in Redis.")
+        sys.exit(1)
+    dynamicMatrix = np.array(json.loads(dynamicMatrixStr))
 
-# for x in range(dynamicMatrix.shape[0]):
-#     for y in range(dynamicMatrix.shape[1]):
-#         data = dynamicMatrix[x, y]
-#         vehicle = data['vehicle']
-#         if vehicle != '0' and vehicle != '-1':
-#             getWaveScopeByCode(x, y)
+    # 鍒濆鍖� waveMatrix
+    waveMatrix = initWaveMatrix()
 
-# 灏� numpy.ndarray 杞崲涓哄祵濂楀垪琛�
-waveMatrixList = waveMatrix.tolist()
-# 灏嗗祵濂楀垪琛ㄨ浆鎹负 JSON 瀛楃涓�
-waveMatrixJsonStr = json.dumps(waveMatrixList)
+    # 澶勭悊 dynamicMatrix
+    process_dynamic_matrix(dynamicMatrix, codeMatrix)
 
-r.set("KV.AGV_MAP_ASTAR_WAVE_FLAG.1",waveMatrixJsonStr)
+    # 灏� numpy.ndarray 杞崲涓哄祵濂楀垪琛�
+    waveMatrixList = waveMatrix.tolist()
+    # 灏嗗祵濂楀垪琛ㄨ浆鎹负 JSON 瀛楃涓�
+    waveMatrixJsonStr = json.dumps(waveMatrixList)
 
-end = time.perf_counter()
-# print('绋嬪簭杩愯鏃堕棿涓�: %s Seconds' % (end - startTime))
-print("1")
+    # 灏嗙粨鏋滀繚瀛樺洖 Redis
+    r.set("KV.AGV_MAP_ASTAR_WAVE_FLAG.1", waveMatrixJsonStr)
 
+    end = time.perf_counter()
+    # 鎵撳嵃绋嬪簭杩愯鏃堕棿
+#     print(f"绋嬪簭杩愯鏃堕棿涓�: {end - startTime} Seconds")
+    print("1")
+
+if __name__ == "__main__":
+    main()
\ No newline at end of file

--
Gitblit v1.9.1