无人机烟幕干扰弹建模:运动学拆解与多机协同遮蔽优化
简介PDF格式的数学建模竞赛赛题方案资料围绕2025年高教社杯A题“烟幕干扰弹的投放策略”展开。资源面向参加数学建模竞赛的学生与指导教师聚焦无人机飞行方向、速度、干扰弹投放点与起爆点等变量的协同优化目标是通过建模和算法求解多型导弹威胁下的最优遮蔽策略。包体为单一PDF文件约317KB内容包含完整赛题原文及五个子问题的具体条件便于离线研读与赛前模拟。目前已有482人浏览学习适合作为赛题分析、模型训练和论文撰写的参考资料。读者可从中提取M1至M3导弹坐标、五架无人机位置及烟幕云团沉降速度等关键参数结合问题1至问题5逐步构建优化模型理解不同约束如投放间隔不低于1秒、速度70至140米每秒对有效遮蔽时长的影响。该PDF也适合用于复盘无人机投放策略类建模题的常见解法快速定位自身模型与题目要求的差距。1. 这个赛题在考什么一道把“时间轴”当主战场的数学建模题只看题目字面无人机投放烟幕干扰弹似乎就是算个抛物线和命中点的事。但真正上手会发现这道题的核心不是“弹往哪扔”而是“在导弹接近的几十秒里烟幕云团什么时候挡在视线通路上、能挡多久”。数学建模竞赛里这种连续时间窗口的遮蔽优化问题恰恰是最容易翻车的一类——你既要管几何遮挡又要管时间衔接还得同时协调多架无人机的速度和航向。本文用一个可复现的思路把这道题的建模、求解、验算和常见坑一次讲透适合备赛同学和有数值优化经验的从业者对照自查。2. 先立坐标系再谈模型导弹、无人机与烟幕云团的运动学拆解2.1 坐标系与关键对象假目标原点、真目标偏心与事件序列拿到题面第一件事不是急着写代码而是把坐标系钉死。题目给的信息很明确以假目标为原点水平面为 x y 平面真目标下底面圆心在 (0,200,0)半径 7 m、高 10 m。也就是说真目标不在原点它的中心在 y 方向偏移了 200 m这会让很多默认“保护目标就在原点”的惯性思维直接出错。坐标系确定之后需要把参与对象分成四类来袭导弹M1、M2、M3、无人机FY1 到 FY5、烟幕干扰弹、真假目标。每类对象的运动学属性不同——导弹是匀速直线飞行速度 300 m/s方向直指假目标无人机受领任务后可瞬时调整航向然后以 70~140 m/s 匀速等高直线飞行干扰弹脱离无人机后做抛体运动起爆后瞬时形成球状云团并以 3 m/s 匀速下沉。从时间维度看整个事件序列可以拆成几个阶段雷达发现导弹 → 控制中心指派任务 → 无人机转向并飞向预定航线 → 投放干扰弹 → 干扰弹飞行 → 起爆形成云团 → 云团下沉并遮蔽视线 → 遮蔽结束。任何一个环节的时间偏差都会改变遮蔽窗口的起止时刻。我一般会在建模文档里先画一张事件时间线表把所有固定参数和待优化变量分别列出来这样后面写约束条件时不会漏项。参数类别建模对象代表值说明固定参数导弹速度300 m/s匀速直线指向假目标固定参数云团下沉速度3 m/s起爆后瞬时形成球状云团固定参数有效遮蔽半径10 m云团中心 10 m 内有效固定参数有效遮蔽时长20 s浓度满足要求的时间窗口优化变量无人机速度70~140 m/s每架可不同一旦确定不再调整优化变量投放点坐标三维空间点干扰弹脱离无人机的位置优化变量起爆延迟≥0 s投放后经时间引信控制起爆2.2 运动学建模匀速直线、抛体运动与 3 m/s 下沉云团导弹的运动是最简单的。以 M1 为例初始位置 (20000, 0, 2000)速度 300 m/s方向指向假目标原点。设单位方向向量为 d则任意时刻导弹位置为 P_m(t) P_m0 v_m * t * d。无人机的运动类似但它是等高飞行z 坐标不变位置为 P_d(t) P_d0 v_d * (t - t_assign) * d_d其中 t_assign 是受领任务的时刻。干扰弹的运动要分两段处理。第一段是从投放点到起爆点做重力作用下的抛体运动。题目给的条件是“间隔 3.6 s 后起爆”但这里有个容易忽略的点——干扰弹脱离无人机时的初速度等于无人机当前速度矢量所以水平方向有初速、垂直方向有重力加速度。第二段是起爆后云团成形球状云团中心以 3 m/s 匀速下沉而且云团中心 10 m 范围内在起爆后 20 s 内有效。实际建模时很多队伍把干扰弹简化成“投放后竖直下落”的模型这是不严谨的——无人机的水平速度会直接影响起爆点的水平位置。正确的做法是把抛体运动写成完整的分段函数。import numpy as np def interceptor_trajectory(drop_pos, drone_velocity, burst_delay, g9.8): 计算烟幕干扰弹从投放到起爆的抛体轨迹。 参数: drop_pos: 投放点坐标 (x, y, z) drone_velocity: 无人机在投放时刻的速度矢量 (vx, vy, vz)vz 通常为 0 burst_delay: 投放后到起爆的时间间隔单位秒 g: 重力加速度默认 9.8 m/s^2 返回: burst_center: 起爆时刻云团中心坐标 # 抛体运动位移公式 x_burst drop_pos[0] drone_velocity[0] * burst_delay y_burst drop_pos[1] drone_velocity[1] * burst_delay z_burst drop_pos[2] drone_velocity[2] * burst_delay - 0.5 * g * burst_delay**2 return np.array([x_burst, y_burst, z_burst])这段代码的关键在于 drone_velocity 用的是投放时刻的瞬时速度而不是无人机巡航速度的标量值。因为无人机的航向一旦确定就不再改变所以投放时刻的速度矢量就是它全程飞行的速度矢量。z 方向通常设为 0因为题目明确规定无人机等高度飞行。g 取 9.8 m/s²如果某些资料里取 10结果会有轻微差异但不会影响最优策略的定性判断。2.3 “有效遮蔽”的几何判定视角锥、空间范围与 20 秒窗口有效遮蔽的判断是整个模型的核心判定条件。题目说“云团中心 10 m 范围内的烟幕浓度在起爆 20 s 内可为目标提供有效遮蔽”这句话需要拆成两个维度理解空间上导弹、云团中心、真目标三者要近似共线且云团中心到视线的距离小于等于 10 m时间上云团起爆后 20 s 内才有效超过 20 s 即便云团还在浓度也不够了。几何判定的具体做法是对某一时刻 t计算导弹位置 P_m(t)、真目标位置 P_t、云团中心 C(t) 三者之间的相对关系。先算云团中心到“导弹到真目标”这条直线的最短距离如果这个距离 ≤ 10 m且云团中心位于导弹和真目标之间通常是判断点积符号则认为这一时刻形成有效遮蔽。这里要注意真目标是一个半径 7 m、高 10 m 的圆柱体不是一个质点。严谨的做法是取圆柱体上若干个采样点分别判断是否被遮蔽只要有一个点可见导弹就仍然可能发现目标。但比赛中为了简化大部分队伍会把真目标简化为底面圆心 (0, 200, 0) 的代表点来处理遮蔽判定简化后需要单独写清楚假设。时间窗口的计算则是把所有“有效遮蔽时刻”汇总成连续区间取并集得到总遮蔽时长。由于导弹高速飞近每个时刻的几何构型都在变化遮蔽通常是分段出现的因此算法上需要一个时间步进循环将连续时间离散化。def effective_shielding_time(missile_path, cloud_center_path, target_pos, valid_radius10.0, dt0.01): 计算有效遮蔽总时长。 参数: missile_path: 导弹位置序列形状 (N, 3) cloud_center_path: 云团中心位置序列形状 (N, 3) target_pos: 真目标代表点坐标 valid_radius: 有效遮蔽半径默认 10 m dt: 时间步长默认 0.01 秒 返回: total_time: 总有效遮蔽时长 n len(missile_path) shielded np.zeros(n, dtypebool) for i in range(n): # 直线方向向量 line_vec target_pos - missile_path[i] line_len np.linalg.norm(line_vec) if line_len 1e-6: continue # 云团中心到直线的距离 c_vec cloud_center_path[i] - missile_path[i] proj np.dot(c_vec, line_vec) / (line_len**2) if 0 proj 1: cloest_point missile_path[i] proj * line_vec dist np.linalg.norm(cloud_center_path[i] - cloest_point) if dist valid_radius: shielded[i] True # 合并连续区间 total_time 0.0 i 0 while i n: if shielded[i]: start i while i n and shielded[i]: i 1 total_time (i - start) * dt else: i 1 return total_time这段判定代码有几点需要注意。proj 必须落在 (0, 1) 区间内否则云团不在导弹和目标的连线段上即使距离再近也不构成遮蔽。dt 的选择直接影响精度——dt 取 0.01 s 时单次计算误差在毫秒级对最终结果影响可以忽略如果为了提高速度把 dt 放到 0.1 s误差会到 0.1 s 量级在结果需要精确到小数点后两位时就不够看了。3. 从固定方案到寻优方案问题 1 验算与问题 2 的单枚弹最优化3.1 问题 1 的手工验算时间对齐与几何投影问题 1 给了一组完整方案FY1 以 120 m/s 朝向假目标方向飞行受领任务 1.5 s 后投放间隔 3.6 s 起爆。我们需要验证这组参数下的有效遮蔽时长。做这类验算题时我习惯先手算关键时间节点再用代码复核避免方向或单位出错。先看无人机。FY1 初始位置 (17800, 0, 1800)朝向假目标方向即指向原点。但题目说“朝向假目标方向飞行”这里的“方向”是指无人机的航向正对假目标不一定是沿直线最短路径——因为无人机始终保持等高度所以实际飞行方向是 (0, 0, 1800) 到 (0, 0, 0) 的水平投影方向即 x 轴负方向。以 120 m/s 飞 1.5 s 后投放投放点大约在 (17800-120*1.5, 0, 1800) (17620, 0, 1800)。再看干扰弹。投放后 3.6 s 起爆无人机没有垂直速度分量所以起爆点在投放点正下方多下落一段距离z 坐标约 1800 - 0.59.83.6² ≈ 1736.5。起爆后云团形成中心以 3 m/s 下沉。而 M1 以 300 m/s 从 (20000, 0, 2000) 指向原点飞近真目标。3.2 决策变量与目标函数选出最优的投放点、起爆点问题 2 把问题 1 的“给定方案验算”变成了“方案优化”。此时决策变量是 FY1 的飞行方向两个角度或一个方向向量、飞行速度70~140 m/s 连续取值、投放时刻、起爆延迟。目标函数是有效遮蔽时长最大化。这里有一个建模细节需要澄清投放点和起爆点是导出量而不是独立变量。一旦确定了无人机的航向、速度、投放时刻和起爆延迟投放点就是无人机在投放时刻的位置起爆点就是干扰弹做抛体运动后的位置。所以优化变量实际是四个速度标量、航向角水平面内、投放时刻、起爆延迟。由于速度范围只有 70~140 m/s连续优化空间不大用网格搜索加局部精修就能拿到很好的解。我一般先把航向角按 1° 间隔离散、速度按 5 m/s 间隔离散、投放时刻按 0.1 s 间隔离散、起爆延迟按 0.1 s 间隔离散做一个四层循环的粗搜再在最优解的邻域内做细搜。def search_best_strategy(fy1_pos, m1_pos, target_pos, speed_range(70, 140), dt_angle1.0, dt_speed5.0): 单机单弹投放策略搜索。 参数: fy1_pos: 无人机初始位置 m1_pos: 导弹初始位置 target_pos: 真目标代表点 speed_range: 速度搜索范围 dt_angle: 航向角搜索步长度 dt_speed: 速度搜索步长m/s 返回: best_params: 最优参数元组 best_time: 最优遮蔽时长 best_time 0.0 best_params None for angle_deg in range(-180, 180, int(dt_angle)): angle_rad np.radians(angle_deg) dir_vec np.array([np.cos(angle_rad), np.sin(angle_rad), 0.0]) for speed in np.arange(speed_range[0], speed_range[1] 1, dt_speed): for drop_delay in np.arange(0.5, 10.0, 0.1): for burst_delay in np.arange(0.5, 10.0, 0.1): # 计算投放点 drop_pos fy1_pos dir_vec * speed * drop_delay # 计算起爆点和后续云团轨迹 # ... (省略内部遮蔽时长计算) t_cover compute_cover_time(...) if t_cover best_time: best_time t_cover best_params (angle_deg, speed, drop_delay, burst_delay) return best_params, best_time这个搜索框架的优点是直观、不容易漏解缺点是计算量大。航向角 360 个 × 速度 15 个 × 投放时刻约 95 个 × 起爆延迟约 95 个接近 5000 万次组合每次组合还要做时间步进本地跑会很慢。我一般会给四层循环加一个前置判断——先粗算导弹到真目标的飞行总时长如果投放时刻加起爆延迟已经超过这个总时长直接跳过这样可以剪掉一大半无效组合。3.3 枚举加启发式用“先几何后时间”的思路缩小搜索空间上述枚举法对问题 2 够用但对问题 5 的全场景多机多弹就太慢了。所以我会用“几何启发式”做预筛最优投放点的空间位置一定在导弹-目标连线的延长线附近。具体做法是先不管无人机约束直接在导弹飞行路径附近搜索一组“理想遮蔽点”让云团在某个时间窗口内恰好落在导弹到目标的视线通路上然后反推无人机能否在指定时间到达某个投放点。这种反向推理能大幅缩小搜索范围。比如在目标附近取多个候选起爆点对每个候选起爆点计算需要的投放时刻和无人机飞行距离再检查该距离是否在 70~140 m/s 的速度范围内可达。可达的候选点才进入精确时间步进计算不可达的直接丢弃。粗搜阶段: 1. 在导弹路径附近生成候选起爆点网格空间步长 50 m 2. 对每个候选点反推投放时刻和预期遮蔽窗口 3. 筛选无人机可达的候选点 4. 对候选点按遮蔽时长预估排序取前 20% 精搜阶段: 1. 对前 20% 候选点做局部邻域细搜空间步长 5 m 2. 时间步长从 0.05 s 细化到 0.01 s 3. 输出最优参数这段两阶段搜索把问题从“无差别枚举”变成“有引导的寻优”求解效率提升两个数量级以上。这个思路在问题 3 到问题 5 的多弹协同中尤其重要因为多弹之间的时间配合不允许每一个都做全空间枚举只能先定大范围再精调。4. 避坑与排查五个让遮蔽时长计算翻车的常见问题4.1 坐标系搞混真目标不在原点导致所有遮蔽判定失效现象代码跑出来遮蔽时长为 0或者 M1 明明从远处飞来却没有遮挡窗口。原因很多同学默认真目标就在假目标位置把真目标坐标写成 (0,0,0)结果导弹路径和云团位置都基于原点计算完全没有遮挡关系。解决在建模文档开头显式声明两个坐标假目标为 (0,0,0)真目标为 (0,200,0)。每次计算遮蔽判定时用真目标坐标参与直线方程不要用原点。测试时可以先构造一个简单的几何场景验证导弹在 (100, 200, 100)真目标在 (0, 200, 0)云团在连线中点遮蔽距离应为 0遮蔽标志应为 True。4.2 时间步长与计算精度遮蔽时长的离散化误差被忽略现象同一组参数用 dt0.1 算出遮蔽时长 8.5 s用 dt0.01 算出 8.42 s两次结果不同。原因遮蔽时长是一个连续积分量但离散化后丢失了每个步长内的细节。尤其当遮蔽窗口边界落在某个时间步中间时dt 越大误差越大。解决分两阶段处理。粗搜时用 dt0.05 s 控制迭代规模精算时统一用 dt0.005 s 重新计算最终结果提交论文时说明最终结果是基于细步长的计算值。注意误差不是对称的——用大步长通常会把遮蔽时长算大而不是算小因为遮蔽区间两端各被多算了最多 dt 秒。4.3 起爆时间与遮蔽窗口的“20 秒上限”被忽略现象搜索结果给出的起爆延迟非常大遮蔽时长超过了 20 s看起来“异常优秀”。原因云团起爆后 20 s 内才有效超过 20 s 浓度衰减不能再提供有效遮蔽。部分实现只做了空间几何判定没有加时间窗约束。解决在遮蔽判定的代码里遮挡标志不仅要满足距离条件还要满足 t_burst ≤ 20 s 的条件。可以做一个简单检查若起爆后经过时间 t_since_burst 20直接关闭该云团的遮蔽能力。4.4 无人机“瞬时调整方向”的隐含条件调整瞬间的速度损失现象优化结果里无人机以 70 m/s 飞向某个方向但计算出的投放点与理论最优投放点差了几百米导致遮蔽时长偏小。原因题目说“瞬时调整飞行方向”意味着转向不消耗时间但转向过程中无人机的实际飞行路径取决于速度矢量。若只修改方向不修改速度大小投放点计算正确若把速度和方向分开优化则需要同时满足调度到达时间。解决在搜索代码里把“航向角”和“速度标量”打包成同一轮的候选变量让投放点时刻的位移统一由 v * dt 计算。不要先定航向再独立定速度否则容易出现“方向对了、时间不对”的矛盾。4.5 多弹遮蔽的“不连续”理解合并区间时误判连续现象两枚弹的遮蔽窗口重叠了 0.5 s合并后总时长反而变短了。原因“不同烟幕干扰弹的遮蔽可不连续”这句话的含义是允许遮蔽之间有间隙但如果两个窗口有重叠重叠部分只能算一次。有些人直接把两端遮蔽时长相加重复计算了重叠区间。解决用区间合并算法处理多个遮蔽窗口。把每个窗口表示成 (start, end) 的元组按 start 升序排列然后依次合并相交区间最后把合并后的区间时长求和。5. 多弹多机协同问题 3/4/5 的调度与搜索策略5.1 单机连投三枚间隔约束与时间片填补问题 3 要求 FY1 投放 3 枚干扰弹对 M1 进行干扰。约束条件是同一架无人机每枚弹至少间隔 1 s。这个约束看起来宽松但实际会影响无人机的投弹路径——如果三枚弹都是朝同一个方向投放无人机以恒定速度飞行投放点会沿航线等距分布。三枚弹的投放策略关键在于“时间片填补”。因为一枚云团的有效时间只有 20 s而导弹从发现到接近目标的时间窗口通常超过 60 s单枚弹只能覆盖其中一段。因此三枚弹应该分别在导弹飞行的早段、中段、晚段形成遮蔽把遮蔽总时长拉长。最优策略通常是让三枚弹的遮蔽窗口尽量首尾相接。搜索时我先对单枚弹做一次独立的最优选址得到三条候选窗口然后再微调第二枚和第三枚的投放时刻和起爆延迟使它们的窗口分别向前后平移直到出现连续覆盖。5.2 多机协同分配导弹、竞争同一目标与投放次序问题 4 用 FY1、FY2、FY3 各投放 1 枚干扰弹目标仍然是干扰 M1。三架无人机初始位置不同速度范围相同这意味着它们到达理想投放点的时刻不同。协同的核心不是三架同时投弹而是让三枚弹的遮蔽窗口互补。时间次序上我会先让离导弹路径最近的无人机投第一枚接着第二枚在第一个窗口快结束时起爆第三枚紧随其后。但要小心一个问题三架无人机相隔很远如果它们都飞向目标附近航线上可能彼此交错。虽然无人机没有防撞约束但题目要求“每架无人机只服务自己分配到的弹”实际优化时最好给每架无人机限定一个空间范围避免两架无人机同时出现在同一候选投放点。5.3 全场景搜索从贪心初始解到局部优化问题 5 是最终考验5 架无人机、每架至多 3 枚弹、3 枚来袭导弹。这是一个多目标多资源调度问题。直接做全局枚举的组合数爆炸到无法计算因此需要分阶段处理。先做任务分配。3 枚导弹分别需要若干枚弹干扰合理分配是每枚导弹分到 3~5 枚弹。贪心的初始策略是对每个导弹独立运行问题 4 的求解器得到每枚导弹的遮蔽方案然后查看哪些时间窗口有空隙有空隙的导弹安排空闲无人机过去补弹。这个初始解未必最优但通常已经能达到较好遮蔽率。局部优化阶段我会对“遮蔽空隙最长的一段窗口”做定向修补。找出空隙后检查是否有无人机在合适的时间处于合适的位置如果有则调整那架无人机的航向和速度让它在空隙窗口内形成新的遮蔽。这个过程重复迭代直到所有可用的无人机和弹都用完。指标目标策略遮蔽总时长最大化多窗口首尾相接减少间隙每枚导弹分弹数平衡分配优先补空隙长的导弹无人机利用率尽量满负荷距离近的无人机优先被调度6. 验证与交卷结果文件的基本检查技巧6.1 用对称性和闭合差验证几何代码几何代码的 bug 很难肉眼发现但有几个通用检查手段。第一个是闭合差检查把导弹从初始位置按速度和时间推演到某一时刻再反向推回去看是否回到初始位置。第二个是对称性检查如果导弹位置和真目标位置互换遮蔽判定结果应该关于中点对称。第三个是能量守恒检查——无人机和导弹都是匀速运动飞行路径长度对时间求导应恒等于速度标量如果计算出的路径长度波动明显说明插值或坐标更新有 bug。6.2 result1.xlsx 到 result3.xlsx 的填写与边界测试最终提交的结果文件遵循模板格式。通常包含无人机编号、导弹编号、投放时刻、投放点坐标、起爆时刻、起爆点坐标、遮蔽时长。最容易出错的地方是“投放时刻”是从雷达发现后计时还是从无人机受领任务后计时两种定义差了一个任务指派时间常量务必和模板表头对齐。边界测试也很关键。速度取 70 m/s 和 140 m/s 两个端点航向角取 0°、90°、180°、270° 四个方向起爆延迟取 0.1 s 的最小步长这些边界条件下求解器应该仍然输出合理结果。如果某个边界组合导致遮蔽时长为 0需要检查是不是代码里把有效窗口算成了闭区间导致端点处丢失。我现在的习惯是在提交前写一个自动化校验脚本把 xlsx 里的每一行重新跑一遍模型对比遮蔽时长的误差是否在 0.01 s 以内。误差超过阈值就直接定位到对应无人机和导弹检查参数有没有越界。自从有一次因为时间步长不一致导致结果文件里的时长和论文表格对不上之后我就强制要求交付前必须走一遍“重算对比”每份结果文件都要过这道工序。希望这些经验帮到你去赛场少踩几个坑。本文还有配套的精品资源点击获取