2020年华为杯第十七届中国研究生数学建模竞赛---回顾记录

2023-11-14

这次做一个复盘贴,刚刚参加完这次的华为杯数学建模,由于是2020级研究生所以允许跨校组队,所以选择的队友是两个外校的,沟通方面第一天至第三天每天在微信使用语音通话汇报一次进度,第四天至第五天腾讯会议共享桌面进行论文修改。

比赛时间 2020年9月17日8:00 -- 2020年9月21日12:00

第一天

9月17日上午8:00 比赛试题解压密码分发

比赛试题会在开赛前一天分发,但是解压密码并不会即时分发,而是在等到第二天早上八点。试题的信息是百度网盘链接,推荐提前下载好,不然下载需要较长时间。队友两个人都在第一二节有课,所以讨论时间推迟到了中午十一点半,题目信息如下:

A题:华为题_芯片相噪算法设计

B题:汽油辛烷值建模

C题:面向康复工程的脑电信号分析和判别模型

D题:无人机集群协同对抗

E题:能见度估计与预测

F题:飞行器质心平衡供油策略优化

6个题目都看了并且思考过,在第一遍看完所有的支持材料后,考虑到队友参赛经验较少,所以初步选定的题目是B题,D题,E题。下面对各个题目说一下自己的理解:

A题华为题确实很值得,基础概念很多,而且理解起来也需要较长时间,第一时间觉得较难,不太可做。

B题感觉就是一道大数据题目,和今年的本科生国赛题目C题类似,也是使用主成成分分析得出10个主成分,然后数据清洗求解之类的。

C题脑电工程题目,题目中说了有卷积神经网络的知识,但是看不懂,并且未使用神经网络做过类似这方面的内容,所以作罢。

D题在知网上搜了些论文后,觉得方法很多,很全面,可以做,殊不知做的过程中极其自闭,接下来会详谈。

E题也是深度学习方法,但是专业领域不太相关,所以也选择了放弃。

F题个人觉得是一道物理题,质心求解问题,联系到供油策略。物理题感觉极其缺少空气动力学,相关物理知识的支持,所以也选择了放弃。

十一点开始和队友讨论,在和队友说了自己的意见后,队友比较信任我所以也决定选择D题,殊不知这就是噩梦的开始,接下来四天都被这个问题想的头疼。

中午十二点半吃完饭,回到寝室开始思考问题的解法。

在知网上找了几篇论文后,发现在无人机拦截方面,对于无人机群的飞行轨迹确定普遍倾向于使用群体智能算法,但是第一,二,三问对于蓝色方的突防飞机都是一架,而红色方的无人机群都是五架,所以对于蓝色方突围的策略陷入了沉思。于是开始整理题目中的条件,希望找出一些思考突破点。

在当天下午16:00左右,从第二问中得到了启发。第一问求取的是蓝色方突围的最优策略,第二问询问的是蓝色方突围成功的最短时间,既然如此,何不将最短时间作为突围的最优策略,同时为了确保蓝色方飞行器的突围时间最短,于是设定在第一问中,蓝色方飞行器的飞行轨迹只会进行直线飞行,所以会出现无法突围的区域和必定会突围的区域,这样第一问的求解就化简成了一个单纯的物理问题,只需列几个方程即可求解。当天晚上22:00讨论了思路,得到队友的一致肯定后,决定开始进行编程求解,同时确定明年的目标,完善第一问以及开始查阅第二问,第一天的任务就此完成。

第二天

9月18日上午8:00 前往校医院体检 由于种种自身原因,11:00回到寝室开始编程求解,第一问的求解代码如下:

Problem1.cpp
//问题一求解 角度angle是与水平面的角度 输出结果大于L纵深说明无法突围 小于则说明可以
#include <iostream>
#include <math.h>
using namespace std;
//定义圆周率常数PI
const double PI = 3.1415926;
//垂直高度距离
const int Height_ver = 20000;
//无人机A的飞行速度
const int Speed_A = 200;
//无人机B的飞行速度
const int Speed_B = 250;
int main() {
    double limit_distance = INFINITY;
    //垂直飞行的时间 水平飞行的距离
    double Time_ver,Distance_hor;
    double angle = 0.0;
    for(angle = 1.0;angle <= 89.0; angle += 1.0) {
        Time_ver = Height_ver / (sin(angle * PI/ 180) * Speed_A);
        Distance_hor = Time_ver * Speed_A * cos(angle * PI/ 180);
        //cout<<Time_ver << " " << Distance_hor << " "<< endl;
        //B飞行器飞行的平行距离
        cout<<Distance_hor + Time_ver * Speed_B << endl;
        limit_distance = min(limit_distance, Distance_hor + Time_ver * Speed_B);
    }
    //cout<<limit_distance << endl;
    return 0;
}

