基于遗传算法的无人机烟幕遮蔽时间优化
本文介绍如何使用 Python 代码解决无人机烟幕遮蔽导弹的时间优化问题。通过建立烟雾有效时间段模型,计算并合并重叠区间,结合遗传算法优化无人机的飞行方向、速度、投放时间及起爆延迟等参数。
一、问题定义
目标是让 3 架无人机投掷的烟幕,在导弹飞到假目标前,'有效遮蔽时间'最长。
关键初始设定(可在 main 函数中调整):
- 导弹起点:
[20000, 0, 2000](单位米) - 真目标位置:
[0, 200, 0] - 3 架无人机起点:例如'FY1'从
[17800, 0, 1800]出发
代码中使用 SmokeObscurationModel 类封装这些初始信息。
二、核心计算逻辑
烟幕的有效性取决于生效时长及覆盖范围。核心方法是 calculate_effective_time,分为三步:
1. 计算单个烟幕的有效时间段
每架无人机投烟幕需计算两个时间点:
- 生效时间 = 飞行时间 (
drop_time) + 起爆延迟 (blast_delay) - 失效时间 = 生效时间 + 有效时长 (
effective_duration, 默认 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. 合并重叠时间段
多架无人机的烟幕可能重叠,需合并以避免重复计算。
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. 计算导弹到达前的有效时间
只计算烟幕时间段与导弹到达时间的交集。
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}秒")
2. 自动导出参数到 Excel
将 3 架无人机的最优参数保存至 result2.xlsx。
df = pd.DataFrame({
'无人机 ID': ['FY1', 'FY2', 'FY3'],
'方向角度 (度)': best_individual[0::4],
'飞行速度 (m/s)': best_individual[1::4],
'投放时间 (s)': best_individual[2::4],
'起爆延迟 (s)': best_individual[3::4]
})
df.to_excel('result2.xlsx', index=False)
四、运行指南
1. 补全遗传优化逻辑
需完善选择、交叉、变异步骤。
# 选择:选效果好的参数留下
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:
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(默认 150)generations=50(默认 80)
optimizer = GeneticOptimizer(model, pop_size=50, generations=50)
五、注意事项
- 角度转换:代码已使用
np.radians()将角度转为弧度,无需手动处理。 - 性能优化:若参数较大,建议使用多进程加速。
- 测试策略:首次运行建议小参数测试,确认无误后再追求精度。
六、运行结果示例
最优遮蔽时长:18.72 秒
参数已保存到 result2.xlsx
打开 Excel 可查看具体参数配置,如 FY1 朝 45 度飞、速度 130m/s 等。如需调整场景(如导弹速度变化),直接修改 main 函数中的初始参数即可。

