☰
生物启发神经网络(BINN)在多AUV目标搜索中的建模与仿真
2026/10/11 20:13:06 网站建设 项目流程

简介:一篇发表于《舰船电子工程》的学术论文,针对多自治水下机器人(AUV)在复杂水域中能量受限、单机难以高效完成目标搜索的问题,提出基于生物启发神经网络(BINN)的协作搜索算法。文中将水下栅格地图与神经网络结构一一对应,利用神经元活性输出值分布规划路径:目标产生全局吸引,障碍物产生局部排斥,使AUV无需预训练即可自适应规划出高效搜索路径。通过静态与动态环境仿真验证了算法在搜索效率、实时性和避障方面的有效性,并与传统全覆盖搜索、边界搜索等方法做了对比说明。资源仅包含1个PDF文件,压缩包大小约1.66MB,原文含完整公式、仿真图表与参考文献,适合从事水下机器人、多智能体协作、仿生智能算法等方向的研究生或工程师参考学习。已有183人浏览学习,可作为相关课题的入门导读或方法比对材料。

1. 多AUV目标搜索里的生物启发神经网络:它解决的是「往哪走」,而不是「怎么走」

三台 AUV 下到一片陌生水域,声通信带宽捉襟见肘,没有先验海图,目标可能出现在任意位置。如果按预设航线来回扫,扫完一遍可能一无所获;如果让每台 AUV 各自跑 A* 规划最优搜索路径,规划结果还没下发,洋流和目标位置的先验不确定性早就把路径变成了废纸。基于生物启发神经网络的多 AUV 目标搜索方案,解决的核心问题是「下一格往哪走」:把搜索区域摊成一张神经元网格,目标持续注入激励,障碍和已扫区域注入抑制,每台 AUV 沿着周围活性值最高的方向前进,从而自然形成分散搜索、趋近目标、再散布的循环。这个方案计算量小、天然支持分布式决策,很适合做水下集群搜索的仿真验证和样机预研。

2. 把搜索区域变成一张活性值地图:BINN 的建模与递推公式

2.1 为什么 AUV 目标搜索偏偏选了 BINN 这套机制

生物启发神经网络(BINN)在机器人路径规划里其实是被验证过的老方法,但它在多 AUV 目标搜索场景下有三个别的规划器很难同时满足的特性。

第一是不需要全局地图重规划。A* 和 RRT 系方法必须先有一张静态地图,算法执行中地图一旦变化,就得重新规划。水下环境里障碍物可能是浮游物、其他 AUV 临时占位,目标位置也是搜索过程中逐步确认的,BINN 的活性值地图是逐拍递推更新的,某个格子变成障碍或在某处新发现目标,只需要修改那一格的外部输入,后续递推自动把变化传播出去。第二是计算量极低,每拍只做一次邻域加权求和加一次标量递推,一个 50×50 的网格,三台 AUV 全部决策在普通笔记本上跑完一拍只要几毫秒,这让它可以直接在低算力的 AUV 载板上执行。第三是它天然分布式,每台 AUV 维护自己的活性值地图,决策只依赖本地邻域的活性值,不依赖中央节点统一规划,这正好匹配水声通信窄带、拓扑频繁变化的现实。

BINN 的另一个隐性优势是活性值地图本身就是全局场,不存在势场法那种局部极小陷阱。势场法把目标设为引力点、障碍设为斥力点,AUV 经常被夹在两个障碍之间来回震荡;而 BINN 的激励在网格上以波前形式传播,邻域连接权重随距离衰减,活性值天然形成单峰连续场,沿着梯度下降能自然绕开障碍,活性值最高点始终是最新发现的目标位置。

2.2 活性值递推公式与每个符号的作用

BINN 的核心是一个分流抑制神经元模型,每个网格对应一个神经元,神经元之间按邻域连接。活性值递推方程如下:

dxi/dt = -A·xi + (B - xi)·( [Ii]+ + Σj∈N(i) wij·[xj]+ ) - (D + xi)·( [Ii]- + Σj∈N(i) wij·[xj]- )