至此第一问求解完成,开始思考第二问。两个队友今天满课,所以白天差不多一直是自己在孤军奋战,下面贴一下第二问的思考过程:

晚上10:00 和队友再次开始讨论,对于第二问的解法发表意见,同时布置第二天的任务,但是当时队友给出的反馈很小,基本上觉得听不懂这一问的解法,在半懵半懂的过程中,就定下了第二问的基本解题步骤。

第三天

9月19日 上午8:00 

开始求解第二问,第二问求解过程中做了以下几个假设:

首先是划分上下半区,红色方的无人机群有两个,两个分别只追踪其所属半区中的蓝色方飞行器,如果在追踪过程中,蓝色方的飞行器脱离了半区的范围,则红色方的无人机会暂停在原地,停止行动。初始情况,在蓝色方飞机未飞到极限范围之前,红色方无人机不进行任何的行动,而当其进入之后,红色方才开始进行行动。

原因在于:因为在蓝色方的飞机到达第一问所求的极限处距离之前红色方的飞机无论如何都可以根据其所处半区采取相应的拦截策略而且假设蓝色方在任何地点开始进行对于红色方无人机拦截的操作那么在某一时刻当其成功绕过之后其最终的飞机轨迹为了使得时间最短依旧需要进行直线飞行所以无论其在整个区域当中的何处进行飞行操作不如将其直接设置成在极限处开始进行飞行操作。

其次,红色方无人机群的初始位置,为各个半区的中点,即CD中的两个四分之一点。这样的目的是红方无人机在各自半区的拦截过程中,相较于其他的点具有更加均衡的、快速的反应时间,同时对于飞行器B只飞行于中间横线的情况,也会比其他的位置部分具有更好的表现。

第二问的求解过程中遇到了三个问题:

第一 蓝色方飞行器的飞行轨迹如何确定。

解决:查找论文,了解到可以使用卷积神经网络对于飞行轨迹进行预测,既然如此,那就先确定红色方的无人机群的飞行轨迹,然后在通过网络训练之后,得到能够准确预测飞行轨迹的卷积神经网路,之后运用于蓝色方飞行器的飞行轨迹确定,至此问题得到解决。

第二 红色方无人机群的飞行轨迹如何确定。

解决:这里可以使用群体智能算法,有三种,蚁群算法,蜂群算法,粒子群算法。这里在综合考虑之后,选择使用粒子群算法,该算法通过思考整体和部分的最优解,然后通过个体最优解影响整体最优解,在通过整体最优解修正个体最优解,直至到达迭代结束条件。这里的目标就是拦截蓝色方的飞行器,在飞行过程中只需要朝着目标进行最接近的飞行方式就可以了。

第三 蓝色方飞行器和红色方无人机群在进行转弯的时候如何计算时间。

解决:前面的题目中设定了蓝色方飞行器的转弯半径和红色方无人机群的转弯半径,这里在转弯的时候只需要考虑转弯的偏角即可。同时由于理想情况下,思考计算该问题相较于实际情况会存在一定的偏差数值,所以决定在后续的计算过程中引入影响因子解决这一问题。

第二问求解之后得到的飞行轨迹是如下图所示的:

可能不太规范,但是是一个波峰值不断收敛的简协振动,通过在上下半区不断的穿梭,使得红色方的无人机不断的丢失目标从而在下一次再次回到该区域的时候,原本所属这一半区的无人机群无法追踪上。

第二问的求解过程绘制的图如下:

近似的理想追踪情况是这样的一幅图,通过求解这样的图中的变量,最后得出Mmin的值。其实变量包括两个,角度\theta 1和角度\theta 2,编程求解,代码如下:

