【数学建模类比赛经验分享】——国赛

! 前前言

博主目前本科,因此所分享的经验也是关于本科类竞赛。如果某些比赛描述带有歧义,一律按针对本科生的竞赛处理。

0 前言

博主本人参加2019年数学建模国赛,获国家级一等奖,并于2020年参加美赛(更新:美赛出成绩了,F奖,有点小遗憾)。接触各类数学建模类比赛有一年多的时间,几天前美赛论文的提交也算是为本人的数学建模竞赛画上了句点。在准备竞赛和实际比赛的过程中,参考了不少前人的建议,也总结出了自己的一些经验。现拟以【数学建模类比赛经验分享】系列博客的形式和大家分享。鉴于2020年美赛分两周进行,比赛尚未结束,因此系列博客的将以国赛经验分享为首篇,待美赛正式结束后再进行相关更新 :)
国一证书

1 介绍

以下内容摘自百度全国大学生数学建模竞赛官网,用以帮助萌新简要了解国赛,已经知道的朋友可以跳过这一节。

1.1 什么是国赛

数模国赛即全国大学生数学建模竞赛。
全国大学生数学建模竞赛创办于1992年,每年一届,已成为全国高校规模最大的基础性学科竞赛,也是世界上规模最大的数学建模竞赛。2019年,来自全国及美国和马来西亚的1490所院校/校区、42992队(本科39293队、专科3699队)、近13万人报名参赛。

1.2 竞赛意义

1、培养创新意识和创造能力
2、训练快速获取信息和资料的能力
3、锻炼快速了解和掌握新知识的技能
4、培养团队合作意识和团队合作精神
5、增强写作技能和排版技术
6、荣获国家级奖励有利于保送研究生
7、荣获国际级奖励有利于申请出国留学
8、更重要的是训练人的逻辑思维和开放性思考方式

以上是百度百科给出的意义描述。总的来说还算中肯,这是一个训练性强,令人收获颇丰的竞赛。(当然,多数人主要是受加粗那两点的利益驱使吧hh(ง •_•)ง)

1.3 比赛方式

比赛要求

  1. 全国统一竞赛题目,采取通讯竞赛方式,以相对集中的形式进行。
  2. 竞赛每年举办一次,一般在某个周末前后的三天内举行。
  3. **大学生以队为单位参赛,每队3人(须属于同一所学校),专业不限。**竞赛分本科、专科两组进行,本科生参加本科组竞赛,专科生参加专科组竞赛(也可参加本科组竞赛),研究生不得参加。每队可设一名指导教师(或教师组),从事赛前辅导和参赛的组织工作,但在竞赛期间必须回避参赛队员,不得进行指导或参与讨论,否则按违反纪律处理。
  4. 竞赛期间参赛队员可以使用各种图书资料、计算机和软件,在国际互联网上浏览,但不得与队外任何人(包括在网上)讨论。
  5. 竞赛开始后,赛题将公布在指定的网址供参赛队下载,参赛队在规定时间内完成答卷,并准时交卷。

提交结果为解决方案的论文,论文部分要求如下(以2019年为例)

第一条,论文用白色A4纸打印(单面、双面均可);上下左右各留出至少2.5厘米的页边距;从左侧装订。
第二条,论文第一页为承诺书,第二页为编号专用页,具体内容见本规范第3、4页。
第三条,论文第三页为摘要专用页(含标题和关键词,但不需要翻译成英文),从此页开始编写页码;页码必须位于每页页脚中部,用阿拉伯数字从“1”开始连续编号。摘要专用页必须单独一页,且篇幅不能超过一页。
第四条,从第四页开始是论文正文(不要目录,尽量控制在20页以内);正文之后是论文附录(页数不限)。
第五条,论文附录至少应包括参赛论文的所有源程序代码,如实际使用的软件名称、命令和编写的全部可运行的源程序(含EXCEL、SPSS等软件的交互命令);通常还应包括自主查阅使用的数据等资料。赛题中提供的数据不要放在附录。如果缺少必要的源程序或程序不能运行(或者运行结果与正文不符),可能会被取消评奖资格。论文附录必须打印装订在论文纸质版中。如果确实没有源程序,也应在论文附录中明确说明“本论文没有源程序”。

简单来说,就是三天时间,三个人针对一个实际数学问题给出解决方案,并将解决方案撰写为一篇20页以内的论文以及支撑论文结论的资料和源程序。(虽然官方只给出上限,但其实按经验来说至少要写够18页,所以任务量还是比较大的。)

2 如何准备

2.1 组队