其中[u]+ = max(u, 0)表示只取正部,[u]- = max(-u, 0)表示只取负部。A 是衰减率,决定活性值在没有外部激励时回落到 0 的速度;B 是活性上界,D 是活性下界,这两个参数把每个神经元的输出严格限制在[-D, B]区间内,保证数值有界、不发散。

wij是神经元 i 和邻域神经元 j 之间的连接权重,常见做法是取随距离衰减的形式:

wij = exp(-λ · dist(i, j))

其中 λ 是传播衰减系数,λ 越大,激励能传播的半径越小,活性值越「局域」;λ 越小,活性值扩散范围越广。邻域范围一般取半径 1 到 2 的八邻域,再远的格子权重已经衰减到 0.1 以下,对决策的贡献可以忽略。

外部输入Ii是关键,它分正负两个方向发挥作用:目标位置给Ii = +E,障碍物位置给Ii = -E,已搜索区域给一个小幅负激励。正激励通过正部项向上拉高活性值,并借助邻域连接向四周扩散;负激励通过负部项压低活性值,形成天然排斥区。

2.3 目标、障碍与已搜索区域如何注入激励

实际操作时,我一般把网格分为四类:自由区域、目标点、障碍物、已搜索区域。每一拍更新活性值之前,先重新计算外部输入矩阵:

I = np.zeros_like(grid) I += E_TARGET * target_mask # 目标点给固定正激励 I += -E_OBST * obstacle_mask # 障碍物给固定负激励 I += -E_SEARCHED * searched_mask # 已搜索区给临时负激励 I += -E_AUV_NEIGH * auv_mask # 其他 AUV 当前位置给临时负激励

目标激励E_TARGET不需要设得很大,一般 1.5 到 3.0 就够,因为激励会在网格上以波前形式向外扩散,目标点本身的峰值并不重要,重要的是传播出去之后的梯度方向。障碍激励E_OBST要略大于目标激励的次级传播值,否则障碍旁边的格子活性仍然可能高于周边,AUV 会一头顶上去。已搜索区域抑制E_SEARCHED是防止 AUV 反复逛同一片水域的关键,但注意不能让已搜索格子的抑制永久生效,否则漏检目标会永远不会被重新访问。

2.4 活性值波前传播与搜索引导的形成

初始化完毕后,目标点的正激励会逐步扩散到周围格子,形成一圈从目标向外递减的活性值等高线。AUV 每拍做的事情很简单:查看当前格子周围八邻域的活性值,选择活性值最高的那个格子移动进去。当 AUV 越接近目标时,周围的活性值梯度越陡,相当于「闻到气味越来越浓」;当目标被搜索过之后,目标激励会被移除,该区域转入已搜索抑制状态,活性值尖峰消失,AUV 不再往回走,转而去其他活性值相对高的区域继续搜索。

这一节内容有点抽象,下一章先讲多 AUV 层面的协同,把状态机、避碰和通信约束叠加上去,第四章给出完整可跑的最小仿真代码,参数与这里一一对应。

3. 多AUV 协同搜索框架:任务分工、避碰与通信受限下的状态切换

3.1 多 AUV 搜索为什么必须做分工而不是各行其是

把三台 AUV 直接丢进同一张活性值地图里,各走各的梯度,最常见的结局是它们全部涌向同一个目标方向,因为目标激励的传播是各向同性的,三台 AUV 看到的梯度方向几乎一样。这就引出了协同搜索的第一个核心问题:如何制造差异化。

常见做法是在活性值地图之外加一个分工层。每台 AUV 在决策时不仅要看活性值,还要看区域被访问的频次。具体做法是把网格按 AUV 数量切分成扇形扇区或按距离加权分配给不同 AUV,每台 AUV 对非自己负责区域的目标激励乘一个折扣系数β(0.6 左右),对负责区域保持全激励。这样目标出现的位置如果在自己责任区内,激励最强,AUV 会优先响应;其他 AUV 对该目标的响应被削弱,但仍保留一定的跟随能力,避免漏掉自己责任区以外的重大发现。这种方式不需要通信协调,是典型的分布式任务分配。