Problem2.cpp
//问题二的求解
 //Mmin = 54623.8m 54.623km
 #include <iostream>
 #include <math.h>
 using namespace std;
 //圆周率常数
 const double PI = 3.1415926;
 //无人机A的拦截半径
 const double Interception_radius_of_A = 3;
 //极限距离的最小值。距离CD轴
 //const double Min_limit_distance = 25352.9;
 //无人机A的飞行速度
 const int Speed_A = 200;
 //无人机B的飞行速度
 const int Speed_B = 250;
 int main() {
     //通道宽度M的临界最大值
     double M_max = 0.0;
     //暂定为未知量
     double Mmin = 0.0;
     //水平夹角度数1
     for(double angle1 = 0.1;angle1 <= 89.1; angle1 += 0.1) {
         //水平夹角度数2
         for(double angle2 = 0.1;angle2 <= 89.1 ;angle2 += 0.1) {
             //转弯过程时间
             double Time_of_Turn = (2 * PI * (1.0 / 4))/ Speed_B;
             //下降过程时间
             double Time_of_Fall = (300.0 / tan(angle2 * PI / 180.0));
             //爬升至最高点时间
             double Time_of_Up_for_Top = (Mmin / 2) / sin(angle1 * PI / 180.0);
             //不等式左边
             double Left_of_unequality = PI + 300.0 / (Speed_B * cos(angle2 * PI / 180.0));
             //不等式右边
             double Right_of_unequality = (1.0 / 0.09732 * sin((angle2 * PI) / 180.0) - 1.0/(1.21 * Speed_B * sin((angle1 * PI) / 180.0)));
             //取不等式的最大值 作为能恰好突破拦截的临界值
             M_max = max(M_max, Left_of_unequality / Right_of_unequality);
         }
     }
     //显示最大值
     cout<<M_max<<endl;
     return 0;
 }

求解得出答案,这里提一下之前提到的影响因子\beta,这个参数根据问题二和问题三的实际情况会再进行改变,具体修正是因为无人机群如果时时刻刻的飞行轨迹都是朝着B的最短距离,那么应该会在B上升的过程中有转弯行为,为了克服这种情况,简化模型的计算,方便求解,所以使用来计算不等式,求的结果。

晚上10:00 和队友开会,讨论这一问如何求解并且如何描述论文,11:00睡觉,准备求解第三问。

第四天

9月20日,上午8:00,开始思考第三问。第三问其实和第二问的求解方法类似,包括红色方无人机群的飞行轨迹,蓝色方飞行器的飞行策略,上下半区的划分,红色方的具体行动时间等。求解的图形也会类似,这次两波无人机群的红色方,半区再划分就是在已有半区的前提下划分出前后,在前后的情况下再进行具体的求解。这一问求解的是红色方的最佳拦截策略,其实可以进行一个思维的转换,当M大于Mmax,红色方一定能拦截成功,当M小于Mmax,蓝色方一定能突防成功,这样转换之后,求解的还是蓝色方的突防策略。只是不知道这样算不算求解这一问,感觉从这一步的思考开始,就开始偏了,思绪开始理不清楚了,就开始晕了。然后求解的过程和第二问基本相同,只是对于影响因子的大小值改变了一下,其他的没有任何的变化,反正挺裂开的.....

从这一问开始,论文基本开始乱写了,另外两名队友表示这思考太难了,不太懂我为什么这么想,但是还是根据这么硬写了这一部分,这一部分的论文写的也很少,基本上没有前面的论文逻辑清楚。

第三问求解代码:

Problem3.cpp
//问题三的求解
//Mmax = 83350.3m 83.35km
#include <iostream>
#include <math.h>
using namespace std;
//圆周率常数
const double PI = 3.1415926;
//无人机A的拦截半径
const double Interception_radius_of_A = 3;
//极限距离的最小值。距离CD轴
//const double Min_limit_distance = 25352.9;
//无人机A的飞行速度
const int Speed_A = 200;
//无人机B的飞行速度
const int Speed_B = 250;
int main() {
    //通道宽度M的临界最大值
    double M_max = 0.0;
    //暂定为未知量
    double Mmin = 0.0;
    //水平夹角度数1
    for(double angle1 = 0.1;angle1 <= 89.1; angle1 += 0.1) {
        //水平夹角度数2
        for(double angle2 = 0.1;angle2 <= 89.1 ;angle2 += 0.1) {
            //转弯过程时间
            double Time_of_Turn = (2 * PI * (1.0 / 4))/ Speed_B;
            //下降过程时间
            double Time_of_Fall = (300.0 / tan(angle2 * PI / 180.0));
            //爬升至最高点时间
            double Time_of_Up_for_Top = (Mmin / 2) / sin(angle1 * PI / 180.0);
            //不等式左边
            double Left_of_unequality = PI + 300.0 / (Speed_B * cos(angle2 * PI / 180.0));
            //不等式右边
            double Right_of_unequality = (1.0 / 0.09987 * sin((angle2 * PI) / 180.0) - 1.0/(0.87 * Speed_B * sin((angle1 * PI) / 180.0)));
            //取不等式的最大值 作为能恰好突破拦截的临界值
            M_max = max(M_max, Left_of_unequality / Right_of_unequality);
        }
    }
    //显示最大值
    cout<<M_max<<endl;
    return 0;
}

