这篇文章写于2006年,笔者刚比赛结束,原网站博客系统停止运营,转移到此。
-----------------------------------------------------------------------------------------------------------------
目标读者是谁:本文档主要是为想参加数模竞赛的同学而写,希望能让他们感同身受。
导读:本文写了三部分,第一部分“惘然回首”是对这次比赛的感悟,第二部分“追忆”是对4天比赛的详细描述,第三部分“写在最后”是对这次比赛的总结。要精读完本文,真的长了一些,如果对笔者的经历无兴趣,只想关心一下比赛中的注意事项,大可直接跨过前面两章节,从“写在最后”看起。
备注:该文只用于建模团队内部交流,包含的信息过于初步且过于详细,请勿用于发表。
我们希望发现一种精神——那是在“1+1+1>>3”中体现的当代大学生为了集体荣誉、为了同一个目标而忘我拼搏的精神,这种精神我们叫团队协作; 我们希望诠释一个理念——那是贯穿在比赛当中的一种“100-1=0”的科学态度和工程理念,这个理念我们叫严谨; 我们希望激发一种意识——那是比赛的初衷,也是社会发展的永恒动力,这种意识叫做创新; 我们希望揭示一个规律——那是在大学校园里那些精心策划的课程让我们觉得索然无味而一次比赛却能让我们受益终生的现象,这个规律我们叫实践; ——流子 |
惘然回首…
第三届数学建模比赛终于落下了帷幕,MM、靠兄和我经过四天三夜的艰苦奋战,终于在9月25日下午三点之前交上27页的论文,圆满的完成了任务。看着这烙有文字、数学公式、程序、示意图以及蕴涵着逻辑、推理、论证,更加渗透了我们团队汗水的27页纸张,我们的自信心得到空前膨胀,原来真的——没有什么不可能!不经意间联想到一个中国联通的广告—黑暗的天空中挂着巨型横幅“你们能行吗???”然后画面切换过来,MM、靠兄和我抬头、挺胸,紧握着拳头,双目炯炯有神的仰望着远方,异口同声的大吼一声“我能!!!”的极其搞笑的场面,令我不禁扑哧一声笑了出来…
这篇论文犹如一个婴儿诞生一样,让我们体验到了十足的成就感!四天时间内,靠兄和我睡眠时间总共加起来大概不到10个小时,MM睡眠时间大概是我们的两倍—不多不多!这次比赛她没有表现出贪吃贪睡的特长,我等幸甚,社稷幸甚…这也是有生以来通宵达旦时间最长的一次,感觉真TMD不是人过的日子,四天没洗澡,胡子阑珊,熊猫眼、红血丝,头皮屑跟火山灰一样,浑身油腻,T恤到最后都有股馊臭味了…几天下来人好像苍老了好多…几乎不敢相信镜子里的人就是偶。
这次数模比赛,据说我是小组长(这个光荣的身份偶一直不敢接受,压力忒大,直到比赛结束,看看结果还不错,我才坦然接受,否则我死都不承认),MM和靠兄负责建模、写论文,我负责编写程序,包括Java源程序(用于PC模拟,采集数据)和Matlab源程序(用于画示意图)。,在正式比赛前,我们经过了“半实战”训练,对数学建模的过程有了更深入的认识。我们从本科生数学建模比赛中也得到了很宝贵的经验,比如数据资料的存放、Matlab软件的应用、对题目的深入分析、三人如何默契合作以及任务分配等。
这次比赛我遇到了很好的partner——靠兄和MM,他们都和我一起在为解题竭尽全力,在此我很感谢他们的努力,不管结果如何,我们尽力了,努力了,就够了...
这是一次很难忘的经历,一个团队就单纯为了做成一件事,关在一个小房间4天3夜,废寝忘食,每个人都是那么的不遗余力,那么的全力以赴,以后恐怕再也没有这样的经历了,当比赛结束,MM提起这件事,我心里竟然不免有点伤感...
一丝惆怅,一点眷恋…
追忆…
第一天 初涉战场
说说比赛过程吧,第一天早上八点就拿到了赛题,A题是Ad Hoc网络中的区域划分和资源分配问题,单是题目加提示就有10页,加上专业性太强,我们直接放弃;B题是确定高精度参数问题,B题为什么会放弃做的我已经记不清了。C题是维修线性流量阀时的内筒设计问题,D题是学生面试问题,由于D题表面上看起来和我们以前看到过的二次分配问题比较像,以为搬个模型过来就ok了,加上C题需要背景知识,综合了师生资源的合理利用的考虑,经过一个下午的选C题还是D题的犹豫后,我们最终敲定做D题,后来才发现D题是那种看上去容易上手,一旦进去以后就像进入迷宫一样恐怖的要命,但既然选择了,那就硬着头皮做到底吧,暴汗!
选题选择好后就开始做了,一开始点思路都没有,靠兄去网上查关于分配问题的资料,开始两天由于网络不好,多少造成了资料搜索不足,这其实不能怪靠兄的。(咦?MM跑哪里去玩了),我从下午4点开始就开始写程序了,我选择的IDE为Eclipse3.1.1,用的语言是
Java,其实也就C和C++的思想,由于上半年对这个IDE用的很熟悉,通过debug纠正程序的错误、观察变量的变化也很容易,就决定用这个工具操刀,根据自己的思路,觉得Y2条件就是一个组合问题,我查了一下网上好像没有现成的组合计算及罗列的API函数,那就只能自己写这个程序了,几乎花光了我第一天的剩余时间,写出这个函数已经是凌晨12点了,由于网络也断了连续两天,那两天几乎没有查任何资料了,全部自己苦思冥想出来的...第二天凌晨到六点,我把最多允许面试组一个老师重复的程序写出来了,但是对这个排列规则很担心,因为在数据量少的时候有时候“面试组”老师分布很不均匀,这就违反了“Y1. 每位老师面试的学生数量应尽量均衡”的条件,而且当面试老师数为13个时,能面试的学生数为13,但当面试老师数为14时学生人数反而降为12,当面试老师数为15,能面试的学生数为又和面试老师数为13一样了,这三个和现实看上去非常矛盾的奇怪的数据搞得我很不爽,也造成了后来对该程序的错误否定,后来我仔细分析了一下,其实这个结果按照那种排列规则是合理的,因为计算机按照一定的规则解出的是规则的合理解而不是问题的最优解,问题的本身不在程序而是在规则,实在找不到更好的筛选法那时就先这样。第一天下午靠兄和MM查资料过程有点郁闷,只能一台上网,其他两台都不能上,根据已经有的思路,他们去查了一些资料。第一天白天比较轻松,晚上我和靠兄都异常兴奋,不想回寝室,干脆就继续干,到了半夜就剩下靠兄在查了,我在另外一台机子上写程序,偶尔我们会抬头用迷茫的眼神看看对方,然后缩回脑袋继续干自己的事情,现在想起那画面极其搞笑,有时候吃点零食,顺便也喂一下对方;靠兄无聊的时候就在一旁呆坐着看我写程序…
第二天 挑战自我
第一个晚上靠兄和我大概只睡了2个多小时,第二天早上六点多就起来了,七点多,MM拿着早饭杀回来了,嚯,好家伙,精神饱满!而我和靠兄已经有点身心憔悴了。我们随便吃了点早餐,就继续干活了。第二天是最痛苦最辛苦的日子,我们组遭遇了“滑铁卢”,我遇到了第一天晚上排列规则不合理急需更正的难题,更正的方法好像类似贪婪算法,反正就是用计算机很难实现的变态算法。大家也知道,人类的思维模式和计算机的思维模式毕竟有很大的区别地!搞了一天,也没出什么成果,脑子也被搞的七荤八素,思维混乱,身心憔悴,吃晚饭的胃口都没有了,人都快被逼疯了。其实后来我才发现,我第一天写的程序其实已经很好的完成解决该问题的核心模块,只要多验证几个数据点,我们就可以发现,该程序很好的满足了题目给出的要求,只要继续第一天的后续工作就可以了,但我却在中途走了弯路,在这里我要告诫大家的是,如果你写的程序的解虽然不是最优但是可行,不妨就继续走下去, “山重水复疑无路,柳暗花明又一村”嘛,毕竟把原先程序推翻重写工作量是很大地。 靠兄和MM那边有了第一题和第三题的数学模型,他们按照解题思路,分别完成了一三大题的部分小题的解答,不过他们在统计数据的时候也遇到了计算粗心的毛病(这里不点名批评了哈),白白浪费了5个多小时,真是可惜!用来睡觉多好啊…我思考到晚上8点,大家都非常疲倦了,看着凌乱的小房间和斗志消沉的战友,我感觉情况有点不妙,无形的压力越来越大,有点心灰意冷,干脆回寝室去了。
那晚我一直在努力把贪婪算法的思想融合到我的程序中去,但最终还是失败了,到了半夜4点多,人已经及其疲惫,感觉已经到了极限,算了,死了就死吧,倒到床上呼呼睡去。到了七点多,眼睛都还睁不开,但还是硬着头皮起来了,想想不能这样睡下去啊,否则可真的要完蛋!那没有编写成功的程序怎么办?想想我先前解出的也是合理解,退而求其次算了。
白猫,黑猫,抓得到老鼠就是好猫么!
第三天 放手一搏
顺便给同组的靠兄和MM买了点早餐又杀回那个小房间,猥琐地钻了进去,发现他们两家伙状况还不错,大松一口气,听同组的搭档说,问题一和问题三的第一小题已经解决了,第二题正在想着解决方案,我暗中窃喜,后来搞着搞着就到九点多了,因为数据量预测到后面很大,估计要从一百万的数据里筛选,我还是按照第一天写出的程序,对从4~30的老师人数进行最多重复老师人数为1和2的分别计算,记得计算机取得最后一个数据大概花了15分钟时间,呵呵,真恐怖!然后把这些离散点用Matlab画出示意图,竟然和预测的走势图一样,是一种抛物线的走向,感觉还不错,当我计算到老师人数为24,最多重复老师人数为2时竟然又得到了一个很好的数据点378,和问题二的379就差1,那么我只要在重复老师人数为3的面试组里选择一组,这个问题2的其中一小题就可以解决了,虽然核心程序是在第一天半夜出来的,但感觉我的很多成果是在第3天出来的,真的很感谢上帝的眷顾,阿们!
我把他们给的公式用Matlab画出了走势图,和计算机模拟的数据进行比较发现趋势差不多,更加开心!和他们讨论了一下,他们也肯定了我的算法,然后我针对教师人数为24,面试学生人数为378的点,对每个老师面试学生人数进行统计,得到了更加喜人的结果,每个老师面试的学生人数竟然都是63!!!完全均匀!!!这就完全消除了我对自己算法可能会造成教师面试学生人数分布不均的现象;然后我又对378个数据进行筛选,文理分科后剩下300个数据组,对每个老师面试学生人数进行统计,居然分布也很均匀,面试学生人数都是50,而我还需要我对重复老师人数为3的面试组里选择79组,因为所剩时间很少了,编程实现也不是很容易,估计又得花我许多的时间,我就干脆让在我们身边一直转悠的本科一PPYYMM帮我干着体力活---手工选!而我则对24位老师面试的379个学生分别统计,每位老师面试了哪几个学生,这个程序大概是凌晨12点左右出来的,还比较顺利,中间纠正了一个小bug程序就顺利通过了;有趣的是,由于那个本科MM到了10点半寝室要熄灯,不能上网,只能以短消息的形式把79*4数据发给我,真是痛苦呵,后来虽然没有用上,但很是感谢她,这样枯燥的活不是谁都愿意接受干的!我自己大概花了两个多小时把数据进行了提取,中间发生过统计错误,真是很懊恼,一开始的白算了,重来!期间很累,不知道什么时候睡去了,五点半醒来继续算,听说那1个半的睡眠过程中我的鼾声很重,呵呵,可能我真的很累了…最后我拿到了79组数据,由于我对通过Matlab读取数据已经有了现成的程序,对“24位老师面试的300+79个学生分别统计,每位老师面试了哪几个学生”的程序我根据java中已经写好的程序翻译了一下就变成了Matlab源程序,很顺利!每个老师面试的学生人数最多也只差2个,效果很是满意,那时已经第四天早上8点左右了,离交卷时间已经很接近了,我的编程工作也差不多完成了。Good programmer!我自我表扬了一下,嘿嘿!
第三天大家都抓的很紧,他们利用目标规划的思想给出了第二题的模型,good work! 后来他们又把前三题的思路理了一遍,也很顺利!
第四天 奋战到底
最后一天是我们已经心力交瘁,身体已经快到了崩溃的边缘,但是靠兄说我们要顶住,于是乎我们就顶住!早餐靠兄买了点,后来竟然大家都没吃,估计大家都感觉到了时间的紧迫,但那时真的都已经没胃口和浪费时间吃饭了,最后剩下的任务就是最后一题,主要是对模型的扩展,我们把时间段的因素考虑了进去,我需要做的工作是对379组数据无学生编号重复和教师编号重复的选出三组,每组又分6小组(因为是24个老师,每小组4个么);又对第三天凌晨得到的“每位老师面试了哪几个学生”手工两两比较,后来这个体力活让靠兄的师弟帮我干了,呵呵!真是人多力量大,最后一天,靠兄老是说“顶住顶住”,搞得整个组心情倒蛮不错的,最后快完成的时候,靠兄活蹦乱跳的,像只猴子一样搞笑!最后几个小时我们都在赶,中饭已经完全顾不上吃了,靠兄在修改整理写的论文,MM在解答第四小题,我在解答第四小题要给数据的那部分,最后时刻,听到外面冲锋号响起,靠兄骂他们外面简直变态,MM说倒是很符合现在的情况,人家大一新生军训嘛,呵呵。直到下午交卷,我们仨人终于都松了一口气。
最后交卷,打扫房间,和他们喝了瓶啤酒共庆合作愉快,搬电脑,走人…
小房间又恢复了往日的宁静...
写在最后…
最后综合了几位建模网友以及组里成员的心得体会,说点这次比赛带给我们的感觉吧,谈不上什么经验总结。
团队精神:团队精神是数学建模是否取得好成绩的最重要的因素,一队三个人要相互支持,相互鼓励。而我们中途遇到困难,大家也齐心协力,没有放弃,一直坚持到了最后;大伙都有一股不服输的拼劲韧劲;还有切勿自己只管自己的一部分(数学好的只管建模,计算机好的只管编程,写作好的只管论文写作),很多时候,一个人的思考是不全面的,只有大家一起讨论才有可能把问题搞清楚,因此无论做任何板块,三个人要一起齐心才行,只靠一个人的力量,要在几天之内写出一篇高水平的文章几乎是不可能的。而我自我感觉和靠兄交流的还不是很多,所以论文中编程思想和重要代码块的解释说明涉及的很少很少,这是我感到略微遗憾的地方。
有影响力的leader:在比赛中,leader 是很重要的,他就是全队的核心,如果一个队的leader 不得力,往往影响一个队的正常发挥,就拿选题来说,有人想做A 题,有人想做B 题,如果争论一天都未确定方案的话,可能就没有足够时间完成一篇论文了,又比如,当队中有人信心动摇时(特别是第四天,人可能已经心力交瘁了),leader 应发挥其作用,让整个队伍重整信心,否则可能导致队伍的前功尽弃;我本人对团队任务的协调能力也不是很好,只知道写程序,没去多关心其他成员的进展情况,这样就造成了有些时候人力资源闲置,有些时候人力资源反而匮乏的问题,统筹规划的能力有待提高!
对时间的统筹安排:任何事情,合理的时间安排非常重要,建模也是一样,事先要做好一个规划,建模一共分十个板块(摘要,问题提出,模型假设,问题分析,模型建立,模型求解,结果分析,模型的评价与推广,参考文献,附录)。你每天要做完哪几个板块事先要确定好,这样做才会使自己游刃有余,保证在规定时间内完成论文,以避免由于时间上的不妥,以致最后无法完成论文。我觉得我们三个人的分工还是很合理的,靠兄和MM查资料、建模,写论文,我编写程序、给出他们要的数据和示意图。
数据资料的管理:对数据的合理存放以及细心处理将大大提高工作效率。这次建模我们组表现不足之处就是数据资料不会整理,到处丢,到处找;我们组的某些成员数据处理时不够细心,重复作业,造成了精力和时间的浪费。
正确的论文格式:论文属于科学性的文章,它有严格的书写格式规范,因此一篇好的论文一定要有正确的格式,就拿摘要来说吧,它要包括6 要素(问题,方法,模型,算法,结论,特色),它是一篇论文的概括,摘要的好坏将决定你的论文是否吸引评委的目光,但听阅卷老师说,有些论文的摘要里出现了大量的图表和程序,这都是不符合论文格式的,这种论文也不会取得好成绩,因此我们写论文时要端正态度,注意书写格式。
论文的写作:我个人认为论文的写作是至关重要的,其实大家最后的模型和结果都差不多,为什么有些队可以送全国,有些队可以拿省奖,而有些队却什么都拿不到,这关键在于论文的写作上面。一篇好的论文首先读上去便使人感到逻辑清晰,有条理性,能打动评委;其次,论文在语言上的表述也很重要,要注意用词的准确性;另外,一篇好的论文应有闪光点,有自己的特色,有自己的想法和思考在里面,总之,论文写作的好坏将直接影响到成绩的优劣。
算法的设计:算法的设计的好坏将直接影响运算速度的快慢,建议大家多用数学软件(Mathematice,Matlab,Maple, Mathcad,Lindo,Lingo,SAS 等),这里提供十种数学建模常用算法,仅供参考:
1、蒙特卡罗算法(该算法又称随机性模拟算法,是通过计算机仿真来解决问题的算法,同时可以通过模拟可以来检验自己模型的正确性,是比赛时必用的方法)
2、数据拟合、参数估计、插值等数据处理算法(比赛中通常会遇到大量的数据需要处理,而处理数据的关键就在于这些算法,通常使用Matlab 作为工具)
3、线性规划、整数规划、多元规划、二次规划等规划类问题(建模竞赛大多数问题属于最优化问题,很多时候这些问题可以用数学规划算法来描述,通常使用Lindo、Lingo 软件实现)
4、图论算法(这类算法可以分为很多种,包括最短路、网络流、二分图等算法,涉及到图论的问题可以用这些方法解决,需要认真准备)
5、动态规划、回溯搜索、分治算法、分支定界等计算机算法(这些算法是算法设计中比较常用的方法,很多场合可以用到竞赛中)
6、最优化理论的三大非经典算法:模拟退火法、神经网络、遗传算法(这些问题是用来解决一些较困难的最优化问题的算法,对于有些问题非常有帮助,但是算法的实现比较困难,需慎重使用)
7、网格算法和穷举法(网格算法和穷举法都是暴力搜索最优点的算法,在很多竞赛题中有应用,当重点讨论模型本身而轻视算法的时候,可以使用这种暴力方案,最好使用一些高级语言作为编程工具)
8、一些连续离散化方法(很多问题都是实际来的,数据可以是连续的,而计算机只认的是离散的数据,因此将其离散化后进行差分代替微分、求和代替积分等思想是非常重要的)
9、数值分析算法(如果在比赛中采用高级语言进行编程的话,那一些数值分析中常用的算法比如方程组求解、矩阵运算、函数积分等算法就需要额外编写库函数进行调用)
10、图象处理算法(赛题中有一类问题与图形有关,即使与图形无关,论文中也应该要不乏图片的,这些图形如何展示以及如何处理就是需要解决的问题,通常使用Matlab进行处理)
以上便是我们这次参加这次数学建模竞赛的一点心得体会,只当贻笑大方,不过就数学建模本身而言,它是魅力无穷的。我想有过类似经历的同学和朋友十几二十年后,想起数学建模的战友以及一起度过的那段时光,应该还会会心的一笑。
**Every bird has its own sky ***
*E-mail: 41157121@qq.com *
*********************************
笔者:江贵龙 章靠 郑桂芬
(浙理工2006研究生数学建模组员)