另一个更工程化的良方案是起始位置差异化加上活性值地图独立维护。每台 AUV 只维护自己观测到的目标激励、障碍激励和已搜索抑制,不共享整张图。当声通信链路可用时,只把各自发现的目标位置和已经搜过的区域位图压缩后发给邻居,其余时间各自决策。由于初始位置不同、已搜索区域不同,两台 AUV 的活性值地图天然存在差异,搜索轨迹不会重叠太多。

3.2 AUV 状态机:搜索、趋近与确认回收

我给每台 AUV 定义三个状态:搜索态、趋近态、确认态。搜索态下,AUV 按照活性值梯度自由搜索,目标是最大化覆盖面积;当自身位置周围 N 个格子的平均活性值连续超过某个阈值θ_detect,判定「发现疑似目标」,切换为趋近态。趋近态下,AUV 不再按照局部梯度逐步走,而是直接用更快的速度向活性值峰值点直线移动,此时如果活性值峰值在移动过程中消失(目标可能是误报或已被其他 AUV 回收),回退搜索态。确认态发生在 AUV 到达活性值峰值格子附近时,在该格子执行悬停观测、声呐扫描或光学探测,完成后把该格子的目标激励移除,标记为已搜索区域,回到搜索态。

阈值θ_detect的大小直接影响系统行为:设得太大,AUV 冲到目标面前还不切换状态,起不到加速趋近作用;设得太小,活性值地图上的噪声毛刺就会触发状态切换,AUV 反复横跳。我一般会设为目标传播峰值的三分之一左右,初次运行看轨迹图再微调。这个状态机三态之间不允许跳级,比如从搜索态直接切换到确认态会让目标置信度信息完全丢失。

3.3 避碰与已搜索区域的恢复机制

多 AUV 协同搜索的第二个坎是避碰。BINN 网格天然能处理静态障碍物,但 AUV 之间是动态障碍物,需要在每一拍把其他 AUV 的当前位置临时注入到自己的活性值地图里,作为临时负激励源。我给这个临时抑制设置了一个影响半径r_collision_avoid,通常取网格间距的 2 倍,E_AUV_NEIGH取E_OBST的 0.7 倍,太大会让 AUV 互相绕行产生剧烈振荡,太小在高速趋近状态下会撞上。

已搜索区域的抑制不能永久保留,否则漏检目标所在的格子被永久压成低活性区,这个目标永远不会被重新搜索。我一般让已搜索抑制按时间衰减,每拍在活性值递推前对searched_mask做一次衰减:

E_SEARCHED_current(t) = E_SEARCHED_current(t-1) - DECAY_REVISIT · E_SEARCHED

当E_SEARCHED_current衰减到 0.1 倍初始值以下时,从 mask 中清除该格子,活性值自动回升。DECAY_REVISIT取 0.01 到 0.05 之间,表示大约 20 到 100 拍后格子重新可搜索。这个恢复机制是很多复现 BINN 的文章不会提的,但对真实多目标搜索很重要——漏检率低的目标搜索任务里,每个格子都可能藏第二个目标。

3.4 窄带声通信下的数据交换策略

水面上的多机器人协同可以用 WiFi 随便广播,水下不行。水声通信典型速率只有几百字节每秒,还要考虑传输时延和误码。把整张 50×50 活性值图广播出去,一拍就占满信道。常见做法是只交换两种数据:目标位置列表和已搜索区域位图。目标位置列表很小,每个目标一个二维坐标加置信度,占用不超过几十字节;已搜索区域位图可以用位压缩或 Run-Length Encoding 编码,50×50 网格压缩后不到 200 字节。