晚上18:00,开始求解第四问,队友开始写第三问的部分,之前完善了第一问和第二问的论述部分。

第四问感觉蓝色方的飞行轨迹,终于不再需要之前的了,也可以使用群体智能算法,有点开始,对比了蜂群和蚁群之后,决定使用蜂群。在蜂群算法中对应是这样对应的:

使用改进的蜂群算法其中定义侦察机和目标机两个概念侦察机的作用和定位等同于蜂群算法中的侦查蜂在本问中其作用在于侦查红色方无人机群的目前时刻的飞行速度和飞行位置为目标机吸引其即将进去或已经进入的半区中红色方无人机群为目标机开辟出相对于快捷的突防通道使得目标机能够成功的完成突围任务必要的时候可以以自身被拦截作为相应的代价保证目标机可以完成突围任务目标机的目标为尽可能的躲避红色方无人机群的追踪成功的完成突防任务

由于队友不懂,自己也是第一次接触这个算法,所以看了概念之后,又看了看别人的代码,觉得,嗯,老倒霉蛋了,变量好多,变化情况好频繁,而且在代入这一问的算法中,蜜蜂的种类减少了,由于侦察机最后需要的是掩护目标机,所以在中途中也存在被拦截,从而导致目标机能突围的数目减少的情况。

第四问19:00开始查阅资料,22:00开始尝试编程,第五天上午6:00也无法完成期待,这期间越发的急躁,厌烦,心态开始崩塌,思考开始停滞,挺难受的。而且时隔一年多再次熬夜,身体还是有点吃不消,当时没什么反应,中午截止后吃完饭就开始睡觉了,当然这都是后话了。

第五天

9月21日 上午8:00 放弃第四问,和队友简单叙述了怎么写第四问之后,开始补充队友的之前缺的模型假设,模型评价与推广,参考文献部分,最终,在上午11:55,完成论文,上传MD5码,结束了这次的建模比赛。

 

总结:

这篇博文的本意就是想记录一下这次比赛的过程,队友两个一个第一次参加建模比赛,一个不懂算法和模型,只能写论文和查资料,整体下来建模和编程的任务都在我这里,感觉全程都有点压得喘不过气的感觉。同时第一天的选题有问题,选了一个看起来好做但是最后做到自闭的题目,感觉自己判定失误,直接把队友带进了沟中,自己要负主要责任。这次比赛就当积累经验了,重在参与,明年争取再来,加油,冲。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2020年华为杯第十七届中国研究生数学建模竞赛---回顾记录 的相关文章