这是一个团体竞赛,,组建一个的团队是在竞赛中脱颖而出的基石。接下来我将对何为进行解释。
1.专业构成合理
国赛主要需要完成三部分工作:模型建立、模型求解以及论文撰写。好的队伍一般三个人各有一个擅长的工作,并负责该部分工作。例如,一名理工科成员负责建模、一名文科专业成员负责写作、一名计算机相关专业负责编程。这里只是举个例子,并不一定有严格的专业限制,比如我们队就是由三名计算机类专业成员构成,思维较为活跃的专攻建模、文笔排版好的负责写作,编程能力好的负责编程。
2.空闲时间重合度高
虽说比赛只有三天时间,但是其准备时间还是较长的。拿我们队伍来说,我们从暑假前一个多月开始准备,期末暂停,暑假花了大概一个月做了一些往年的题,然后开学后又在比赛前自己组织集训了一周多。所以说,各成员的空闲时间最好重合度高,这样比较好协调。
3.目标统一
三个人最好都是以必得奖的心态对待这次比赛,有一人稍有懈怠都是对整体士气不利的。例如,二带一学妹/弟,情侣档参赛等,还是最好不要这样组队。
4.性别/性格搭配
据说最佳搭配是2男1女,理由是男女之间互相的展现欲带动整体团队的效率…这个理由虽然有点牵强,但是男女搭配确实有一定意义:男生和女生思维方式有差异,搭配在一起可能会迸发许多新点子或者产生对问题更深入的理解;当然也不局限于性别,团队性格互补也可以:最好有天马行空的也有严谨认真的,这样可以让你们的结果有新意又不至于太跳脱。

当然,以上只是我个人的见解。团队最重要的还是配合,可能你们团队的初始属性在别人看来不是那么优秀,但是你们在不断的训练与磨合后工作效率十分高,也可以认为是不错的团队。

2.2 分工及练习

组好队后,推荐按这种方式分工:一人主建模副编程、一人写论文兼美工、一人编程副建模。这里简单解释一下:1)按照主要任务来分工为建模、论文、编程;2)由于论文中需要适当的插入图表、绘制示意图等,因此需要一名成员负责美工,一般由论文成员兼职;3)由于不同题型对于编程和建模的要求不同(物理背景的题对于建模的要求较高,而数据分析类题对于编程要求较高),因此建模和编程的同学要有一定的流动性,即主攻一个副学一个。

简单分工后就可以开始进入练习阶段了,为了方便描述下以“建模”、“论文”、“编程”指代上述分工,并且由于各小组实际情况差异,我只列出需要做的事,具体完成用时因小组而异。

2.2.1 基础入门

数学建模基础,可以分解为数学基础和建模基础来看。数学基础,即高等数学、线性代数、概率论等基础课程,基本学完这些课之后就可以认为具备数学基础;建模基础就是运用数学方法解决实际问题的思维,要求对于各类模型有系统性的了解,这部分基础的培育可以看参考书(如司守奎的《数学建模算法与应用》)或者网课(慕课/B站等)
我认为,数学建模就是用基础模型搭好总体骨架,再通过想象创新、引入智能算法等加以血肉来完成完整的建模。基础决定着大方向,因此务必要重视。

2.2.2 往年题目练习

和备战各类考试和竞赛一样,国赛也需要刷题。这个推荐在国赛前的暑假进行。主要目的:
1)互相监督,防止懈怠。暑假是大家时间最好协调的时候,当然也是最容易松懈的时候。与其定一堆好看的计划然后互相练习不到,不如一起做一些题,一起学习。
2)化理论为实践。踏实一点,三天之内从选题到做完一道题后,你们会很清楚你们的弱势是什么,及时的去查漏补缺。
3)学习前人经验。无论是做不下去参考着往年优秀论文做还是做完后“对答案”,总归是要看一些优秀论文的。这时候就见贤思齐吧,总结他们得奖的原因,并向他们学习。

具体实行形式就是,定一个连续的三天时间,模拟国赛,从发题选题到做题,硬着头皮做下来。具体做几套题可以依实际情况而定。我们组一共做了七套题,仅供参考。