同步周期上,我建议不要每拍同步,而是每T_sync = 20拍做一次数据交换。过于频繁同步会让多台 AUV 的活性值地图逐渐趋同,失去差异化搜索的意义。过于稀疏同步则会让 AUV 重复搜索同伴早已搜过的区域。T_sync 与 AUV 速度、网格间距的关系可以近似用公式估计:T_sync = 网格间距 × 2 / 最大航速,保证一台 AUV 在两次同步之间不会跑出超过两个格子的范围。

4. 跑通一个最小仿真:搭建 BINN-AUV 搜索集群的关键代码

4.1 仿真环境与参数初始化

下面这个 Python 仿真是我最常用的最小复现骨架,网格 50×50,三台 AUV,两个目标点,一个障碍区。代码不依赖任何重型库,只需要 numpy 和 matplotlib。把这段存成binn_search.py,运行后能看到活性值热力图、AUV 轨迹和目标发现过程。

import numpy as np import matplotlib.pyplot as plt # ========== 参数区 ========== GRID_W, GRID_H = 50, 50 # 网格尺寸 N_AUV = 3 # AUV 数量 N_TARGET = 2 # 目标数量 T_MAX = 300 # 最大迭代步数 DT = 0.5 # 离散时间步长 A = 1.0 # 活性衰减率 B = 1.0 # 活性上界 D = 1.0 # 活性下界 LAMBDA = 0.8 # 邻域权重衰减系数 E_TARGET = 2.0 # 目标激励强度 E_OBST = 2.0 # 障碍激励强度 E_SEARCHED = 0.5 # 已搜索区抑制强度 E_AUV = 1.4 # 动态避碰抑制强度 DECAY_REVISIT = 0.02 # 已搜索抑制恢复率 # ========== 环境初始化 ========== x_grid = np.zeros((GRID_W, GRID_H)) # 活性值地图 I_ext = np.zeros((GRID_W, GRID_H)) # 外部输入 obstacle_mask = np.zeros_like(x_grid, dtype=bool) searched_mask = np.zeros_like(x_grid, dtype=bool) # 放置障碍物:一个斜向条状障碍区 for di in range(20): obstacle_mask[30 + di // 3, 20 + di % 5] = True # 目标点 targets = [(12, 38), (36, 15)] for t in targets: x_grid[t] = E_TARGET # AUV 初始位置 auvs = [(8, 8), (8, 42), (42, 8)] auv_states = ["search"] * N_AUV searched_count = np.zeros((GRID_W, GRID_H))

逻辑说明:targets和auvs的坐标是(行, 列),目标点写进x_grid作为初始活性值种子,这样目标激励从第一步就开始向外传播。obstacle_mask在初始化时生成后保持不变。运行之前把参数区单独拿出来,便于后续调整 A、LAMBDA、E_TARGET 几个核心变量。

4.2 邻域权重与活性值半隐式递推

活性值递推直接用显式欧拉法容易在邻域激励很强时出现振荡甚至发散。我用的方案是半隐式离散化:把等式右边含xi的部分移到下一拍,其余激励项用当前拍的值,这样更新公式恒有界,不需要额外钳制。

def compute_neighbor_excitation(grid, lamb): """返回每个格子的邻域加权激励,包含正部和负部分别计算""" from numpy.lib.stride_tricks import sliding_window_view padded = np.pad(grid, 1, mode='constant') win = sliding_window_view(padded, (3, 3)) # 八邻域权重矩阵,中心为 0(不包含自身),距离越远权重越小 weight = np.zeros((3, 3)) for dx in range(-1, 2): for dy in range(-1, 2): weight[dx + 1, dy + 1] = np.exp(-lamb * np.sqrt(dx**2 + dy**2)) weight[1, 1] = 0.0 # 对每个窗口做加权求和,得到每个格子的邻域激励 exc = np.sum(win * weight, axis=(2, 3)) return exc def update_activity(grid, I_ext, dt, A, B, D, lamb): # 拆分外部输入正部与负部 pos_ext = np.maximum(I_ext, 0.0) neg_ext = np.maximum(-I_ext, 0.0) # 邻域输出的正部与负部 neighbor_pos = compute_neighbor_excitation(np.maximum(grid, 0.0), lamb) neighbor_neg = compute_neighbor_excitation(np.maximum(-grid, 0.0), lamb) P = pos_ext + neighbor_pos Q = neg_ext + neighbor_neg # 半隐式更新:分母包含衰减项 A 和负部激励项 Q new_grid = (grid + dt * (B * P)) / (1 + dt * (A + Q)) return np.clip(new_grid, -D, B)

