关于数模中编程的一点愚见

来源:互联网 发布:医院数据分析报告 编辑:程序博客网 时间:2024/06/06 02:38
     2011数模国赛已经过去整整三个月,作为负责编程的队员,在此发表一点愚见,也作为年末一点总结,请各位选择性吸收,欢迎拍砖。
     编程语言,这个估计是大家最关心的。数模中编程语言首选Matlab,世界公认加默认。当然c语言和其他高级语言也可以使用,毕竟过于通用,在使用上效率不足Matlab。这个效率不是运行的效率,而是解题的效率。但是如果你是c语言或其他语言的顶级大牛,就当我前面说的都是废话,甚至直接忽略我这篇文章,因为你完全有能力搞定所有这些问题,我所说的不过是给普通大众的一点捷径而已,算得上“旁门左道”。可惜,90%以上的童鞋不是。
     Matlab由于其强大的科学计算功能,以及封装的各种toolbox,成为建模编程的得力助手。c在这点上略逊一筹,很多都得自己动手写,尽管c++提供了各种模板库之类的东西,运用起来也不是像Matlab这样的轻松。至于编程语言方面的比较,我也不想说太多,因为语言各有利弊,Matlab卖的那么贵也是有它的理由的。
     Matlab建模优势很大。我仅仅抛砖引玉说几点。首先是各种toolbox和function,它们绝大部分是Mathworks公司的顶级工程师的研究成果,当然有些也是成熟算法的Matlab实现,你也可以自己去Google上寻找业余Matlab爱好者写的toolbox,里面不乏非常出名的算法大牛。Matlab可以轻易的进行矩阵计算,二维三维图形绘制,概率统计,信号(图像也是信号)处理(学通信的童鞋都知道,这个在大三有随机信号分析和数字信号处理等课程要用到),Simulink系统仿真......甚至嵌入式方面也有涉足(记得最初是从奔哥那得知的),还能轻易地其他语言混合编程(本人曾经试过用Matlab里的deploytool将自己写的function编译成托管dll供C#调用,实现简单的C#图像处理应用。具体操作方法不在此介绍,有兴趣者可以参考Matlab高级编程或者Google,Mathworks官网也有简单的视频教程)。
     特别要提的是第三方Matlab toolbox。之所以要提得原因就是,数模的时候,时间紧迫,要是碰到编程很复杂的题目,可能三天都无法出来结果,这个是最可怕的。我记得集训期间,做相机标定的那个题,机器视觉这种研究热门,自然少不了Matlab的身影,于是找到一个Camera Calibration Toolbox for Matlab(http://www.vision.caltech.edu/bouguetj/calib_doc/),最终由于出题思路与普通方法有差距而没用到这个toolbox。但是今年国赛的A题,寻找污染源的问题,需要用到Kriging插值,由于普通教程讲解和公式推导晦涩难懂,编程难以下手,当时打算使用ArcGIS软件直接进行插值后图形绘制,然而事情终不是如你所愿,一个软件3G左右,实验室流量有限,网速有限,要是下下来整个实验室的队伍全完了,而且也要等到猴年马月,估计国赛都完了。因此,遇到这种情况得保持镇定,其实只要稍微花上5分钟Google一下,你就会找到一个名叫DACE-A Matlab Kriging Toolbox( http://www2.imm.dtu.dk/~hbn/dace/)的东西,还有详细的使用例子,当然,前提是你能读懂简单的英文(这个后面再说)。也正是这个toolbox,省掉了一大堆代码和时间,解题效率必然呈指数式增长。
     其实平时训练Matlab的过程中,我不建议太过于依赖toolbox,那个是纯粹的比赛技巧。数模国赛组委会和Mathworks公司近两年联合推出了一个Matlab创新奖,我想获得这个奖肯定不会是靠投机取巧所得。
     要是你不喜欢Matlab,感觉它没什么意思,那你错了。在Matlab的命令窗口输入demo,在打开的Help browser里你会发现如

Minesweeper (扫雷)
World Traveler 3-D Globe(3D地球仪)
之类的GUI小游戏和美妙的2D、3D图形,全部是用Matlab实现的,绝对会让你眼前一亮。当然网络上也有很多发烧友的小程序,也非常有趣(比如萝卜驿站:http://luobo.ycool.com/)。关于如何学习Matlab以及一些Matlab的操作技巧,我也不多说,网上教程很多,这方面的课本和资料也十分丰富。只要培养起兴趣,平时多动手谢谢代码,都会成为高手的。
     说了那么多Matlab,提谈谈刚才提到的英语。数学建模中英语也是必过的一关,美赛尤其重要(这个我也没参加,先不说)。因为编程的队员负责的不能只是编程这一部分,也必须懂得资料和数据的查找,海量数据处理,建模相关数学知识,以及论文格式排版和内容修改,会使用绘图等工具软件and so on。你不可能提前得知题目的类型,尽管类型也只有那么几十种,但是资料在哪里找却不能预测。英文的功底决定你可以上国外的网站(也得懂点翻墙什么的技巧)找相关数据,可以看懂相关英文文献,可以使用相关英文软件(毕竟不是所有软件都是国产和汉化后的,国产的一般不给力,但是有能力也可以自己提前汉化一下通用的英文软件,不过这个很费时间,考虑到个人因素,大家看着办,想当初自己费劲心血汉化完Lingo后,发现网上已经有了汉化版,瀑布汗当时。但是后来发现那个汉化版很多还是不太准确的,用自己的实在。这里有侵权之嫌,友情提示最好不要作为商业用途,后果自负)。另外就是Matlab的Help之类的了,有些几乎找不到找到中文解释的,必须得咬咬牙看英文了。
     另外Lingo也是一种很好的建模语言,在求解优化问题等方面具有得天独厚的优势,由于本人基本上没有实践过,也毫无经验可言,不过推荐大家学习学习。
     前面说的是编程语言,其实数模过程中语言都是次要的。重要的是结果,结果重于过程,有悖于常规观念。但是这是事实。除非碰到类似于公交车调度一样的题目,写出来的代码评委一般不太重视的,代码最终也只是当做附录处理,毕竟数模不是ACM,不是纯粹的程序设计。数模看得是解决的方法和你得出结果,至于你是怎么得出正确结果的,那都无关紧要。编程过程中也不需要写出速率最优化的代码,但是前提是保证能短时间内出结果。这些对于一个专业程序员来说也许是很不好的习惯,但是记住,这是数模。你可以写一千行代码得出结果,也可以写10行得出一样的结果,可以运行1分钟出结果,也可以运行1s出结果,只要结果正确了,其他都不重要了。但是记住,这是比赛,不是训练,训练要有成果,必须练好基本功。
     说到结果,数模中可以“不择手段”。这也算是编程队员的一种必备的能力。比如拟合一个特别复杂的非线性方程,Matlab处理的时候有个“缺点”是必须选择合适的初始值,否则选择不当,迭代N次后拟合效果可能千差万别。而正确选取初始值也是十分麻烦的事,记得以前做本底趋势线拟合的时候找到一篇专门研究如何估计初始值的论文,不过后来放弃了。不仅是Matlab,专业拟合软件如Origin等也要手工选取初始值。但是使用过1stOpt的人,却可以不费吹灰之力得到很好的结果。1stOpt虽然是国产软件,在拟合和优化方面却力压群雄,提供神经网络、遗传算法、蚁群算法、模拟退火等专业算法的选择,甚至包括一种自创的高效算法,在无需手动设置初始值的情况下短时间内拟合出方程并绘图和预测。题目中拟合只占了很小一部分,若是花太多时间在代码上,无疑会在比赛中处于下风。
     这样,学会各种专业软件,具备短时间内学会小众软件的能力也是编程队员的优势。我曾经做过一个小的整理,并对各种主流和很有用的小众软件进行了一个归类,如下(不完整,可以按需要去收集,数学中国上面有):
     科学计算:Matlab、Maple(符号计算) 、Mathematica、Excel(绘图、统计)
     概率统计:SPSS、SAS、Eviews、Origion(拟合) 
     系统动力学仿真:Vensim
     优化:Lingo/Lindo、1stOpt 、WinQSB(规划)     
     绘图  :SigmaPlot(专业的科学绘图软件) 、ScienceWord、SmartDraw(很强大的绘图工具)、几何画板 、autoCAD
     其他小众软件:图论、AHP(层次分析法)…
     其他功能软件:tortoiseSVN(版本控制)、dexpot(虚拟桌面)、酷盘(局域网共享协作)
     其他:ansys(有限元分析)、comsol、FLAC2D/FLAC3D...
     有了这些杀手锏,基本上效率可以提高一倍了。其中要提一下的是Excel,很多人觉得它功能不足,其实Excel在数据处理和绘图方面毫不逊色与专业软件,特别是最新的Excel2010,看过有人用它来画动漫人物的视频,至今膜拜不止,不过数模中不推荐用它绘图,太花哨了。
     至于注重自己实现代码,还是使用工具走捷径,很像哲学中的唯物主义和唯心主义,要是你只是功利性地想获奖,那就做个唯物主义者吧。
     刚才归类软件的时候,也将版本控制等功能软件放进去了。这个是有目的的。版本控制很有用,这个对很多程序员们都再熟悉不过了。要是没听过,就不厌其烦听我说我吧。编程的队员可能不会一次就完成代码,经常不断修改更新代码,但是要是修改过之后把以前版本删除了,后来又要用到怎么办,手动备份是见吃力不讨好的事。这时候版本控制软件就起作用了,配置好服务器和版本库,接下来的工作就只是简单的更新和提交了,系统自动打上时间戳,以便于后续的版本修改对比。数模中论文丢失莫过于最恐怖的事,这个同样交给版本控制,不能说万无一失(硬盘损坏也可能发生,做好备份很关键),也能减轻一点工作吧。
     另外虚拟桌面有时候也有必要,这个得看个人喜好。要是你用的是Linux系统,那就完全可以略过这里。绝大部分童鞋还是用的Windows系统,毕竟Word写论文还是挺方便的(专业排版还是去用Latex吧,不过一般word足够,尽管word经常会出现很多奇怪的问题,Latex听说要写代码的,编程大师弄的东西就是不一样)。虚拟桌面也就是虚拟出几个桌面出来(很废话),以便管理混乱的窗口。数模的时候开个word,开个excel,开个Matlab,开个浏览器、记事本、图片查看器、资源管理器......这都是家常便饭,弄个虚拟桌面,占点资源换来方便也有价值。要是你有多台显示器,接在一台电脑上也不错,就不用什么虚拟桌面了。
     当然还有那个局域网共享。数模是三个人的战斗,但是往往要使用多台电脑协作,资源共享是件麻烦事。比如写代码的时候,开两台配置好环境的计算机,以备不测,必能大大减轻单机的负荷。U盘太慢,也容易损坏文件,移动硬盘,估计不一定有,有也不方便。搭好局域网,做好共享很必要。QQ局域网传文件也可快,可惜无法多人同时协作和共享。我们国赛期间用的酷盘,其他的没试过,可能有更好的东西,大家可以去摸索。
     编程的人需要做的不仅仅是这些,比赛前做好万全的准备才能有条不紊。等到比赛时再去到处找代码写代码,那就晚了。好的习惯就是平时将各种代码搜集整理好,我这里有个列表仅供参考,如有疏漏,恳求指出:
l  规划&优化(lingo):0-1规划、线性规划、整数规划、非线性规划、动态规划、单目标、多目标、
l   图论:最短路径、hamilton圈、旅行商TSP问题 、最小生成树、网络最大流、最小费用流、
l  插值拟合 :插值、线性拟合 、非线性拟合、最小二乘拟合
l  概率论&数理统计:概率模型、方差分析、回归分析(二次曲线回归,线性回归)、
                                   假设检验、分布拟合检验、参数估计
l  微分方程:常微分方程、微分方程组、稳定状态、灵敏度分析
l  差分方程:
l  时间序列:
l  马氏链:
l  聚类分析 :
l  智能算法 :神经网络、遗传算法(gatool)、模拟退火
l  排队论:
l  判别分析:
l  生存数据分析:
l  综合评价:层次分析、综合评分法、综合指数法、Topsis法、秩和比法
l  预测:灰色预测
l  系统仿真:蒙特卡洛
l  模糊数学:模糊聚类、模糊综合评价
l  图像处理:灰度化、二值化、滤波、边缘提取、三维重建
l  数据处理:主成分分析、因子分析
l  解方程:
......
     最好是Lingo和Matlab代码都准备好,尽量收集到并提前做好测试,相关软件前面已经提过,不再赘述。
     以及各种数据处理方法:

a)  回归分析法(数理统计方法)-用于对函数f(x)的一组观测值(xi,fi)i=1,2,…,n,确定函数的表达式。

b)  时序分析法--处理的是动态的时间序列相关数据,又称为过程统计方法。

c)  多元统计分析(聚类分析、判别分析、因子分析、主成分分析、生存数据分析)。

     还有图形绘制:条形图、折线图、散点图、饼图、频率分布直方图......
     当然,资料和数据收集地址也得提前找好,当初比赛前我提前下载了1985-2009年的国家统计年鉴,费了不少流量。现在将有关资料放出来:
