数学建模:无人机烟幕遮蔽导弹时间优化算法与代码实现
介绍使用 Python 进行数学建模,解决无人机投掷烟幕以最大化遮挡导弹飞行时间的优化问题。通过计算烟幕有效时间段并合并重叠区间,结合遗传算法优化无人机投放参数(方向、速度、时间),最终输出最优遮蔽时长及参数配置。代码包含核心逻辑补全示例及运行注意事项。

介绍使用 Python 进行数学建模,解决无人机投掷烟幕以最大化遮挡导弹飞行时间的优化问题。通过计算烟幕有效时间段并合并重叠区间,结合遗传算法优化无人机投放参数(方向、速度、时间),最终输出最优遮蔽时长及参数配置。代码包含核心逻辑补全示例及运行注意事项。

简单说,我们的目标是:让 3 架无人机投的烟幕,在导弹飞到假目标前,'有效遮蔽时间'最长。
先明确几个关键角色的初始设定(代码里 main 函数能直接改):
[20000, 0, 2000](可以理解为 x/y/z 坐标,单位米)[0, 200, 0](我们要保护的目标)[17800, 0, 1800]出发,每架位置都能调代码里用 SmokeObscurationModel 这个'模型类',把这些初始信息装进去,后续所有计算都基于这个基础。
烟幕不是投了就有用,得算准'啥时候生效、生效多久、能不能覆盖导弹飞来的关键期'。代码里最核心的是 calculate_effective_time 方法,我拆成 3 步说:
每架无人机投烟幕,都要算 2 个时间点:
drop_time 秒后投烟,烟幕再等 blast_delay 秒爆炸,所以生效时间= drop_time + blast_delayeffective_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)) # 存成'(生效,失效)'的格式
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) # 不重叠就直接加进去
烟幕再久,导弹都已经炸了也没用。所以要先算导弹飞到假目标的时间(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 # 这就是最终的'有效遮蔽时间'
原来的代码跑起来看不到关键结果,我改了两处,用起来更方便:
代码里的 GeneticOptimizer(遗传优化器),会像'试错进化'一样,不断调整无人机参数(方向、速度、投放时间、起爆延迟),找到最优解。
现在跑完会直接打印结果,比如:
# 优化器返回最优参数和对应时间
best_individual, best_time = optimizer.optimize()
print(f"最优遮蔽时长:{best_time:.2f}秒") # 直接显示,比如'18.72 秒'
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
代码里 optimize 方法有个小缺口——'选择、交叉、变异'这三步没写全(这是遗传算法的核心,用来'筛选好参数、生成新参数')。补全示例可以参考:
# 补全选择:选效果好的参数留下
fitnesses = [self.evaluate(ind) for ind in population]
# 按适应度(有效时间)排序,选前 50%
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
第一次跑可以先设小一点规模,避免等太久:
pop_size=50(每次试 50 组参数,默认 150)generations=50(试 50 轮,默认 80)比如改优化器初始化:
optimizer = GeneticOptimizer(model, pop_size=50, generations=50)
np.radians(i_param) 把'度'转成'弧度'(数学计算需要),不用自己再改;
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online