逻辑说明:compute_neighbor_excitation用滑窗把每个格子的八邻域做一次加权求和,权重矩阵中心为 0,确保格子自身的活性值不会因为邻域求和而重复增强。update_activity中的半隐式分母1 + dt·(A + Q)保证任意大外部激励都不会把活性值推超过 B,同时衰减项 A 在分母里生效,迭代过程天然稳定。这里要注意weight矩阵是对称的,两个方向上的激励传播速率一致,如果你想让目标发现后的响应更快,可以加大lamb的倒数而不是直接加大E_TARGET。

4.3 AUV 决策与主循环

每台 AUV 的决策分为两步:先看自己所在格子的邻域活性值找最大方向,然后结合状态机决定是否移动。目标发现条件采用「邻域活性值峰值超过阈值 θ」而不是「恰好走到目标格子上」,这样更符合真实声呐探测有一定作用距离的情况。

def decision(grid, pos, theta_detect=0.8): x, y = pos neighbors = [] for dx in (-1, 0, 1): for dy in (-1, 0, 1): nx, ny = x + dx, y + dy if 0 <= nx < GRID_W and 0 <= ny < GRID_H and (dx, dy) != (0, 0): neighbors.append((nx, ny, grid[nx, ny])) neighbors.sort(key=lambda t: t[2], reverse=True) nx, ny, val = neighbors[0] if val > theta_detect: return "approach", (nx, ny), val return "search", (nx, ny), val # ========== 主循环 ========== for step in range(T_MAX): # 1. 构建外部输入 I_ext.fill(0.0) for t in targets: if not t_searched[t]: I_ext[t] += E_TARGET # 障碍物按原始 mask 注入 I_ext[obstacle_mask] -= E_OBST # 已搜索区域按当前剩余抑制强度注入 I_ext[searched_mask] -= E_SEARCHED * (searched_count[searched_mask] > 0) # 其他 AUV 当前位置注入避碰抑制 for i, pos in enumerate(auvs): x, y = pos for dx in range(-2, 3): for dy in range(-2, 3): nx, ny = x + dx, y + dy if 0 <= nx < GRID_W and 0 <= ny < GRID_H: I_ext[nx, ny] -= E_AUV * np.exp(-0.5 * (dx**2 + dy**2)) # 2. 更新活性值地图 x_grid = update_activity(x_grid, I_ext, DT, A, B, D, LAMBDA) # 3. 每台 AUV 决策并移动 for i, (pos, state) in enumerate(zip(auvs, auv_states)): new_state, next_pos, val = decision(x_grid, pos) auv_states[i] = new_state auvs[i] = next_pos # 标记当前格子为已搜索 searched_mask[next_pos] = True searched_count[next_pos] += 1 # 若趋近到的格子与目标重合,记录发现 for t in targets: if next_pos == t: t_searched[t] = True

逻辑说明:主循环每拍做三件事,先根据当前所有环境要素重建外部输入矩阵I_ext,再递推更新整张活性值地图,最后让每台 AUV 各自决策移动。注意已搜索区域的抑制强度跟searched_count成正比,被重复搜索越多次的格子抑制越强。这个写法直观复现了前文的分工逻辑——目标激励是正源,障碍与同伴是负源,已搜索区是慢慢衰减的临时负源。t_searched用来在目标被回收后移除正激励,避免 BINN 的波前反复向已经回收掉的目标点传播。

