From 418c07bf5bb7e27d124cac00cf867039fad9060e Mon Sep 17 00:00:00 2001 From: luxiaotao1123 <t1341870251@163.com> Date: 星期六, 21 十二月 2024 11:25:24 +0800 Subject: [PATCH] # --- zy-acs-manager/src/main/resources/agv.py | 174 +++++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 117 insertions(+), 57 deletions(-) diff --git a/zy-acs-manager/src/main/resources/agv.py b/zy-acs-manager/src/main/resources/agv.py index 245bb6e..23d4dd6 100644 --- a/zy-acs-manager/src/main/resources/agv.py +++ b/zy-acs-manager/src/main/resources/agv.py @@ -1,10 +1,11 @@ import ast +import multiprocessing import sys import numpy as np import json import time import redis -from collections import deque +from collections import deque, defaultdict radiusLen = None @@ -12,9 +13,11 @@ def convert_to_float_array(str_array): if isinstance(str_array, str): return np.array(ast.literal_eval(str_array), dtype=float) - return str_array + elif isinstance(str_array, list) or isinstance(str_array, np.ndarray): + return np.array(str_array, dtype=float) + return np.array([], dtype=float) -def getWaveScopeByCode_iterative(x, y): +def getWaveScopeByCode_iterative(x, y, codeMatrix, cdaMatrix, radiusLen): """ 浣跨敤骞垮害浼樺厛鎼滅储锛圔FS锛夋潵浠f浛閫掑綊锛屼互閬垮厤閫掑綊娣卞害杩囧ぇ鐨勯棶棰樸�� """ @@ -66,11 +69,11 @@ return includeList -def find_value_in_matrix(value): +def find_value_in_matrix(value, codeMatrix): indices = np.where(codeMatrix == value) return list(zip(indices[0], indices[1])) -def initWaveMatrix(): +def initWaveMatrix(codeMatrix): waveMatrix = np.empty_like(codeMatrix, dtype=object) for x in range(codeMatrix.shape[0]): @@ -102,12 +105,12 @@ # 纭繚姣忎釜瀛楀吀鍖呭惈鎵�鏈夊瓧娈� structured_list = [] for row in dynamicMatrix: - for d in row: - # 鎻愬彇瀛楁锛岀‘淇� 'time' 瀛樺湪锛屽惁鍒欒缃负榛樿鍊硷紙渚嬪 0.0锛� - serial = d.get('serial', 0) - vehicle = d.get('vehicle', '0') - time_val = d.get('time', 0) - structured_list.append((serial, vehicle, time_val)) + for d in row: + # 鎻愬彇瀛楁锛岀‘淇� 'time' 瀛樺湪锛屽惁鍒欒缃负榛樿鍊硷紙渚嬪 0锛� + serial = d.get('serial', 0) + vehicle = d.get('vehicle', '0') + time_val = d.get('time', 0) + structured_list.append((serial, vehicle, time_val)) # 灏嗗祵濂楃殑鍒楄〃杞崲涓虹粨鏋勫寲鏁扮粍 structured_array = np.array(structured_list, dtype=dtype) @@ -115,9 +118,7 @@ return structured_array.reshape(len(dynamicMatrix), -1) # 浣跨敤 numpy 鍔犻�熺殑浠g爜 -def process_dynamic_matrix(dynamicMatrix, codeMatrix): - global waveMatrix # 纭繚 waveMatrix 鏄叏灞�鍙橀噺 - +def process_dynamic_matrix(dynamicMatrix, codeMatrix, cdaMatrix, radiusLen, waveMatrix): # 灏� dynamicMatrix 杞崲涓虹粨鏋勫寲鏁扮粍 dynamicMatrix = convert_to_structured_array(dynamicMatrix) @@ -133,10 +134,54 @@ # 閬嶅巻婊¤冻鏉′欢鐨勫潗鏍� for x, y in zip(x_indices, y_indices): vehicle = dynamicMatrix[x][y]['vehicle'] - includeList = getWaveScopeByCode_iterative(x, y) + includeList = getWaveScopeByCode_iterative(x, y, codeMatrix, cdaMatrix, radiusLen) for include in includeList: originWave = waveMatrix[include['x']][include['y']] waveMatrix[include['x']][include['y']] = mergeWave(originWave, vehicle) + + return waveMatrix + +def process_chunk(chunk, dynamicMatrix, codeMatrix, cdaMatrix, radiusLen): + """澶勭悊鏁版嵁鍧楃殑鍑芥暟锛岃繑鍥為渶瑕佸悎骞剁殑 (x, y, vehicle) 鍒楄〃""" + local_wave_updates = [] + for data in chunk: + x, y = data # 鍋囪姣忎釜鏁版嵁椤瑰寘鍚玿鍜寉鍧愭爣 + vehicle = dynamicMatrix[x][y]['vehicle'] + includeList = getWaveScopeByCode_iterative(x, y, codeMatrix, cdaMatrix, radiusLen) + for include in includeList: + local_wave_updates.append((include['x'], include['y'], vehicle)) + return local_wave_updates + +def process_dynamic_matrix_parallel(dynamicMatrix, codeMatrix, cdaMatrix, radiusLen): + # 灏� dynamicMatrix 杞崲涓虹粨鏋勫寲鏁扮粍 + dynamicMatrix = convert_to_structured_array(dynamicMatrix) + + # 鍒涘缓甯冨皵鎺╃爜 + mask = (dynamicMatrix['vehicle'] != '0') & (dynamicMatrix['vehicle'] != '-1') + x_indices, y_indices = np.where(mask) + + # 灏嗘弧瓒虫潯浠剁殑鍧愭爣缁勫悎鎴愪换鍔★紝姣忎釜浠诲姟鍖呭惈涓�涓暟鎹潡 + tasks = list(zip(x_indices, y_indices)) +# num_processes = multiprocessing.cpu_count() + num_processes = 5 + chunk_size = max(1, len(tasks) // num_processes) + chunks = [tasks[i:i + chunk_size] for i in range(0, len(tasks), chunk_size)] + + all_results = [] # 瀛樺偍鎵�鏈夎繘绋嬬殑缁撴灉 + + # 璁剧疆杩涚▼姹� + with multiprocessing.Pool(processes=num_processes) as pool: + # 浣跨敤map鏂规硶骞惰澶勭悊浠诲姟 + results = pool.starmap(process_chunk, [(chunk, dynamicMatrix, codeMatrix, cdaMatrix, radiusLen) for chunk in chunks]) + for result in results: + all_results.extend(result) + + # 浣跨敤 defaultdict 鏉ユ敹闆嗘瘡涓� (x, y) 瀵瑰簲鐨勬墍鏈� vehicle + wave_updates = defaultdict(set) + for x, y, vehicle in all_results: + wave_updates[(x, y)].add(vehicle) + + return wave_updates def main(): global radiusLen, codeMatrix, cdaMatrix, waveMatrix # 澹版槑涓哄叏灞�鍙橀噺 @@ -146,7 +191,11 @@ sys.exit(1) radiusLenStr = sys.argv[1] - radiusLen = float(radiusLenStr) + try: + radiusLen = float(radiusLenStr) + except ValueError: + print("Error: radiusLen must be a float.") + sys.exit(1) redisHost = sys.argv[2] redisPwd = sys.argv[3] @@ -155,49 +204,60 @@ startTime = time.perf_counter() - # 鍒涘缓涓�涓繛鎺ユ睜 - pool = redis.ConnectionPool(host=redisHost, port=int(redisPort), password=redisPwd, db=int(redisIdx)) - r = redis.Redis(connection_pool=pool) + try: + # 鍒涘缓涓�涓繛鎺ユ睜 + pool = redis.ConnectionPool(host=redisHost, port=int(redisPort), password=redisPwd, db=int(redisIdx)) + r = redis.Redis(connection_pool=pool) - # 鑾峰彇骞跺姞杞� 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.") + # 鑾峰彇骞跺姞杞� 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.decode('utf-8')), dtype=str) + + # 鑾峰彇骞跺姞杞� 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.decode('utf-8')), dtype=object) + + # 鑾峰彇骞跺姞杞� 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.decode('utf-8')), dtype=object) + + # 鍒濆鍖� waveMatrix + waveMatrix = initWaveMatrix(codeMatrix) + + # 璋冪敤骞惰澶勭悊鐨勫嚱鏁� + wave_updates = process_dynamic_matrix_parallel(dynamicMatrix, codeMatrix, cdaMatrix, radiusLen) + + # 搴旂敤鎵�鏈夋洿鏂板埌 waveMatrix + for (x, y), vehicles in wave_updates.items(): + originWave = waveMatrix[x][y] + for vehicle in vehicles: + originWave = mergeWave(originWave, vehicle) + waveMatrix[x][y] = originWave + + # 灏� numpy.ndarray 杞崲涓哄祵濂楀垪琛� + waveMatrixList = waveMatrix.tolist() + # 灏嗗祵濂楀垪琛ㄨ浆鎹负 JSON 瀛楃涓� + waveMatrixJsonStr = json.dumps(waveMatrixList) + + # 灏嗙粨鏋滀繚瀛樺洖 Redis + r.set("KV.AGV_MAP_ASTAR_WAVE_FLAG.1", waveMatrixJsonStr) + + end = time.perf_counter() + # 鎵撳嵃绋嬪簭杩愯鏃堕棿 +# print(f"绋嬪簭杩愯鏃堕棿涓�: {end - startTime} Seconds") + print("1") + except Exception as e: + print(f"An error occurred: {e}") sys.exit(1) - codeMatrix = np.array(json.loads(codeMatrixStr)) - - # 鑾峰彇骞跺姞杞� 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)) - - # 鑾峰彇骞跺姞杞� 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)) - - # 鍒濆鍖� waveMatrix - waveMatrix = initWaveMatrix() - - # 澶勭悊 dynamicMatrix - process_dynamic_matrix(dynamicMatrix, codeMatrix) - - # 灏� numpy.ndarray 杞崲涓哄祵濂楀垪琛� - waveMatrixList = waveMatrix.tolist() - # 灏嗗祵濂楀垪琛ㄨ浆鎹负 JSON 瀛楃涓� - waveMatrixJsonStr = json.dumps(waveMatrixList) - - # 灏嗙粨鏋滀繚瀛樺洖 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