NumPy数组双智能体邻域查找与网格扩展填充问题求解
解决方案:智能体邻域扩展的精准实现
针对你的需求,核心是只聚焦当前已标记为1/2的单元格,筛选出它们未被占用的水平/垂直邻域,再实现每轮随机扩展的逻辑,以下是具体实现:
一、精准获取单个智能体的可用邻域
不用返回所有单元格的邻域,先定位智能体已占领的所有单元格,再逐个检查上下左右四个方向,过滤掉越界和已被标记的单元格,只保留可填充的空白邻域:
import numpy as np def get_available_neighbors(cell_map, agent_id): # 拿到当前智能体所有已标记的单元格坐标 agent_positions = np.argwhere(cell_map == agent_id) neighbors = [] # 水平/垂直四个方向 directions = [(-1,0), (1,0), (0,-1), (0,1)] for (x, y) in agent_positions: for dx, dy in directions: nx, ny = x + dx, y + dy # 检查是否在数组边界内,且单元格未被标记(值为0) if 0 <= nx < cell_map.shape[0] and 0 <= ny < cell_map.shape[1]: if cell_map[nx, ny] == 0 and (nx, ny) not in neighbors: neighbors.append((nx, ny)) return neighbors
二、实现每轮的随机扩展逻辑
每轮中,智能体先获取自己的可用邻域,随机选一个填充,更新数组后,新标记的单元格会自动成为下一轮的扩展起点:
import random def expand_agent(cell_map, agent_id): available = get_available_neighbors(cell_map, agent_id) if not available: print(f"FIGHTER_{agent_id} 没有可扩展的空间了") return cell_map # 随机挑一个邻域填充 nx, ny = random.choice(available) cell_map[nx, ny] = agent_id return cell_map # 初始化11×7的数组 cellMAP_0 = np.zeros((11, 7), dtype=int) # 生成两个不重复的随机起始点 start1 = (random.randint(0, 10), random.randint(0, 6)) start2 = start1 while start2 == start1: start2 = (random.randint(0, 10), random.randint(0, 6)) cellMAP_0[start1] = 1 cellMAP_0[start2] = 2 # 模拟多轮扩展(这里示例5轮) for round_idx in range(5): print(f"--- 第 {round_idx+1} 轮 ---") cellMAP_0 = expand_agent(cellMAP_0, 1) cellMAP_0 = expand_agent(cellMAP_0, 2) print(cellMAP_0)
核心细节说明
- 邻域去重:同一个空白单元格可能被多个已标记单元格的邻域覆盖,加入去重逻辑避免重复处理
- 边界校验:确保邻域坐标不会超出11行(0-10)、7列(0-6)的范围
- 动态扩展:每轮填充后,数组标记更新,下一轮的邻域查找会自动包含新标记的单元格,实现持续扩展
内容的提问来源于stack exchange,提问作者m k
相关产品推荐
相关产品推荐