实际运行这套代码时,你会观察到 AUV 从初始位置向目标方向散开,活性值热力图上有两个明显的高亮色斑,AUV 轨迹绕开障碍区并最终汇聚到两个目标点附近。这里有一个容易忽略的细节:DT=0.5配合A=1.0时,活性值传播速度大约每拍一个网格,如果想加快搜索覆盖速度,把DT加到 0.8 能明显提升波前传播速率,但继续加大可能出现活性值波动,需要结合下一章的调参经验来判断。

5. 参数陷阱与 5 条避坑记录:BINN 多 AUV 仿真最容易翻车的地方

5.1 活性值全图飘红,目标点和障碍物完全无法区分

现象:热力图整个背景都是接近 0.9 以上的红色,活性值的梯度方向是随机的,AUV 轨迹看起来像布朗运动,目标发现率极低。

原因:外部输入矩阵里有额外的正偏置没有被对消。最常见的是目标数量多时,目标激励在网格上的叠加区域重叠,多个目标的正激励波前相互叠加,把全局背景都抬起来;另一个常见原因是已搜索抑制E_SEARCHED设得过小,负激励几乎不起作用,活性值长期停留在邻域传播的高位。

解决:先把目标激励E_TARGET砍到 1.0 左右,再观察热力图,确认目标点周围的色斑半径在 3 到 5 个网格之间。如果全图背景仍然过高,检查是否把目标点的I_ext注入到了x_grid里而不是只放在外部输入矩阵——目标激励只能通过外部输入在递推中起作用,直接写进初始那张图会让它的扩散变成永久源。

5.2 加大 DT 提高传播速度后,活性值开始震荡

现象:DT=0.8或更大时,目标点附近的活性值出现时高时低的抖动,热力图像呼吸一样闪烁,AUV 决策频繁被跳动的高亮干扰。

原因:显式欧拉离散化的稳定性条件被破坏。BINN 递推里包含 B、D、邻域激励 P 和 Q 多个乘性项,显式欧拉要求DT·(max(P) + A)远小于 1,目标激励强、邻域权重高时这个乘积很容易超过 0.3 触发震荡。

解决:要么把DT降回 0.2 到 0.5,要么改用半隐式递推(第四章代码用的就是半隐式,因此通常不会遇到这个问题)。如果必须用显式欧拉,公式是new = grid + DT * (右边项),此时加一个np.clip(..., -D, B)可以压住振幅,但治标不治本。我一般把半隐式作为默认实现,显式欧拉只用于验证递推方程本身。

5.3 三台 AUV 全部涌向同一个目标,剩下那个目标没人管

现象:仿真图上三台 AUV 的轨迹从不同起点出发,但最终都汇聚到第一个目标点;第二个目标点一直等不到 AUV,直到仿真结束都没有被发现。

原因:没有分工机制,或者分工机制的折扣系数失效。前一章提到责任区折扣系数 β 是让非责任区目标激励打折的,但如果你只做了扇区划分而没有按目标位置动态更新扇区,AUV 在自己的扇区里找不到目标时,扇形划分不会改变目标激励强度,所有 AUV 对远处两个目标的活性值积累几乎相同,最终同时选择第一个被波前覆盖的目标。

解决:在决策函数里加一个责任区权重图sector_weight,初始化时按 AUV 起始位置把网格图划分成 N 个 Voronoi 区域,每台 AUV 只对落在自己区域内的目标点保持全激励,区域外一律乘 0.5。另一个更简单的做法是让每台 AUV 在发现目标、自己进入趋近态后,把自己当前位置注入一个强负激励-3·E_TARGET,迫使同伴的活性值梯度转而指向其他目标。

5.4 已搜索区域抑制永久生效,漏检目标永远不会被重新访问

现象:仿真跑到后期,AUV 总是绕着几个固定小区域转圈,整个地图大面积没有被覆盖;因为某个目标出现在已搜索区域的边缘,活性值被负激励压制,AUV 经过几拍后不再朝它移动。