每次练习的过程中,各成员要按照自己的分工,各取所需:
建模:总结优秀论文在模型创新点、使用算法、考虑方面上的优点。例如,对于数据分析类的题,模型检验的是有必要的,但是我们第一次做时就没有考虑到这一点。
论文:学习论文结构、行文方式、常见示意图形的绘制方法、排版等。因为论文是最终的结果,如何把你们的模型清楚的表达是需要一定技巧的:思路是用文字还是示意图展示?结果是放图还是放表?图表怎么布局?这些都是通过向他人学习以及在练习过程中自己总结。
编程:认真对待每一次练习,将练习过程中的程序整理保存好作为自己的代码库。一般来说,如果练习的题目相互差异较大,一个假期的练习下来,代码库的覆盖面应该合格了。如果觉得不够,编程的同学需要再花些功夫整理一个自己的代码库出来,不一定都是自己写的,也可以是复制或下载的,但要都调通,并且知道那些地方可以改动,尤其是复杂算法的实现,在比赛中很可能就是找一个写好的改一些参数和输入来得到结果。最后,因为我是编程的,这里插一句关于编程语言的选择问题。目前竞赛中常规的两种语言是MATLAB和Python,尽管Python总体来看是强于MATLAB,但鉴于比赛主要涉及科学计算和数据分析,孰强孰弱还真不好说。我的建议是,如果两种语言都没有基础,就学习MATLAB吧,MATLAB集成度很高,帮助文档也很全,对于竞赛来说是完全够用的。否则,就把有基础的语言往深里学即可。当时我被迫学了一些Python是为了画图,因为MATLAB被队友吐槽画图丑,现在看来也不尽然,稍微改一改参数你画出来的图还是可以看的,比如这张。
示意图

3 注意事项

这部分其实也包含一些非必需的赛前准备,我把它归为注意事项来分享。
1.论文排版
练习时看的优秀论文没有排版太丑的,我们就默认排版和得奖有一定联系(尽管可能并没有),因此我们队非常注重图的美观性和排版,在这方面下了不少功夫。图的话不好说,它与画图人的审美直接挂钩,但是排版上,这里推荐一下用Latex写论文,尽管入门比word稍微复杂一些,但是稍加练习就可以掌握,关键是一劳永逸…学成之后解决了一大半排版的烦恼。
2.比赛场地
听说有些学校是提供宾馆住宿的,如果这样最好;我们学校没有,最后还是选择找了个酒店住。因为熬夜几乎不可避免(本人三天睡了10个小时),频繁更换场地又很耽误时间,最好还是找个酒店一起做。
3.合理作息
比赛那几天的作息,规律是不可的,但是一定要科学。建模或者编程前一定要稍微休息让头脑保持清醒,思路理顺之后再该怎么肝怎么肝。我在国赛第一天选择通宵,结果第二天编程时,脑子几乎不响应了,最后去躺了一个多小时才可以正常工作。所以在这里提醒大家,不要盲目肝,做重要的工作前稍微睡一会,保持头脑清醒。
4.心态调整
在比赛过程中,我们在第二天陷入半崩溃状态,因为模型和编程都很慢。不过还好大家都互相鼓励,本着如果做不上来也太丢人了的心态去和赛题较劲,硬是熬了过来。不过那天我们还是有喝酒的、有和父母打电话的、有散步看月亮的…互相帮助着调整心态其实也很重要,现在回想起来,当时我们要是有任何一个人情绪崩溃,我们就只能弃赛了。

=============================================================================
本人的参赛经验差不多就是这些,这里只是从总体来分享一些经验给大家。至于比较干货的部分,比如源程序、画图技巧等,我考虑将其归为技术模块,后续以资料或者技术博的形式更新,谢谢大家的浏览!另外,再次匿名感谢我亲爱的队友~

