跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

数学建模:无人机烟幕遮蔽导弹时间优化算法与代码实现

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

Elasticer发布于 2026/4/5更新于 2026/7/647 浏览
数学建模:无人机烟幕遮蔽导弹时间优化算法与代码实现

一、先搞懂:我们要解决啥问题?

简单说,我们的目标是:让 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]))  # 合并成一个长时间段
    :
        merged.append(current)  
else
# 不重叠就直接加进去
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  # 这就是最终的'有效遮蔽时间'

三、代码优化:加了 2 个实用功能,结果直接看

原来的代码跑起来看不到关键结果,我改了两处,用起来更方便:

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

四、怎么跑代码?看 2 个关键步骤

1. 先补全'遗传优化'的核心逻辑

代码里 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
2. 调参数平衡'速度'和'精度'

第一次跑可以先设小一点规模,避免等太久:

  • pop_size=50(每次试 50 组参数,默认 150)
  • generations=50(试 50 轮,默认 80)

比如改优化器初始化:

optimizer = GeneticOptimizer(model, pop_size=50, generations=50)

五、避坑提醒

  1. 方向角度要转弧度:代码里已经用 np.radians(i_param) 把'度'转成'弧度'(数学计算需要),不用自己再改;
  2. 运行时间可能长:如果参数设得大(比如 150 种群、80 世代),建议用多进程加速(可以搜

目录

  1. 一、先搞懂:我们要解决啥问题?
  2. 二、核心计算:代码怎么判断“烟幕有没有用”?
  3. 1. 先算单个烟幕的“有效时间段”
  4. 2. 合并重叠的时间段(避免重复计算)
  5. 3. 只算“导弹到达前”的有效时间
  6. 三、代码优化:加了 2 个实用功能,结果直接看
  7. 1. 跑完直接显示“最优遮蔽时长”
  8. 优化器返回最优参数和对应时间
  9. 2. 参数自动存到 Excel,不用手动记
  10. 四、怎么跑代码?看 2 个关键步骤
  11. 1. 先补全“遗传优化”的核心逻辑
  12. 补全选择:选效果好的参数留下
  13. 按适应度(有效时间)排序,选前 50%
  14. 补全交叉:两个好参数“混合”出新品
  15. 补全变异:偶尔改个参数,避免“钻牛角尖”
  16. 新种群 = 选出来的好参数 + 新生成的参数
  17. 2. 调参数平衡“速度”和“精度”
  18. 五、避坑提醒
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • STM32 单片机充电桩安全监测系统
  • Java 签名验证性能优化的 7 种策略
  • C++ 红黑树原理与实现详解
  • 算法基础:特性、复杂度与经典实现解析
  • Python 网络爬虫入门实战:从零抓取小说内容
  • AI 辅助 Java 入门:开发环境配置与核心语法实战
  • 二分查找实战:山峰数组峰顶索引与寻找峰值
  • JavaScript Proxy 代理机制与核心方法详解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online