數學建模比賽中,程序員具體需要做些什麼,以及程序員的數學水平應該達到什麼程度?

馬上要校賽了,想去水一把…求來幾個參加過mcm的碼農學長講講自己的經歷,謝謝啦~


個人覺得,數學建模競賽分工不要太細,個人很不贊同所謂分工:建模,編程,論文。

數學建模競賽組隊最好的配置是三人都同時具備以上三種能力,除此之外,很重要的一點還有文獻檢索和文獻閱讀能力。文獻閱讀有多重要,暫且不說有的人數學建模完全靠吹水獲獎,我個人就有一個深刻的體會:

2014國賽,我拿到了A題國一(當然這沒啥,A題一百多個國一),但是論文評分全國第二,入選官方論文集《工程數學學報》(AB兩題在兩萬多篇論文中共選出10篇,其概率遠小於美賽拿O獎)。當時在論文集約稿前給了我一個修改意見,當時重點指出我們論文的創新點是在月影太陽光照因素的考慮上(2014年A題尋找最佳降落點),而這一想法恰恰是因為我們搜到了一篇絕大多數人都沒有看到過的會議論文(論文檢索技巧很重要)。因此,數學建模競賽不是閉門造車,必須要做到「站在巨人的肩膀上」。

扯了這麼多,好像有點跑題,但其實不是如此,主要是說,不要限定某個同學就是建模,或者就是編程,三個人都最好做到全面,因為一個人很難完全理解另一個人的思維。比如,建模者必須負責論文撰寫,不然很可能是模型與結果脫節,甚至文不達意。

那具體在編程上需要掌握那些東西呢,我覺得無外乎一下三點:

一、數據處理。對於部分需要數據支持的題目,必須要搜集數據,完成數據預處理,將數據格式規範化,便於後面的建模與求解。

二、代碼編寫。這部分比較寬泛,總之是要把你的理論模型使用代碼事先。有的問題可能遇到現成的代碼,修改下即可,但這種問題不多,大多數問題需要自己重新編寫代碼。使用的語言和工具不限,只要是能實現功能即可。常用的有MATLAB,Python,SAS,Lingo等。關於這塊,可以詳見我之前回答的:數學建模一般用哪種軟體比較好?MATLAB是否有局限性? - 數學建模老司機的回答 - 知乎

三、可視化。這一點非常重要,一篇優秀的數學建模論文,必須做到良好的可視化,也就是要有高質量的圖片。這點可以參考學術論文中的圖片要求。


我記得本科時候做數學建模, 除了老師帶領下幾個真神組隊衝擊outstanding, 其他情況下隊伍構成都是這樣的:

  1. 程序猿 ( 開發 ) ( 你 )
  2. 項目經理 ( 你的隊友 )
  3. 項目經理 ( 你的隊友 )

懂了吧, 儘管你有兩個隊友, 但是活都是你的.

你要去建模(微分方程, 機器學習演算法, 圖論)

去寫程序搞定你的模型(做A題的話你要會數值分析, 有些地方也叫計算方法. 至於決策樹, 圖論, PCA降維, 聚類分析什麼的, 那就是程序猿的老本行了)

debug你的程序得到看上去正確的結果( 誰寫程序誰debug, 不過分吧 )

最後你還要在論文裡面詳細的描述你的演算法和實現過程(程序猿你敢不寫文檔? 況且你那些實現步驟別人也不一定看得懂)

如果你碰巧在用LaTeX寫論文, 那麼排版的活就交給你了.

然後.....還有什麼來著?

如果你足夠幸運, 你的隊友可以負責以下事情:

  1. 用控制理論建模( 有一年養老金問題, 用的古典控制理論, 零極點配置什麼的算策略穩定性 ), 這絕對是大殺器(加分點).
  2. 推微分方程/很複雜的積分. 有的程序猿不學微積分, 而是用離散數學把這個課頂掉了. 講真, 一個封閉解(數值解)比那些用數值計算的高到不知道哪裡去了. 也會在你的成績裡面直接體現. 當然, 你要讓他們把所有方程都轉化為差分/迭代方程.

  3. AutoCAD, SolidWork 你以為數學建模用不著這些軟體? 圖樣, 你見過那年的摺疊凳子么?
  4. Ansys, Catia 有些學機械, 船舶, 水聲的同學能用得到.
  5. 傅里葉分析/小波變換/隨機信號處理: 見過有些通信的大神在用, 效果拔群
  6. 用R, matplotlib, 各種GIS系統畫出非常漂亮的圖像

