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

前言:欢迎 各位光临 本博客,这里小编带你直接手撕**,文章并不复杂,愿诸君耐其心性,忘却杂尘,道有所长!!!!

**🔥个人主页:IF'Maxue-CSDN博客

🎬作者简介: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秒

比如代码里这段,就是算单架无人机的烟幕时间段:

python 复制代码
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次。

代码会把所有时间段排序,然后合并重叠部分:

python 复制代码
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多秒。

然后只算"烟幕时间段"和"导弹到达前"的交集:

python 复制代码
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(遗传优化器),会像"试错进化"一样,不断调整无人机参数(方向、速度、投放时间、起爆延迟),找到最优解。

现在跑完会直接打印结果,比如:

python 复制代码
# 优化器返回最优参数和对应时间
best_individual, best_time = optimizer.optimize()
print(f"最优遮蔽时长:{best_time:.2f}秒")  # 直接显示,比如"18.72秒"

2. 参数自动存到Excel,不用手动记

3架无人机的最优参数(比如FY1要朝30度飞、速度120m/s),会自动存到result2.xlsx里,打开就能看:

python 复制代码
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方法有个小缺口------"选择、交叉、变异"这三步没写全(这是遗传算法的核心,用来"筛选好参数、生成新参数")。补全示例可以参考:

python 复制代码
# 补全选择:选效果好的参数留下
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)

比如改优化器初始化:

python 复制代码
optimizer = GeneticOptimizer(model, pop_size=50, generations=50)

五、避坑提醒

  1. 方向角度要转弧度 :代码里已经用np.radians(i_param)把"度"转成"弧度"(数学计算需要),不用自己再改;
  2. 运行时间可能长:如果参数设得大(比如150种群、80世代),建议用多进程加速(可以搜"Python多进程计算");
  3. 先小规模测试 :第一次跑先试pop_size=30、generations=30,确认代码能跑通,再调大参数追求精度。

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

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

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

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

相关推荐
小O的算法实验室2 小时前
EAAI,面向电力巡检中固定基站的无人机周期性任务分配与路径规划的深度强化学习方法
无人机
YOLO数据集集合5 小时前
风机叶片缺陷检测数据集 | 风机叶片 缺陷检测 风电运维 无人机巡检 细粒度分类9126期
运维·分类·无人机·风电叶片·风力·叶片缺陷
An独行者5 小时前
融合生长阶段信息的深度学习:冬小麦叶片氮含量无人机高光谱估算新方法
人工智能·深度学习·无人机
打工仔折腾 AI6 小时前
蓝耘元生代实测:用WorkBuddy与TextIn xParse拆解43页建模论文
人工智能·后端·python·数学建模·langchain·ai agent 实战
YOLO数据集集合6 小时前
风力发电机检测数据集 | 风机检测 电缆塔识别 风电运维 无人机巡检 9122期
运维·人工智能·目标检测·目标跟踪·无人机·风力发电·电力巡检
mtouch3337 小时前
技术解析|无人机倾斜摄影3D模型全天候动态光照融合方案
人工智能·无人机·虚拟现实·电子沙盘·数字沙盘·无人机倾斜摄影
workflower1 天前
企业竞争要素变迁,智能型企业走向新四化
人工智能·机器学习·机器人·无人机·软件工程
Zentceh1 天前
夜间野生动物监测:AI全彩夜视+AI行为分析方案
图像处理·人工智能·科技·计算机视觉·车载系统·无人机·智能硬件
workflower7 天前
SSH(Struts+Spring+Hibernate)
人工智能·机器学习·机器人·云计算·无人机
YOLO数据集集合7 天前
天空红外小目标检测数据集 | 红外小目标 天空目标检测 无人机检测 鸟类识别 低空安防9099期
人工智能·目标检测·计算机视觉·目标跟踪·无人机·无人机视角·直升机检测