资料检索:
n  CNKI入口(西电图书馆的CNKI账号已经过期,只有出此下策了)
http://202.119.208.220:8002/kns50/index.aspx
http://61.155.19.94:8011/kns50/
http://cnki1.sztsg.net/kns50
n  OA开放图书馆
     http://www.oalib.com/search.asp?q=&sa=OA%E5%86%85%E5%AE%B9%E6%90%9C%E7%B4%A2
n  万方数据库(期刊,论文)
n  超星图书馆(图书馆入口)
n  百度文库,豆丁(下载器)

l  数据检索
n  中国教育统计网
http://www.stats.edu.cn/
n  中国统计年鉴
http://www.stats.gov.cn/tjsj/ndsj/
n  国家数据统计库
http://219.235.129.58/welcome.do
n  中国宏观数据挖掘分析系统
http://number.cnki.net/cyfd/
n   中国基础教育网
http://www.cbe21.com/subject/physics/
n   中国证券网
http://www.cnstock.com/
n   中国科学气象数据网
http://cdc.cma.gov.cn/
n   中国科学文献服务系统
http://sdb.csdl.ac.cn/
n   中国引文数据库
http://ref.cnki.net/knsref/index.aspx
n   中科院科学数据库
http://www.csdb.cn/
n   中国动物主题数据库
http://www.zoology.csdb.cn/
n   中国统计年鉴下载:
http://lib.njue.edu.cn/libtool/data.htm
     
     最后,说明一点,组队的时候,最好能有两个会变编程的队友,这样遇到像公交车调度的问题,以免出现孤军奋战的局面。两个人可以进行思想的碰撞,必然会提高效率。
     希望以上愚见对诸位希望参加数学建模,畏惧数模编程的童鞋起到一丁点的帮助。
     祝参加数学建模的童鞋都能取得好成绩~~~~
     (初稿。后续可能加入更多经验,尽请期待)

     
原创粉丝点击