如果不幸的話(通常情況), 至少也能做以下的工作:

  1. 寫問題重述
  2. 百度一些雜七雜八的東西充實你論文的篇幅
  3. 人工清洗臟數據
  4. 在視頻里數車( 有一年數據是一個一個多小時的十字路口視頻 )
  5. 使用百度翻譯 (面向美賽的論文寫作 )
  6. 用Excel, origin畫圖

一定不能做的事情:

  1. 在單身程序猿邊上秀恩愛, 這導致了有一次開發人員的直接退賽


拿過幾次獎,一直是編程人員的冒泡。

對如今的數學建模競賽,幾乎沒有可以手算的題目,數據都一大堆,怎麼也要編程算。而且每年美賽都至少有一個演算法主導的題,那就更不用說了。

一般來說,碼農質量最終決定了模型的質量。原因無他,模型再強,算不出結果都是扯淡,會被寫作人員扇耳光的。

根據我自身經驗,基本上從問題到結果可以分成三個步驟: 問題化簡重述(假設與補充),數學描述(數學模型),演算法描述與計算(計算模型與結果)。

事實上除了第一步參與成分較少,對編程人員而言後兩步都是必須參與的。第三步設計出彩的演算法然後實現最後給與文字說明這個自不用說,第二步最低程度也要徹底弄明白他人設計的數學模型的指導思想和各參數各方程含義。由此,需要的能力大致如下:

數學能力,看懂數學模型,理解含義,不存在理解上的誤差。

演算法設計能力,熟悉大量有效演算法及其應用範疇,有改進和結合多個演算法的基本能力,有分析演算法時空性能的能力。

編程能力,熟悉至少一種可以用於科學計算的語言或者工具,能夠完全實現自己的計算模型不出差錯。

文字表達能力,能夠形象而準確地描述演算法,與寫作人員順利交流溝通。

至於問要會什麼語言工具之類的,我認為並不一定必須精通matlab,很多問題你精通vba用excel都能算出結果,所以說工具不是唯一的。我美賽一等三次,第一次用c++,第二次用matlab,第三次用python,國賽一等三次,一次matlab一次lingo一次python,研究生賽一等兩次,一次comsol一次python。充分說明工具的不唯一,應該怎麼方便怎麼來。

但是演算法,涉及到的實在太多,簡單的迭代不是沒有,網路流也用過(圖還涉及各種拆點拆邊),近似演算法也沒少過,隨機調整蒙特卡洛甚至遺傳我都寫過。當然這與我們隊伍一直以演算法為核心有關,如icm題大都就不會如此坑計算,但也不會太簡單。

基本上,數學決定演算法可選擇範疇,編程決定最終模型高度,寫作決定好的模型能不能拿獎,三條腿都要粗才能穩啊…


講道理,這個問題取決於你隊友是什麼水平。

如果你很不幸...跟我一樣,隊友只會寫論文和查論文。那恭喜,從數據的收集-&>數據的清洗-&>演算法的選擇-&>演算法的實現-&>結果的分析-&>數據的可視化,你應該都要一個人獨立完成(微笑臉)

至於數學水平,假如你學完了《概率論》《線性代數》《高等數學》並且學的還不錯。應該是可以看懂大部分演算法的原理了。

港真,雖然我隊友技術不行,但是論文寫的一級棒。

最後,如果你的隊友是情侶,你一定要注意...不要經常看他們!不要經常看他們!不要經常看他們!(重要的事強調三遍!!!)


總共三件事:

建模,編程, 寫作。

那麼編程人員到底應該負責哪些呢?

那當然是:

建模,編程,寫作。


不知道有什麼錯誤被點了許多反對。還望評論指出。

/**************************************************************************************************************/

連續參加過兩屆。第一屆是碎紙拼接那個題目,第二屆是嫦娥奔月的那個題目。

碎紙拼接那個題目負責建模和程序以及論文(除過後勤的全套,隊友打輔助)。第一題是用的邊緣匹配的思想,最後實現用的方差。完美輸出。第二題用邊緣匹配就不行了,試了除過方差的很多演算法都不行。最後決定邊緣拼接,選擇起點,判斷是否存在環,也完美輸出。第三題沒時間人工干預了。最後結果是國二。

嫦娥奔月那個負責的是程序。建模的半天模型建不出來。我參考了某篇論文的一個公式把高程圖的識別做了。然後就是無盡的等待。最後一晚沒辦法我建了一個水水的模型然後程序實現,論文也是邊做邊寫。最後就醬油了。

在數學建模我覺得程序員應該做到:

