0 r1 A/ G9 m0 C" A! j! V" I! t( X9 g1 Q1 @! J4 Y J5 ]1 s+ t 数学建模经验谈(超实用) 数学建模个人经验谈 h$ {, s5 f* s9 X6 I2 e1 F% L; F3 L7 Q4 B9 V8 |! n
1 序 1 [% b% U- ]' |6 G7 { 7 I2 w; C. N; `5 P感到要在全国赛中取得好成绩经验第一,运气第二,实力第三,这种说法是功利了点,但是在现在中国这种科研浮躁的大环境中要在全国赛中取得好成绩经验是首要的。这并不说明美赛中经验不重要,在美赛中经验也是首位的,但是较之全国赛就差的远多了,这是由于两种比赛的不同性质造成的。 9 H# u% ]4 L8 ?5 s0 d ) b- A1 N$ K; X( i, T a5 z" f全国赛注重“稳”,与参考答案越接近,文章通顺就可以有好成绩了,美赛则注重“活”,只要有道理,有思想就会有不错的成绩,这个也体现了两个国家的教育现状,这个就不扯开去了。在数模竞赛中经验会告诉我们该怎么选题,怎么安排时间,怎么控制进度,知道什么是最重要的,该怎么写论文......,或许有人会认为选题也需要经验吗?经过参加了多次比赛后觉的是有技巧的,选个好题成功的机会就大的多,选题不能一味的根据自己的兴趣或能力去选,还要和全体参赛队互动下(这个开玩笑了,不大容易做到,只能是在极小的范围内做到),分析下选这个题的利弊后决定选哪个题,这里面道道也不少,后面会详细的展开谈谈。# E4 w3 | D1 V, [8 C# s
" s& [" S$ g) J5 g/ _
写这个东西当做是回忆下以前的点点滴滴,希望自己的经验能帮助一些新手(这样的说法不大好,暂时想不出更好的,凑活着先用着)能尽快的成长,尽快的发挥自己的能力,体验数学在应用中的作用,爱上数学,甚至和数学打一辈子交道。国防科大数学建模网的路过(向为)前辈曾经写过个新手教程,写的十分的好,希望写的这个能延续他写的那个教程,能给大家哪怕一点点的帮助。0 h- J. W# _" m( ^5 r% @( `. V
8 d t7 g j! k# a
6 _( n% X, R. g- u: E K+ U* K" t* n( q" V8 V1 i
2 组队和分工' U! y* S4 h( W" n' Q+ d2 y/ @) S
. D7 k, z# D7 U! j
数学建模竞赛是三个人的活动,参加竞赛首要是要组队,而怎么样组队是有讲究的。此外,还需要分工等等一般的组队情况是和同学组队,很多情况是三个人都是同一系,同一专业以及一个班的,这样的组队是不合理的。让三人一组参赛一是为了培养合作精神,其实更为重要的原因是这项工作需要多人合作,因为人不是万能的,掌握知识不是全面的,当然不排除有这样的牛人存在,事实上也是存在的,什么都会,竞赛可以一个人独立搞定。但既然允许三个人组队,有人帮忙总是好的,至少不会太累。而三个人同系同专业甚至同班的话大家的专业知识一样,如果碰上专业知识以外的背景那会比较麻烦的。 6 {1 z4 {# y( R/ A! e3 V! V: r$ G3 f
所以如果是不同专业组队则有利的多。众所周知,数学建模特别需要数学和计算机的能力,所以在组队的时候需要优先考虑队中有这方面才能的人,根据现在的大学专业培养信息与计算科学,应用数学专业的较为有利,尤其是信息与计算科学可以说是数学和计算机专业的结合,两方面都有兼顾,虽然说这个专业的出路不是很好,数学和计算机都涉及点但是都没有真正的学通这两门专业的,但对于弄数学建模来说是再合适不过了。应用数学则偏重于数,但是一般来讲玩计算机的时间不会太少,尤其是在科学计算和程序设计都会设计到比较多,又有深厚的数学功底,也是很不错的选择。; L" a& j$ r$ P4 o/ D6 S' |6 c
: {: G: G! |$ k2 B$ f/ b; @* }有不少的人会认为第一人选是数学方面的那第二人选就应该考虑计算机了,因为学计算机的会程序,其实这个概念可以说是对也可以说是不对的。之所以需要计算机方面的人是为了弥补数学方面的人在算法实践方面的不足,但是不是所有的计算机方面专业人都擅长算法实践的,如果要选的话就选擅长算法分析实践的,因为学计算机的不一定会程序,并且会程序的不一定会算法。拿出一个算法,让学计算机的编写程序实践不一定能行,不是小看计算机的,但是这种情况还是比较多的,不然可以看到参加ACM的数学系的居多,比学计算机的搞的好。因此一定要弄清这个概念,不是计算机的就适合的。3 { d; M) X7 h" C! K4 Y+ L
7 t/ i/ @) p7 x% T
所以在组队中有两种人是必需的,一个是对建模很熟悉的,对各类算法理论熟悉,在了解背景后对此背景下的各类问题能建立模型,设计求解算法。一个是能将算法编制程序予以实现,求得解。当然有可能是一个人就将这两种都具备了,这样的话再找个任意具备上述两种能力的人就可以了,以减轻工作量,不然非累死不可。第三个就是专门需要写作的拉,从专业角度看是需要别的专业,比较适合的有生物、土木、机电、电信或机械等专业。在数学建模中各种背景的问题都会出现,所以有其他专业同学的话可以弥补专业知识方面的不足。 0 |. Q& J- N$ j8 U5 c& {: u: l8 M; h
综上所述,组队要根据分工而来的,三个人要具备一个数学功底深厚,理论扎实,一个擅长算法实践,另一个是写作(弥补专业知识不足),如果一个组能有这样的人员配置是比较合理的。但是往往事事不能如意,所以不能满足这种人员配置的时候就尽量往这样人员配置靠。 ( \9 o7 P( {# B5 E, K6 j$ A# P# R2 I+ b) p
3 培 训 3 J' s9 L u6 H& c( n( ^ 3 k1 v4 X5 \ \& Y; b" P很多刚接触数模的朋友都会碰到一个问题,那就是什么都不会做,看着题目不知道咱们下手,干着急,然后,一旦经过指导之后就知道该怎么做了,同时在做的过程中会碰到各种各样的问题,发现不是算法不了解就是软件不会使用。假使一个题目会做了,但是如果碰到另一个题目又不会了,又不知道该怎么办了。如何使新手尽快的成长是个大家很关心的问题,讨论的也很广泛。各个学校都又不同的方法,有的是开数学建模培训班,有的是以题带连,有的是通过协会普及教育...,各个学校都已形成自己的风格和方法。纵观这些方法,个人感觉有很多不是太科学的地方,有的学校投入很多但是出不了成绩,这时就需要调整下培训方法了。& G0 G& P$ E8 s. P# C
; t" G, T' k; A
检验数模学的成果如何是每年的全国赛和美国赛,形式都一样是以通讯的方式完成给定的选题。而做课题的一般进程就是建模型,解模型,写论文这三步。所以从这三个方面去培训是最有效的,因此个人认为最有效提高自己的水平就是以题带练,在实践中提高自己。 ' b. [5 h0 j, c* a# l 7 P3 C# Y4 _ v0 ?4 K3 X$ x& R* b: t% m* [
N9 S6 t7 V5 m7 T
1. 建模型: 1 h3 i# B% {* h3 M1 X 4 r/ N4 h+ N5 H) I% O% U+ d建模型是最为关键的一步,新手往往是无从下手,这是因为知识面不光,缺乏背景知识, * a6 E5 a: \- s0 m6 a9 B; u k- V. s# D: z
背景知识对建模型来讲是很重要的,如果课题的背景刚好是本专业的,那就会知道问题的关键是什么,该怎么样去解决,而事实上往往不是这样,问题的背景是所不熟悉的领域,这个时候就需要查资料了解这个问题的背景和了解问题的发展,特点,关键所在以及前人是怎么解决的等等。因此需要训练查找资料和查找文献的能力。新手在知道该怎么做以后碰到的问题就是不会做,这个就是相关知识的缺乏了。2 `0 X w, I4 [
2 {5 |, k" v1 w& }
比如需要做聚类分析,需要用遗传算法,需要做相关性分析等等的时候不知道该怎么做?这个就是相关知识的缺乏,当然知道了解掌握全部的算法和知识是不现实的,但是常用的算法和知识是必备的,也是必须的,数模论坛的ducy前辈(董乘宇)曾总结过数模竞赛应当掌握的十类算法(具体可去数模论坛查找):蒙特卡罗算法,数据拟合、参数估计、插值等数据处理算法,线性规划、整数规划、多元规划、二次规划等规划类算法,图论算法,动态规划、回溯搜索、分支定界等计算机算法,最优化理论的三大经典算法:模拟退火算法、神经网络算法、遗传算法,网格算法和穷举法,一些连续数据离散化方法,数值分析算法,图像处理算法。基本上涵盖了数模中几乎所有的算法了,如果掌握了这些对于运筹优化类的问题就可以轻松解决了,但是随着近些年的发展看概率统计的手段在数模中的作用越来越大,所以除了上述十大算法之外还应当对统计方法有相当的了解和掌握。% C) j/ i7 r; ?& p7 y
" ?4 R' b) Q& G先前说过,要掌握所有的知识是不现实的,参加数模的其中一个能力就是现学现卖的能力,在最短的时间内掌握知识并将其应用,这个也是吸引很多同学为之着迷的原因,但这并不是说可以不去了解算法,什么都可以到竞赛的时候去学,那个时候就来不及了,因为只有了解的多,知识面宽广了,遇到问题时就知道该怎么办了,然后具体去解决问题。所以增广知识面,博览全书很重要。2 O9 R% C' o+ {2 |! {& L9 m
& q8 v# F+ C" b5 g% P; [0 k D0 k8 K$ a: h9 F, G
6 A+ s1 S! V t! w% S2. 解模型: ! N- {( Z* o) [! q2 ^; |4 c6 ~ w1 u) U3 c/ L( L
模型建好了,该怎么解是个常常令人头痛的问题,这个不仅时新手,而且一般是令绝大多数同学头痛的问题,辛辛苦苦把模型建了,但是解不出结果来,这个时候往往时间很紧了,常常另人无奈,所以培训的时候多做这些方面的训练是十分必要的。解模型实质上就是算法的实践。一般来讲是用matlab,mathematica,lingo,lindo,spss等等数学软件来求解,当然有的时候c/c++是很实用的工具。在这里推荐几本数学软件的书《精通matlab6.5》(北航张志涌所著)、飞思工作室出的那套matlab6.5的书、《数学运算大师mathematica4》、万保成老师所写的电子版的《lingo8 for windows》、《最优化模型与实验》,这几本书都是很好的,对掌握这些数学软件是十分合适的。而有些算法数学软件往往无能为力,需要用c/c++来编制程序来解决,对于c/c++个人掌握程度不同,不过如果多看些算法方面的书,多做些ACM类的练习是十分必要的。3 f3 q6 P0 i- _
6 b7 P6 f1 A* H7 Q0 H2 n
* i2 O2 A: U4 m" n; L. U7 `7 e4 J& V9 P3 e
3. 写论文: 3 |: \" ^7 R, V% ]+ H* r5 m) l( i' e( E& x j4 d9 }
论文是很关键的一步,写到这里已经写了很多“关键”的词了,事实也如此,步步关键, + N- w4 w& _& i' K % I. V- G% G1 o; O6 G; E. R" x其中一步做的不好都对结果有很大的影响,论文是所有工作的体现,如果论文写的不好就功亏于溃,在这里就吃过很大的亏的。因此多写写多练练绝对是有好处的,并且不是写完就算了,要不断的修改,修改到自己非常满意,修改到象所发表在数学期刊中的论文那样才可以。 8 x8 n( Q4 t/ H6 D5 x( b7 x) z, o! [* \8 t% Q8 r2 Q f
综上可得,最快最有效的提高水平的方法就是通过做题来发现自己的不足,通过学习弥补自己的不足,这样就查漏补缺,提高了自己的水平了,并且最大程度上取得了经验。 . J8 Y3 |# ?+ h: `" H" b c- U' h. r/ u) x H+ f9 Z. u$ m
4 p- I+ ` G4 P( z0 L& v 8 p( F; H5 _& I( ^0 k% x4 选 题 : S0 d, ?) Z) F% S: l" E; V$ O 7 e q( z1 `- F1 {) X在序中提到过如何选题,现在就具体展开讲讲。 % j6 J! c: S8 l5 A4 r* g8 x / _6 k/ ~8 t( I2 g3 i }$ P* c) w全国赛分为本科组和大专组,每组A,B两题,A为连续的,B为离散的。就我来讲只有运筹优化和非运筹优化两类,运筹优化的题目只要题意理解正确,模型正确,能正常求解,有参考答案,只要解在参考答案附近那基本就能得奖了。而对于非运筹优化类则要麻烦的多了,各式各样的问题都有,并且好些非常不好入手,并且一般来讲没有参考答案,只要有思想有方法就会得到好的结果。' n2 |) m( g; U1 M" Z6 I9 ?