<think>首先,用户在询问“如何编写复盘建模的文档或实现代码”。他们提到了“复盘建模”,这可能在数学建模的背景下,比如高教社杯(CUMCM),正如引用中提到的那样。用户引用了几个相关的引用,涉及数据导入、代码实现、文档维护等方面。关键元素:-**引用[1]**:从Excel文件导入数据并使用pandas合并,如`merged_data=pd.merge(...)`。-**引用[2]**:强调文档维护、使用参考文献和网络资料、使用工具如SPSSPRO和SPSSAU而不需要编程。-**引用[3]**:MATLAB代码示例,读取Excel文件、处理数据。-**引用[4]**:约束条件的数学表达式。-**引用[5]**:遗传算法代码在MATLAB中,用于优化问题。用户的问题聚焦在“复盘建模”上,意思是回顾性地分析建模过程,可能涉及记录步骤、代码和文档。我的回答应该:-使用中文,因为指令指定了“使用中文回答”。-在回答中自然地添加引用标识,如[^1]。-对于数学表达式:-行内表达式用$...$,例如变量或方程。-独立公式用$$...$$单独成段。-结构清晰:逐步解释如何编写文档或实现代码。-生成相关问题:在结尾添加§§相关问题§§。回顾系统指令:-所有行内数学表达式用$...$。-独立公式用$$...$$单独成段。-LaTeX语法正确。-中文回答。-生成相关问题。-回答中引用的段落末尾加引用标识。用户请求是关于“复盘建模”的文档或代码实现。从上下文看,“复盘”可能指回顾建模竞的过程,包括文档、代码和结果分析。结构化回答:1.**引言**:简要解释“复盘建模”的含义——回顾建模过程以记录经验教训。2.**编写文档**:-包括内容如问题背景、数据准备、模型建立、代码实现、结果分析。-参考引用[2],强调使用参考文献和工具。3.**代码实现**:-解释代码复盘的步骤,如导入数据(参考引用[1]),数据处理(引用[3]),模型求解(引用[5])。-使用代码块展示示例,如Python或MATLAB代码。4.**整体框架**:建议一个结构清晰的复盘文档或笔记本。5.**添加引用**:自然地提及引用来源。6.**结尾**:生成相关问题。生成相关问题:-相关问题应基于主题。-例如:1.如何组织建模竞的代码库?2.有哪些最佳实践用于建模文档?3.复盘中如何分析模型性能?确保LaTeX正确:-示例:如果有方程,如来自引用[4]的约束条件。-在行内用$\begin{cases}...\end{cases}$,如果短,或者用$$...$$如果长。-引用[4]有约束条件:$$\begin{cases}v_i,v_j,v_k\in\{0,1\},\\\sum(x_i\timesa+y_j\timesb+z_k\timesc)\leqW_{\eta}\end{cases}$$。这里用独立公式格式。回答大纲:-部分1:理解复盘建模——回顾过程以改进。-部分2:编写复盘文档的关键元素。-部分3:实现代码复盘的步骤。-部分4:示例代码或文档格式。-相关问题。最终输出格式:-回答使用清晰结构。-代码块用三引号。-数学表达式正确格式。-添加引用。-以§§相关问题§§结尾。</think> ### 如何编写复盘建模的文档或实现代码 复盘建模是指在数学建模(如高教社杯)后,系统地回顾整个建模过程,记录问题解决步骤、代码实现、数据分析和经验教训,以便未来改进和知识分享。复盘的核心在于文档化关键决策、模型逻辑和代码逻辑,确保透明度和可复现性。基于引用中的内容和我对建模实战的理解,我将从文档编写和代码实现两方面详细解释。回答结构分为“文档编写指南”、“代码实现指南”和“示例参考”,确保步骤清晰、实用可靠。 #### 1. **文档编写指南:复盘建模的完整文档** 复盘文档应覆盖建模全生命周期,包括问题定义、数据准备、模型构建、求解和结果分析。结构可参考学术论文或技术报告格式,确保逻辑连贯、易于理解。关键步骤如下: - **步骤1: 问题背景与目标** - 简要描述建模背景(如竞题目),明确目标和约束条件(如引用[4]中的约束公式): $$ \begin{cases} v_i, v_j, v_k \in \{0, 1\}, \\ \sum (x_i \times a + y_j \times b + z_k \times c) \leq W_{\eta} \end{cases} $$ - 添加背景文献引用(如从网络或论文中获取的启发),以支持模型选择[^2]。 - **步骤2: 数据准备与预处理** - 详细记录数据来源、导入和处理过程(如引用[1]的数据合并代码),包括数据清洗、合并和特征工程。 - 使用表格或图表展示数据样本(如Excel文件的导入),并说明损耗率、价格等关键变量。 - 示例:引用[1]提到使用`pd.merge()`合并Excel文件,这是Python pandas的常用方式,确保数据一致性。 - **步骤3: 模型建立与求解** - 描述模型选择理由(如优化模型、统计模型),并用数学表达式展示核心方程(如引用[4]的约束条件)。行内数学变量用$v_i \in \{0, 1\}$格式。 - 记录求解算法(如遗传算法在引用[5]中的应用),并分析参数设置(如种群大小、迭代次数),以突出关键决策点[^5]。 - **步骤4: 结果分析与优化** - 展示模型输出(如预测结果或优化方案),用图表可视化性能(如MATLAB在引用[3]中的图表定义)。 - 讨论模型优缺点、误差来源(如数据噪声或算法局限性),并总结改进建议(如使用SPSSPRO工具简化非编程部分[^2])。 - **步骤5: 经验教训与附录** - 列出团队分工、遇到的问题(如数据缺失)、解决技巧和竞心得。 - 附录中添加代码片段、参考文献列表(如引用[2]强调的维护资料文档)[^2]。 **实用建议**: - **工具使用**: 推荐Markdown或LaTeX编写文档,支持数学公式(如$$...$$格式)和代码嵌入。 - **协作**: 在团队竞中,分工记录各环节(如引用[2]所述,成员总结初稿)以提升完整性[^2]。 - **优化**: 定期复盘建模过程,可复用至似题目(如引用[3][5]的代码复用)。 #### 2. **代码实现指南:复盘建模的代码逻辑** 代码复盘的重点是实现可读、可重用和模块化的脚本,确保每一步操作(从数据导入到结果输出)有注释说明。使用Python(如pandas)或MATLAB(如遗传算法)是常见选择,以下以Python为主逐步实现: - **步骤1: 环境初始化** - 清空工作区并导入库,避免依赖冲突(参考引用[5]的`clear all; clc;`在MATLAB中): ```python # 初始化Python环境 import pandas as pd import numpy as np import matplotlib.pyplot as plt print("环境已准备完成") # 用于记录操作 ``` - **步骤2: 数据导入与合并** - 从多个来源(如Excel)导入数据,并处理缺失或异常值(如引用[1]的合并操作)。合并前确保主键一致(如单品编码): ```python # 示例:导入并合并Excel文件 data_1 = pd.read_excel('蔬菜商品信息.xlsx') # 假设文件名 data_2 = pd.read_excel('销售明细.xlsx') merged_data = pd.merge(data_1, data_2, on='单品编码') # 核心合并步骤 # 添加损耗率等数据 merged_data = pd.merge(merged_data, data_4, on='分编码') print(f"合并后数据形状: {merged_data.shape}") # 输出检查点 ``` - **步骤3: 模型实现与求解** - 编写模型函数(如优化问题),使用清晰变量名和模块化设计。独立算法部分(如引用[5]的遗传算法)添加详细注释: ```python # 示例:简易优化模型函数 def optimize_model(data, iterations=1000): """基于遗传算法求解优化问题。 Args: data: 输入数据DataFrame iterations: 迭代次数(参考引用[5]的参数设置) Returns: 最优解矩阵 """ # 定义目标函数(行内数学表达式如$min \sum x_i$) def fitness_function(vars): cost = np.sum(vars * data['成本系数']) return cost # 调用优化库(如scipy) from scipy.optimize import differential_evolution result = differential_evolution(fitness_function, bounds=[(0,1)] * len(data), maxiter=iterations) return result.x ``` - **步骤4: 结果输出与复盘验证** - 保存结果到文件(如Excel),并添加可视化复盘图(如引用[3]的图表处理): ```python # 保存结果并生成复盘报告 result = optimize_model(merged_data) result_df = pd.DataFrame(result, columns=['最优解']) result_df.to_excel('复盘_优化结果.xlsx') # 输出文件 # 绘制性能图用于复盘分析 plt.plot(result_df) plt.xlabel('迭代次数 (引用[3]的标签格式)') # 参考x轴标签 plt.title('优化过程收敛图') plt.savefig('复盘_收敛图.png') ``` **实用建议**: - **版本控制**: 使用Git管理代码版本,便于回溯和协作(如引用[2]提及的维护文档)[^2]。 - **模块化**: 将代码分割为`data_preprocessing.py`、`model_solver.py`等文件,提高可读性。 - **测试与复盘**: 添加单元测试(如`pytest`)验证关键步骤,并在文档中链接代码片段(如引用[5]的main函数结构)。 #### 3. **示例参考与最佳实践** 结合引用中的实战经验,复盘建模文档和代码应保持一致性: - **文档示例**: 创建一个`复盘报告.md`文件,结构如下: ``` # 2024C题建模复盘 - **问题**: 蔬菜供应链优化 - **数据**: 导入4个Excel文件,合并后维度为$n \times m$(引用[1][3])[^1]。 - **模型**: 优化目标为$min \sum costs$,约束如$$ \begin{cases} v_i \in \{0, 1\} \\ \text{资源限制} \end{cases} $$。 - **代码链接**: [优化脚本](optimize_model.py)(引用[5]的遗传算法实现)[^5]。 ``` - **代码复盘工具**: 使用Jupyter Notebook(支持Markdown和代码块)或Overleaf(LaTeX在线编辑器),方便整合数学表达式和图表(如引用[3]的MATLAB图表)。 **整体建议**:复盘的核心是反思和优化——每次竞后更新文档和代码库,积累为“保姆级”资源(如引用标题所示),提升未来建模效率[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LynnLee1229

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值