无人机烟幕遮蔽导弹时间的代码实现与优化
平时看军事片里的烟幕遮蔽,其实背后藏着不少参数讲究——比如无人机往哪个方向飞、飞多快、啥时候投烟幕、烟幕啥时候爆,这些都会影响'能挡住导弹多久'。我写了一段代码专门解决这个问题,能自动算出最优参数,还能直接看结果,下面详细拆解一下。
一、问题定义:我们要解决啥?
简单说,目标是让 3 架无人机投的烟幕,在导弹飞到假目标前,'有效遮蔽时间'最长。
先明确几个关键角色的初始设定(代码里 main 函数能直接改):
- 导弹起点:
[20000, 0, 2000](x/y/z 坐标,单位米) - 真目标位置:
[0, 200, 0](我们要保护的目标) - 3 架无人机起点:比如'FY1'从
[17800, 0, 1800]出发,每架位置都能调
代码里用 SmokeObscurationModel 这个模型类把这些初始信息装进去,后续所有计算都基于这个基础。
二、核心计算:怎么判断'烟幕有没有用'?
烟幕不是投了就有用,得算准'啥时候生效、生效多久、能不能覆盖导弹飞来的关键期'。代码里最核心的是 calculate_effective_time 方法,拆成 3 步说:
1. 单个烟幕的有效时间段
每架无人机投烟幕,都要算 2 个时间点:
- 生效时间:无人机飞了
drop_time秒后投烟,烟幕再等blast_delay秒爆炸,所以生效时间 =drop_time + blast_delay - 失效时间:烟幕爆炸后,有效时长是
effective_duration(代码里设的 20 秒),所以失效时间 = 生效时间 + 20 秒
比如这段逻辑,就是算单架无人机的烟幕时间段:
smoke_blast_time = drop_time + blast_delay # 生效时间
smoke_end_time = smoke_blast_time + self.effective_duration # 失效时间
intervals.append((smoke_blast_time, smoke_end_time)) # 存成(生效,失效)格式
2. 合并重叠的时间段
3 架无人机的烟幕可能会'叠 buff'——比如 A 烟幕 10-15 秒生效,B 烟幕 12-18 秒生效,重叠的 2 秒不能算 2 次。
代码会把所有时间段排序,然后合并重叠部分:
intervals.sort() # 先按生效时间排序
merged = [intervals[0]] # 先拿第一个时间段当基础
for current in intervals[1:]:
last = merged[-1]
if current[0] <= last[1]: # 如果当前时间段和上一个重叠
merged[-1] = (last[0], max(last[1], current[1])) # 合并成一个长时间段
else:
merged.append(current) # 不重叠就直接加进去
3. 只算'导弹到达前'的有效时间
烟幕再久,导弹都已经炸了也没用。所以要先算导弹飞到假目标的时间(missile_arrival_time 方法):
'导弹飞的距离 ÷ 导弹速度(代码里设 300m/s)',比如从 20000 米外飞过来,大概要 60 多秒。
然后只算'烟幕时间段'和'导弹到达前'的交集:
total = 0
for interval in merged:
start = max(0, interval[0]) # 烟幕生效时间不能早于 0
end = min(missile_arrival, interval[1]) # 烟幕失效时间不能晚于导弹到达
if start < end: # 只要有重叠,就加这段时间
total += end - start
return total # 这就是最终的'有效遮蔽时间'
三、代码优化:加了两个实用功能
原来的代码跑起来看不到关键结果,我改了两处,用起来更方便:
1. 跑完直接显示'最优遮蔽时长'
代码里的 GeneticOptimizer(遗传优化器),会像'试错进化'一样,不断调整无人机参数(方向、速度、投放时间、起爆延迟),找到最优解。
现在跑完会直接打印结果,比如:
# 优化器返回最优参数和对应时间
best_individual, best_time = optimizer.optimize()
print(f"最优遮蔽时长:{best_time:.2f}秒") # 直接显示,比如'18.72 秒'
2. 参数自动存到 Excel
3 架无人机的最优参数(比如 FY1 要朝 30 度飞、速度 120m/s),会自动存到 result2.xlsx 里,打开就能看:
df = pd.DataFrame({
'无人机 ID': ['FY1', 'FY2', 'FY3'],
'方向角度 (度)': best_individual[0::4], # 每 4 个参数对应 1 架无人机
'飞行速度 (m/s)': best_individual[1::4],
'投放时间 (s)': best_individual[2::4],
'起爆延迟 (s)': best_individual[3::4]
})
df.to_excel('result2.xlsx', index=False) # 保存到 Excel
四、怎么跑代码?看两个关键步骤
1. 补全'遗传优化'的核心逻辑
代码里 optimize 方法有个小缺口——'选择、交叉、变异'这三步没写全(这是遗传算法的核心,用来'筛选好参数、生成新参数')。补全示例可以参考:
# 补全选择:选效果好的参数留下
fitnesses = [self.evaluate(ind) for ind in population]
sorted_pop = sorted(zip(population, fitnesses), key=lambda x: x[1], reverse=True)
selected = [ind for ind, _ in sorted_pop[:self.pop_size // 2]]
# 补全交叉:两个好参数'混合'出新品
offspring = []
for i in range(0, len(selected), 2):
parent1 = selected[i]
parent2 = selected[i+1] if i+1 < len(selected) else parent1
cross_pos = random.randint(1, len(parent1)-1)
child = parent1[:cross_pos] + parent2[cross_pos:]
offspring.append(child)
# 补全变异:偶尔改个参数,避免'钻牛角尖'
for ind in offspring:
if random.random() < 0.1: # 10% 的变异概率
param_idx = random.randint(0, len(ind)-1)
low, high = self.param_ranges[param_idx]
ind[param_idx] = random.uniform(low, high)
# 新种群 = 选出来的好参数 + 新生成的参数
population = selected + offspring
2. 调参数平衡'速度'和'精度'
第一次跑可以先设小一点规模,避免等太久:
pop_size=50(每次试 50 组参数,默认 150)generations=50(试 50 轮,默认 80)
比如改优化器初始化:
optimizer = GeneticOptimizer(model, pop_size=50, generations=50)
五、避坑提醒
- 方向角度要转弧度:代码里已经用
np.radians(i_param)把'度'转成'弧度'(数学计算需要),不用自己再改; - 运行时间可能长:如果参数设得大(比如 150 种群、80 世代),建议用多进程加速(可以搜'Python 多进程计算');
- 先小规模测试:第一次跑先试
pop_size=30、generations=30,确认代码能跑通,再调大参数追求精度。
六、结果展示
跑出来的结果大致是这样:
最优遮蔽时长:18.72 秒
参数已保存到 result2.xlsx
打开 Excel 就能看到每架无人机的具体参数——比如 FY1 要朝 45 度飞,速度 130m/s,10 秒后投烟幕,5 秒后起爆,这样 3 架配合起来,能挡导弹近 19 秒。
如果想调整场景(比如导弹速度变了、无人机起点改了),直接改 main 函数里的初始参数就行,代码会自动重新算最优解~