随机推荐

  • 05 Django工程创建、注册子应用及ORM模型

    一 创建django工程 1 创建 cd Desktop test django admin startproject name 例如 django admin startproject testmanager cd testmanager
  • java并发包:生产者消费者模式

    本文转载至 http blog csdn net a910626 article details 51900974 生产者消费者模式是一个经典的多线程设计模式 它为多线程间的协作提供了良好的解决方案 在生产者消费者模式中 通常有两类线程 即
  • Learn_C++单词

    nomenclature Deprecated cubbyholes render inadvertently polygons truncation decrement ballistic refutation exotic oversi
  • linux网络编程一:epoll

    简介 一提到linux高性能服务器编程 epoll就是绕不开的话题 当前网络库在linux上实现也主要是以epoll为主 epoll的主要优点有 当检查大量的文件描述符时 epoll的性能比select和poll要高很多 epoll 既支持
  • mongoTemplate操作MongoDB排序

    解决项目中遇到的排序问题 Mark一下 Override public List
  • 【定时将hbase的索引同步到solr的core,当同步失败时,回滚core】好记性不如烂笔头,我将工作中写的自动化脚本记录在此,供大家参考

    前言 此脚本不包含core的创建 创建core请移步他处 本贴侧重core快照的创建 快照状态查询 core的删除 从快照恢复core hbase到solr的同步不做为本贴的重点 同步脚本syn solr sh内容 binbash 定义co
  • 虚拟机使用教程

    文章目录 前言 1 什么是母机与子机 2 常用快捷键 一 如何开机 二 如何克隆及删除虚拟机 三 如何修改硬件信息 改机器码 四 虚拟机内外如何传文件 五 调整虚拟机窗口大小及虚拟机全屏显示 六 如何调整cpu 内存 七 虚拟机开启声音 不
  • latex 约等于且大于 小于

    约等于 a approx b gt approx 大于约等于 a gtrsim b gt gtrsim 小于约等于 a
  • 基于QT 实现的LearnGL例子

    LOpenGL 是学习OpenGL非常好的资料 网址是 LearnOpenGL CN learnopengl cn github io 最近复习OpenGL 基于QT 拷贝实现了LearnGL的一些例子 下载地址 QT OpenGL 学习基
  • UML_类图

    在UML类图中 常见的有以下几种关系 泛化 Generalization 实现 Realization 关联 Association 聚合 Aggregation 组合 Composition 依赖 Dependency 1 泛化 Gene
  • 【Python】python 3.x 数据类型 吐血汇总

    文章目录 1 整数型 2 浮点数 3 字符串 4 布尔值 5 空值 6 变量 7 定义字符串 1 raw字符串 多行字符串 2 Unicode字符串 8 集合 list 1 访问列表中的值 2 更新列表 3 删除列表元素 4 Python列
  • 数据处理中的标准化、归一化,究竟是什么?

    原文链接 数据处理中的标准化 归一化 究竟是什么 大家好 我是小一 今天说一个比较重要的内容 无论是在算法建模还是在数据分析都比较常见 数据归一化和标准化 开始之前 请你先把网上看到的所有相关的博客 帖子都忘掉 不说全部 能讲清楚这个概念的
  • T5模型简单介绍

    目录 一 概要 二 深入扩展 2 1 两个要素 2 2 预训练方法 一 概要 谷歌公司的研究人员提出的 T5 Text to Text Transfer Transformer 有5个T开头的单词 所以叫做T5 模型采用了一种与前述模型截然
  • 成功解决Python中ValueError: not enough values to unpack (expected 10, got 2)故障

    对split函数不熟悉 将1修改为10即成功 同时将文件中所有空格键替换为Tab键 个人觉得这一步没啥用 这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题 有助于目录的生成 如何改变文本的样式 插入
  • linux screen rz/sz 文件卡死了快速退出的方法

    项目场景 服务器上通过sz下载txt格式的数据保存于本地遇到问题 问题描述 Linux 中使用tmux screen rz sz 命令下载文件卡死 出现如下图所示情况 快速退出方法 有如下解决办法 按住Ctrl键 再按五次x键 强行终断传输
  • 深入解析Spring Boot中最常用注解的使用方式(上篇)

    摘要 本文将详细介绍Spring Boot中最常用的注解的使用方式 并通过代码示例加以说明 通过学习这些注解 读者将能够更好地理解和运用Spring Boot框架 构建高效的企业级应用 目录 第一部分 常见的控制器注解 1 RequestM
  • Springboot项目打瘦包(将依赖包放到jar包外)

    一般springboot项目我们不做任何配置的话 打包会包含很多的依赖 生成的包过大 动辄100M以上 往生产环境上传很慢 所以把所有用的jar包打到外部 这样生成的小包中只有自已开发的程序 基本可以控制在1M以内 效果甚好 首先把spri
  • How to set IE proxy using VB.NET

    Created by SharpDevelop User Ying Shen Date 2004 11 12 Time 11 16 To change this template use Tools Options Coding Edit
  • NumPy 高级索引

    NumPy 高级索引 NumPy 比一般的 Python 序列提供更多的索引方式 除了之前看到的用整数和切片的索引外 数组可以由整数数组索引 布尔索引及花式索引 整数数组索引 以下实例获取数组中 0 0 1 1 和 2 0 位置处的元素 i
  • 2020年华为杯第十七届中国研究生数学建模竞赛---回顾记录

    这次做一个复盘贴 刚刚参加完这次的华为杯数学建模 由于是2020级研究生所以允许跨校组队 所以选择的队友是两个外校的 沟通方面第一天至第三天每天在微信使用语音通话汇报一次进度 第四天至第五天腾讯会议共享桌面进行论文修改 比赛时间 2020年