原因:E_SEARCHED的抑制在 update_activity 的递推中反复叠加。活性值递推是每拍从外部输入重建的,如果searched_mask在目标被搜索到之后完全没有被清除,负激励就永远存在,对应格子的活性值永远被压在-D附近。

解决:给已搜索区域加一个衰减周期。我一般在主循环里维护一个searched_count,每拍更新:

searched_count[searched_mask] = np.maximum( searched_count[searched_mask] - DECAY_REVISIT, 0.0) searched_mask = searched_count > 0.5

这样当searched_count降到 0.5 以下时,格子自动从 mask 中移除,活性值恢复。DECAY_REVISIT取值 0.02 到 0.05,对应 20 到 50 拍后重新可搜索。注意这个衰减不能放在update_activity内部做,因为活性值递推本身不维护 mask 的时序状态。

5.5 AUV 在趋近态和搜索态之间反复横跳

现象:AUV 轨迹呈现高频的锯齿状,活性值接近阈值时冲过去,下一拍活性值略降又退回来,目标点明明就在旁边却始终走不到。

原因:状态切换只有阈值门槛没有迟滞回路。当目标激励传播导致的邻域活性值刚好在theta_detect附近波动时,AUV 的决策函数会在「peak>θ」和「peak<θ」之间来回翻转,移动目标持续抖动。这是经典的阈值无迟滞问题。

解决:给状态切换加迟滞机制。进入趋近态的阈值是θ_on,退出趋近态的阈值是θ_off,且θ_off必须小于θ_on,比如θ_on = 0.8、θ_off = 0.4。AUV 一旦进入趋近态,即使活性值回落到 0.4,也继续保持趋近,只有跌到 0.4 以下且连续 N 拍(我一般取 10 拍)才退回搜索态。这样能消除绝大多数临界抖动,也让趋近过程更果断。另一个细节是确认态的进入条件:需要当前格子距离目标点小于等于 2 个网格距离加置信度判定,只靠活性值阈值会误报。

6. 验证方法与进阶用法:怎么证明你的搜索策略比随机扫海更值得投入

6.1 三张指标曲线

先定义三个能量化对比的指标,否则「算法效果好」只是一句没法复现的感觉。目标平均发现时间T_det:从仿真开始到每个目标被第一台 AUV 发现所用的时间步,求所有目标的均值,这是收敛速度的直接体现。区域覆盖率C(t):已搜索格子在总网格数中的占比随时间的变化曲线,看的是搜索效率,曲线斜率越来越平说明后续搜索边际收益下降。通信负载L:整个仿真过程所有 AUV 交换的数据包总量除以仿真时长,用来判断这套方案(尤其结合第 3.4 节同步策略)在真实水声信道下是否可行。

6.2 可复现的对比实验设置

固定随机种子,把「BINN 活性值引导」「纯随机游走」「预置扫描路径」三个策略跑 50 个随机目标分布,每个分布跑 5 遍取均值。随机游走基线要朴素一些,每拍随机选一个可达方向;预置扫描采用经典的 boustrophedon 路线,逐行扫过全场。这两条基线的价值在于确定下界和上界——如果 BINN 收敛速度连随机游走都不如,需要回到第 2 章重新审视激励注入是否失效。

6.3 两个值得延伸的进阶方向

第一个是把 BINN 活性值地图和贝叶斯目标概率地图结合:活性值提供搜索路径引导,贝叶斯后验提供目标存在概率,二者相乘得到真正的优先级图,对目标稀疏场景效果明显。另一个是针对多目标连续搜索场景,给已搜索抑制加非对称衰减——目标概率高的格子衰减更快,概率低的格子衰减更慢。我早期做样机试验时不重视这一点,真实 AUV 在近底搜索时经常重复扫已经没有价值的海底平原,浪费电池电量,后来把这个机制加上去,同等能耗下覆盖率提升明显。仿真正确不代表航行器就会听话,真机上声呐探测误差、水声定位误差都会扭曲活性值梯度,建议先在仿真里给目标坐标叠加高斯噪声,验证算法对位姿不确定性的容忍度,再考虑下海。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询