1.精通高等數學 線性代數 概率論數理統計 計算方法 離散數學

2.精通數據結構與演算法

3.熟悉MATLAB基本的使用(語法要精通 函數什麼的有現成手冊可以查)。最好學下simulink。

4.擁有快速學習能力

經驗:

1.找一個carry型的建模!一定要carry型的智商(學習能力,創新能力)!

2.大概分工是建模程序論文(後勤)。但分工不能太明確。

3.正常情況下很可能找不到carry。就以自己為中心,讓他們做輔助工作(讓建模查相關資料閱讀完給你,寫論文的全程參與(因為你最後一夜寫論文很可能頭暈,男生體力可能會好些,我是不行)。一步一步的實現。

4.猜出題的想要你做什麼,這個會極大的影響評分。

以上,祝你獲獎。


參賽的是學生,幹嘛給自己定位程序員……

要想有好成績,一個合適的團隊是必須的,最好的情況當然是大家都是啥都能做的……不然你做了一堆,寫作的寫不到點子上也是白搭。

大部分校賽沒啥水平……能做完整的都不多,可以利用這個機會物色幾個靠譜的隊友(前提是自己也有實力)

數學建模沒數學那還搞啥……說到編程基本就是拿來主義,稍微複雜一點的東西都有現成的,除非你用的東西略偏。反倒是數學的思維很重要,基本都是運籌學、概率論、數理統計、數值分析、最優化等知識的應用,死讀書的基本都要掛。

套路也是有的……也有人搞清題意套方法就穩贏的,本來大家的水平就那樣嘛,做的看起來合情合理就不錯了


看你選題,一般幾個題目裡面肯定有數學部分多一點少一點的,建模用到的數學主要是概率,幾何,微積分這些做一些預處理,能得出一個優美的式子和看起來很牛逼的推到過程當然是很好滴。

當年一個油罐車的題目為例,需要計算買在地下的油罐車的油量,因為油罐車的扁膠囊體形狀和一定傾斜,最後我們組得出了幾個不同情況下的由簡到繁的公式。

最後把你的公式帶入數據跑一遍(寫程序跑,不要手算,多導點數據),再帶著數據優化一下模型。

然後我們就拿了個獎。

這個案例就是以微積分算體積偏重的題目

還有一年遇到個犯罪逃逸的題目,那就幾乎是用程序在模擬了(可能是因為當時還沒有學圖論吧)

然後又拿了個獎。

最後一定要選個好導師,善於利用時間,輪流休息,祝你好運早日拿到獎金。


多元微積分,矩陣運算搞溜,你就可以開始談建模。

群環域近世代數那塊,離散數學,numerical optimization吃透,你可以發頂級會議文章,比如icml, kdd, nips。我覺得可以小成。

都搞明白,然後勤讀文獻,從本質上了解應用數學,機器學習的各種模型,證各種bounds,極限,全劇最優,然後把問題抽象出來,自己搞個定理,前面加幾個引理,讓別人看不出錯誤,也一眼看不明白的證一證。你就可以學有專名。

再跟著一派宗師讀個博士薄厚啥的,勤掛宗師名號,勤灌頂級會議,就可以開宗立派了。

整個過程需要小10年,如果你天分夠,天分不夠20年,我估計著也就成了。

這期間你會無師自通各種計算機語言,畢竟你啥也不懂無法建模,而且這玩意兒比數學容易多了。啥java python c++七七八八的,你老了都自動會,不會就是還不老。

Matlab 佔一個快糙猛,本身效率不高,但是學術界玩玩兒遊戲大概也夠了。

其實最重要是你英語好,哈哈,如果你想吹到國際上去,英語好,最重要。嗯。


程序員需要寫程序跑程序(廢話)

就個人感覺而言:

1、程序員要能夠理解建立出來的數學模型,能夠將數學模型轉化為程序

2、程序員在必要的時候能化簡模型,做好從數學模型到演算法模型的改寫

3、也意味著程序員在必要時能判斷出一些其實不需要通過程序實現的東西,理解程序只是工具,通過其他方法實現更好。

4、所以有時程序員多會一些工具會很有用,比如有時Excel就能實現的一些功能。

5、程序員的思路能夠跟上數學建模的思路,意思是說,即便模型還沒有完全建好,也能夠做一些程序的工作,模型與程序盡量同步進行,節省整體時間。

6、一個優秀程序員必備的素質之一,就是能夠對程序的速度和精度做出正確的判斷和抉擇,是花時間優化代碼讓程序更快,有更多機會多跑幾次,還是決定乾等幾個小時,相信這次能跑出結果。當然,如果你家程序員是壕,不缺電腦,4台主機6個屏幕,就當我沒說。

最後,和匿名答主一樣,當年我也是全場carry,隊友輔助。一人單挑4人,個中辛苦,如今感到當時年輕氣盛,2次MCM Honerable現在在知乎都是渣渣啊。現在覺得,真要出成績,別說豬隊友了,輔助隊友也是不夠的。畢竟是競賽,只有拿下了全明星陣容,你才敢說「這場比賽我要贏。」


對於「校賽」,不知道說的是研究生數學建模,還是大學生數學建模(CUMCM)。由於題主沒有說明,那應該是大學生數學建模,畢竟更高層次的話,題主就會自覺說明了~~~~吐槽一下,本科生就管自己叫「程序員」,真看得起自己~~~~

一般MCM中用Matlab編程。偶爾不涉及需要繪製複雜數據圖形的題可以用其它純編程性語言(C/C++/python等)只求解不用程序畫圖,而如果涉及需要專業畫圖(一般是空間地理)的用GIS最好。當然如果想不用任何編程,直接用SPSS(SAS、lingo等)等之類的題很少,而且很可能最後結果也就算個成功參賽~~~~至於為什麼用Matlab呢,主要是兩個原因的不可代替性:1.函數功能強大,直接矩陣運算,便於實現MCM涉及的較複雜演算法:其實就是省約很多單純數據結構的操作;2.畫圖及結果的可視化導出,雖然Matlab畫圖能力不是很強(導出很醜,還不如截屏),但是能很方便地畫各種樣子,這就比很多單純計算或編程的軟體強太多(什麼,用C++畫圖?累死,何況三維、渲染、旋轉~~~~~~~~)

因為MCM的三大塊(模型的選擇套用、程序求解、論文表述清晰)的表現形式是最終的論文,代碼作為附件僅供參考(是否數據真實即是否偽造結果作弊),所謂論文格式是關鍵的前提是在結果基本正確、模型基本符合的條件下的。從這個角度可以認為,是編程人員決定MCM得獎上限的。雖然貌似一般也得不到上限(這裡不光是指MCM,而是指一般事情)~~~~~~~

-----------------------------------

(有事出去了,下次補坑)

-----------------------------------

沒心情寫了,數學水平就是:能看懂並能理解演算法,知道與其他兩個人討論的內容應不涉及程序實現,而是具體參數與大致流程。

寫作水平要求:能寫明演算法與結果,對自己實現的演算法,能詳細指出參數意思、優劣與對效果結果的分析。

-----------------------------------

例子:作為編程人員,應該直接能看懂 K均值分類演算法、貝葉斯演算法、Fisher判別法、主成分分析以及 SVM、模擬退火、神經網路、蟻群演算法的演算法原理。其實都是矩陣變換


大大小小的數模比賽做過好多,最好成績是美賽F,簡單說幾句。

樓上有位答主提到分工沒有必要太清晰,表示非常認同,除了寫作翻譯這部分工作可以獨立出去,數學建模的其他任務大家最好都或多或少了解,建模者和編程者儘可能有最大交集

個人認為,許多數學模型,無論對相關的數學理論多麼熟悉,不落實到代碼層面,都不能夠說掌握。並且,很多模型本身就和代碼有著密切的關係。比方說遺傳演算法,理論層面簡單的說就是一種搜索演算法,通過不斷地迭代「種群」不斷尋找更優的解;人工神經網路,簡單講就是通過把輸入向量通過一層層的線性和非線性變化得到輸出向量,並且有人研究了如何進行網路的訓練工作,可以將其用於擬合|預測|分類等問題;元胞自動機,通過把問題離散化,制定系統狀態間的轉化規則,來模擬現實中的問題。這些理論給人的感覺總是虛無縹緲,但是當你真正寫完一個不太複雜的遺傳演算法,當你用這個理論解決問題後,你會覺得:哦,原來就是這麼一回事啊。當遇到類似的問題時,你可能就很自然的想到可以用到這理論。

其實每次聽到有的隊伍說誰負責模型誰負責編程,都覺得這是很不切實際的想法。


做隊友不能做,和不願意做的一切事情,另外,男生不要和矯情的女生一起組隊!選隊友一定要要慎重。


如何製造看上去不那麼假的數據


推薦閱讀:

數學建模最重要的是思想方法么?
數學建模是如何反作弊的?
如何評價2017年美賽B題?
如何評論2015年高教杯數學建模A題?

TAG:數學 | MATLAB | 數學建模 | 計算機科學 |