【数学建模】用代码搞定无人机烟幕:怎么挡导弹最久?

【数学建模】用代码搞定无人机烟幕:怎么挡导弹最久?
前言:欢迎各位光临本博客,这里小编带你直接手撕**,文章并不复杂,愿诸君耐其心性,忘却杂尘,道有所长!!!!

**🔥个人主页:IF’Maxue-ZEEKLOG博客

🎬作者简介:C++研发方向学习者

📖**个人专栏:
《C语言》
《C++深度学习》
《Linux》
《数据结构》
《数学建模》**

⭐️人生格言:生活是默默的坚持,毅力是永久的享受。不破不立,远方请直行!

文章目录

平时看军事片里的烟幕遮蔽,其实背后藏着不少参数讲究——比如无人机往哪个方向飞、飞多快、啥时候投烟幕、烟幕啥时候爆,这些都会影响“能挡住导弹多久”。我写了一段代码专门解决这个问题,能自动算出最优参数,还能直接看结果,今天就用大白话跟大家拆解清楚。

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

简单说,我们的目标是:让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 =0for 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 inrange(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世代),建议用多进程加速(可以搜“Python多进程计算”);
  3. 先小规模测试:第一次跑先试pop_size=30generations=30,确认代码能跑通,再调大参数追求精度。

最后:跑出来的结果长这样

最优遮蔽时长:18.72秒 参数已保存到result2.xlsx 

打开Excel就能看到每架无人机的具体参数——比如FY1要朝45度飞,速度130m/s,10秒后投烟幕,5秒后起爆,这样3架配合起来,能挡导弹近19秒。

如果想调整场景(比如导弹速度变了、无人机起点改了),直接改main函数里的初始参数就行,代码会自动重新算最优解~

Read more

【源力觉醒 创作者计划】开源、易用、强中文:文心一言4.5或是 普通人/非AI程序员 的第一款中文AI?

【源力觉醒 创作者计划】开源、易用、强中文:文心一言4.5或是 普通人/非AI程序员 的第一款中文AI?

前言 * 你有没有发现,AI 正在悄悄渗透进我们的生活:写文案、画插图、做PPT、答作业,它几乎无所不能😍 !但很多人可能会问: AI,我能用吗?用得起吗?适合我吗?特别是中文用户,面对清一色英文界面、动辄上百元的 API 费用、还要“翻墙”的闭源大模型,常常望而却步😩。 * 好消息来了,文心一言4.5 正式开源,带着「能跑、好用、懂中文」的标签亮相😎。这不仅是一款中文大模型,更像是为中文用户量身定做的一把 AI 钥匙,让你在本地就能打开 AI 世界的大门!在这个“不会用 AI 就像不会用手机”的时代,早点上手,早点受益。 * 一起来轻松玩转文心大模型吧👉一文心大模型免费下载地址: https://ai.

什么是Agentic AI?Agentic AI 与传统 AIGC 有什么区别?

什么是Agentic AI?Agentic AI 与传统 AIGC 有什么区别?

什么是 Agentic AI?Agentic AI 与传统 AIGC 有什么区别? 1. 引言 近年来,人工智能(AI)技术飞速发展,其中以生成式 AI(AIGC,Artificial Intelligence Generated Content)和 Agentic AI(智能代理 AI)最为热门。AIGC 通过深度学习模型生成文本、图像、视频等内容,而 Agentic AI 则更进一步,能够自主感知、决策并执行任务。那么,Agentic AI 究竟是什么?它与传统的 AIGC 有何不同?在本文中,我们将深入探讨 Agentic AI 的概念、技术原理、

如何在低显存GPU上流畅运行AI绘画:ComfyUI GGUF量化完全指南

如何在低显存GPU上流畅运行AI绘画:ComfyUI GGUF量化完全指南 【免费下载链接】ComfyUI-GGUFGGUF Quantization support for native ComfyUI models 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-GGUF 还在为AI绘画时GPU显存不足而烦恼吗?ComfyUI GGUF量化技术为你带来全新的解决方案,让低性能显卡也能流畅运行大型AI模型。 问题:显存瓶颈如何突破? 大多数AI绘画爱好者都遇到过这样的困境:想要运行高质量的扩散模型,却发现自己的显卡显存远远不够。传统的UNET模型量化效果不佳,而GGUF格式的出现改变了这一局面。 解决方案:GGUF量化技术 GGUF是一种高效的模型文件格式,专门为量化优化设计。与常规的卷积神经网络不同,基于transformer/DiT架构的模型(如flux系列)在量化后性能损失极小,这为低显存GPU用户打开了新的大门。 通过ComfyUI-GGUF项目,你可以: * 将模型文件大小显著压缩 * 在低至4位/权重

【实战】从零搭建GEO多平台监控系统:支持ChatGPT、豆包、Kimi、文心一言

【实战】从零搭建GEO多平台监控系统:支持ChatGPT、豆包、Kimi、文心一言

【实战】从零搭建GEO多平台监控系统:支持ChatGPT、豆包、Kimi、文心一言 背景 Sora死了。 我的第一反应不是"AI完了",而是"我的监控代码要不要改"。 因为之前我专门写了Sora的监控脚本。 Sora一关,代码废了。 痛定思痛,我决定写一套通用的GEO多平台监控方案。 本文分享完整代码,支持:ChatGPT、豆包、Kimi、文心一言、通义千问。 系统架构 ┌─────────────────────────────────────────────────────────┐ │ GEO多平台监控系统 │ ├─────────────────────────────────────────────────────────┤ │ │ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ │ 任务调度 │→ │ 平台查询 │→ │ 结果分析 │ │ │ └───────────┘ └───────────┘ └───────────┘ │ │ ↑ ↓ ↓ │ │ └──── 告警通知 ←────── 报告生成 ←─