在數模競賽中負責編程的同學需要學習哪些知識?

本人打算參加數模競賽,但是沒有什麼經驗,想知道如果負責編程的話,需要怎樣學習?需要掌握哪些知識和技能?具體應該怎樣做呢?


先理一理每個參賽隊需要掌握的計算機技能,至於哪些由「負責編程的同學」承擔,這屬於隊內分工問題,顯然每個隊情況都不一樣,協調好就可以了。之前在 其他回答 中提到過這部分內容,限於篇幅,比較簡略。下面按照重要程度稍微詳細地介紹一下。


競賽論文排版(必修)

要求:

  • 數學符號和公式。正確排版數學符號和公式,特別是行內公式要規範。
  • 圖、表。能夠插入圖、表,其編號、標題位置符合規範。
  • 參考文獻。元信息準確,按指定樣式生成參考文獻列表,正文中的引用準確。
  • 編號、交叉索引。目錄、公式、圖、表、參考文獻的編號和交叉索引準確規範。

所用軟體主要是兩大類,以MS Word為代表的所見即所得類編輯軟體,和LaTeX。

  • 功能:兩類軟體理論上都可以用於排版競賽論文,但是工作方式完全不同。
  • 學習成本:很多人認為LaTeX的學習成本遠高於Word,其實不然。相當一部分Word用戶所謂「會用Word」,實際上只會三板斧:輸入文字,調整字體,調整字型大小。完全沒有樣式表,自動編號,交叉索引的概念,文章的目錄都無法自動生成,一切都要靠蠻力。如果這樣也算是「會用」,那LaTeX更容易。我個人的觀點,就競賽論文排版而言,Word和LaTeX的學習成本相當,或許LaTeX還簡單些。
  • 效率:其他事情不好說,但在競賽論文排版方面,Word的「能用」和LaTeX的「好用」完全沒有可比性。
  • 無論哪種軟體,會用的標準都是一樣的,那就是要能按上面的要求正確的排版競賽論文。賽前一定要實際排版過2到3篇以上的論文,不能相當然的認為自己會用。

我個人的建議:

  • 理工科的同學,特別是數學、物理、計算機等專業,花一點時間學習LaTeX是非常值得的投資。
  • 但是,如果Word類的軟體已經用的很熟,賽前準備時間很緊張,就不需要專門再學LaTeX。在符合競賽論文要求的前提下,決定論文獎項的最主要因素是論文的內容,而不是所用的軟體。

常用圖表繪製(必修)

要求:

  • 掌握表格的排版方法,格式要求和習慣
  • 了解常用圖形的特點和適用場合,掌握其繪製方法,以及排版要求

競賽論文少不了圖和表,合適的圖、表可以向讀者簡潔、準確傳達信息。

Word製表功能較直觀,一般操作不會有問題,關鍵是要設計表格的內容。而LaTeX排版常見樣式的表格很容易,但是排版非標準複雜表格的方式不直觀,容易出錯。或者在賽前多練習,或者放棄使用特別複雜的表格。

競賽論文中經常需要繪製的圖形大體可以分為三類。

  • 數據圖。直方圖、散點圖、折線圖、函數圖像等。常見的高級程序語言都能繪製這些圖形。或者是將數據導出後利用專門的繪圖軟體繪製。Excel畫出來的圖形也不錯。
  • 流程圖。一般用於描述演算法流程,系統框架等。相關軟體很多,賽前選一個,簡單練習即可,比如 draw.io.
  • 示意圖,包括各種受力分析圖、內部結構圖等。這一類圖形相對用的少些,也沒有特別合適的軟體推薦。LaTeX的 TikZ/PGF 包完全可以勝任,但是對多數人來說過於繁瑣,學習成本較高。 GeoGebra 是一個免費的幾何作圖軟體,繪製幾何圖形時可以考慮。

文獻檢索、資料收集(必修)

要求:

  • 掌握搜索引擎的使用方法(搜索語法,如filetype, site, 雙引號等)
  • 不要使用百度
  • 掌握論文全文資料庫的訪問許可權和使用方法
  • 其他數據源(聯合國資料庫,世界銀行資料庫等)

建議:

  • 搜索引擎的用法請查閱 Google Search Tips Tricks
  • 無論題目是中文還是英文,都要重視查閱英文的文獻。
  • 建議學習至少一種文獻管理軟體,以提高效率,比如 Mendeley.

編程能力(必修)

以上幾個方面主要是與寫作有關,而編程能力是計算能力的核心。最關鍵的是設計演算法的能力以及根據演算法寫代碼的能力。

要求:

  • 至少能夠熟練使用一種高級語言。
  • 熟悉常見的數據結構和演算法
  • 純文本文件讀取、處理
  • 常見的數值計算方法
  • Lingo等求解優化問題的專業軟體(選修)
  • 常用的圖論演算法(選修)
  • 計算機模擬(選修)
  • 數字圖像(選修。基本概念,讀取,簡單加工)

建議:

  • 目前主流的高級語言功能都比較完整,只要熟練,任何一種都可以。如果一定要推薦一種,可以考慮Python。
  • 無論用哪種語言,純文本文件總是可以讀寫的。可以利用純文本文件作為程序輸入、輸出數據的中介。
  • 插值、擬合、解方程(組)這些常見的數值計算任務,盡量用現成的軟體包或者函數。
  • 優化問題經常出現,如果已經掌握Matlab、Python等通用語言,不見得一定要學Lingo。但是對於大規模的問題,Lingo的性能最好。
  • 與圖、網路有關的賽題比較多,賽前可以熟悉一下常用的演算法。但是不一定要逐個編程實現,關鍵是將演算法轉化為代碼的能力。
  • 美國賽的題目經常需要用到計算機模擬。一般沒有現成的軟體能夠直接用,需要自己編程。賽前準備,有備無患。
  • 全國賽中有一些題目與圖像處理有關,但是總量不多,美國賽中則非常少。了解一些數字圖像處理的基本概念,在選題的時候會有更大的靈活性。

選修項目

  • 純文本文件編輯器。如果只會用notepad,效率就太低了。相關的軟體非常多,可以參考維基百科 文件編輯器比較 這個頁面。最主要的功能包括代碼高亮、文本比較、正則表達式搜索、編碼轉換、 換行轉換、自動縮進、自動補齊、代碼摺疊、列塊等。
  • 正則表達式。清理數據的時候特別有用。
  • 版本控制軟體。程序備份、多人合作。

如何學、如何做

上面每一個必修的項目,都要投入一定的時間才能達到得心應手的程度。沒有特別好的捷徑。內容比較多,比較泛,相關的資料、教材也不集中,早點動手。隊員之間也可以合理分工,提高效率。

賽前可以自己評估一下。自評的方法非常簡單,選同一道題目的多篇優秀論文,看看能不能搜索到合適的文獻資料,能不能找到數據,別人論文中比較好的圖,能不能畫出來,別人用的方法,自己會不會編程,等等。

最後提醒參加過ACM的同學,數模競賽對計算機技能的要求與ACM是不一樣的,雖然可能確實是編程高手,但不要想當然認為一定可以應對數模競賽的編程要求。賽前要對照一下以上的清單,以參賽隊為單位,查漏補缺。


三次數模國獎路過,曾經單挑過兩次國賽(第三次有一個負責編程的同學給予我很大的幫助)。稍微談談編程這一塊的經驗吧,現在臨近美賽,時間也不多了。最高票回答適合長時間準備(至少有一個從校內賽到國賽的周期,我就談談只剩下一個月不到應該如何準備編程這一塊工作吧)。
編程的同學,主要是把建模同學的思想給生產出結果,也就是輸出一定的東西,可以是圖,可以是表可以是數據等等。當你隨便打開一本數模書(比如司守奎老師寫的《數學建模演算法與應用》這本書),你會被裡面的Matlab,lingo等代碼嚇住,尤其是以前不怎麼編程的同學來說更為如此。所以數模三個部分,很多同學會覺得編程非常難以上手。
其實,負責編程的同學,並不是說比誰代碼寫得長,誰代碼寫得好,而是應該為建模的同學提供一個結果(只從數模拿獎(功利的角度出發)無論結果的好壞,甚至是否有結果,在比賽即將結束的時刻,都應該給建模隊友一個所得過去的「答案」),所以可以在做一些數模問題的時候,用一些較為「傻瓜」的軟體,比如SPSS,這個軟體可以解決統計學中的很多問題,比如2012年的國賽葡萄酒評價問題,這道題就是使用SPSS的代表。所以說,以其說是會編程,不如說是應該會使用相關軟體,讓所建模型輸出一個不錯的結果。還有作圖軟體Origin,在進行一些簡單的作圖時候,可以使用Origin而沒有必要去使用Matlab進行畫圖,一般情況下,在問題不太複雜的時候,是沒有必要使用Matlab的。還有一款軟體叫做Visio,這款軟體是畫流程圖的利器,比如說寫完一段程序附上程序框圖,或者用系統動力學解決一個問題時畫的系統流圖,得到的效果都是非常棒的(PS:初次學習建模的同學,無論如何一定要在Matlab上面下一點功夫,即使沒有辦法掌握,也需要知道如何修改別人的優秀程序,為我所用)
如果真的想短期學會一個真正需要編程的語言,還是選Matlab吧,雖然在短時間之類,你是無法把這門語言學到精通,但是只要知道Matlab的語法規律,以及一些基本功能,一些基本的工具箱就足夠了,這裡推薦兩本書,一本是《Matlab完全自學一本通》這本書上面基本上包含了可以用得到的功能,至少是基礎功能。在數模上面,可以司守奎老師寫的《數學建模演算法與應用》這本書,一般常用模型的代碼都給出來了。還有一個最關鍵的是,比賽前,多看看別人寫的優秀論文。不管是國賽還是美賽,都有著優秀論文集,看看別人寫的論文還有別人的代碼,爭取找到一些靈感。
在比賽的過程中,如果什麼地方卡住了,一定不要蒙著頭想,應該即使去相關論壇查找一些使用技巧,當然Matlab自身的幫助文檔也是挺不錯的。
多說一句話,LaTeX是寫作排版用的,雖然也是類似於編程語言,不建議編程的人去學習,應該去鼓勵寫作的同學學習LaTeX,編程的同學應該和建模的同學好好合作,合力把比賽題目拿下。
看到數學建模老司機(國一優秀論文獲得者,深圳杯獲得者,SAS大賽冠軍)的回答了,SPSS在這幾年的國賽的賽題(2014,2015,2016)當中確實比較難使用了,問題基本上都是純物理類問題(2014航天,2015球面天文學,2016受力分析)而且SPSS還有一個非常強大的競爭對手SAS的存在。至少是國賽A題,一般都是需要自己踏踏實實建模,最後使用Matlab實現。但是,A題由於過於考察建模的實力,因此一些非理工科的學生往往望而怯步。
R,Python以及SAS作為數據分析時代的新興語言,大家可以有空的時候學一學。由於現在有一個SAS數據分析大賽(由滙豐銀行贊助,SAS公司主辦)搞的還不錯,大家可以學一學SAS然後去這個比賽中練一練手。參加過蠻多的比賽,還是發現SAS舉辦的這個數據分析競賽(尤其是決賽)給我的參賽體驗非常地好。
更新一下,看了下面國一大佬說的有關程序的事項,其實,如果單純從拿獎的角度來說,某些問題,尤其是國賽B題, 美賽E、F題對於程序要求不高的情況下,可以適當地使用現有的模型理論對具體問題進行分析。但是,從2014年開始每一年國賽A題基本上都很難找到可以直接套用的模型(雖然2016年的系泊系統在知網上面有很多現成的研究結果,但是往往不是太複雜,就是和題目分析的背景有點不太一樣),這也是我前面說為什麼對於沒有經歷過理工科訓練的學生很容易望而怯步的原因。所以,我覺得如果你想做好A題,在近些年A題越來越需要自己建模,自己使用一定的軟體實現的大環境下,建議有一定改編現有程序的能力。
-----------------------------分----------------------隔---------------------線--------------------------------------
看到留言有提問,現在考試基本上快考完了,我也就來回答一下吧。
首先第一個問題是:美賽E、F題應該怎麼做?數模三天(美賽是四天時間)需要做一些什麼?
首先我來回答一下第一個問題,美賽E、F題應該怎麼去做。由於美賽E、F題是今年2016年新增加的題目,因此不論對於誰來說都是第一次涉及這兩類問題,依據美賽官方COMAP的說法,美賽E題的主題一般是有關環境科學的問題,美賽F題有關政策的問題。從統計的結果來看E題是最受中國人歡迎的ICM的題目,而F題較為冷門(具體的統計數據在我另外一個回答的問題中:數學建模競賽在國外(如美國)的真實影響力如何? - 張浩馳的回答 - 知乎 。首先,還是把E、F題的問題的翻譯粘貼過來吧(雖然我知道知乎洋文好的人多得很吶)。
E題的翻譯:

我們的地球會受渴嗎?

  • 世界上的水會用完殆盡嗎?根據聯合國,1.6億人民(世界人民的四分之一)正在經歷水荒。在過去一個世紀,用水量的增長速度是人口增長速度的兩倍。工業、農業、居民的日常都需要水的支持。目前有兩種缺水的原因:物理性缺水和經濟型缺水。物理性缺水指的是該地區沒有充足的水來滿足用水需求。經濟型缺水指的是,該地區的水並未明顯缺乏但是缺乏合理的管理和基礎設施的建設限制了乾淨水的獲取。許多科學家說缺水問題在氣候變化和人口增加的條件下更加趨向惡化。用水一兩杯與人口的速度增長這個事實提示我們還存在另外一個缺水的原因:它是否加快了工業消耗的速度、個人消耗的速度或者是加速了污染減少乾淨水源?
  • 對所有人供給乾淨水源是否是可能的?乾淨水的供給必須把水的(物理性)可獲取考慮在內(例如,自然水源、技術進步諸如淡化工廠、雨水收集技術)。理解水的供給是一個天然的跨學科問題。你不僅需要理解環境對水供給的限制,還要理解社會因素是如何影響乾淨水源的分布和獲取的。比方說,差的衛生條件會限制水的供給,人口的增長會給地區水供給帶來壓力。當你在分析一個地區的缺水問題時,以下的問題是你必須考慮的。歷史上人們是如何惡化或者緩解了這個問題?地理的、地質的、生態的原因是怎麼影響水供給的?我們如何準確的預測未來水的可獲取性?如何評估新水源或者替代水源的潛力(比如海水淡化技術、雨水收集技術或者未發現的地下水)?有什麼人口統計學的和健康與之相關的問題?

問題說明:

  1. 建立一個能夠提供一個尺度來衡量一個地區提供乾淨水來滿足地區需求的能力。在你建模的過程中,你可能需要考慮影響供需的動態因素。
  2. 使用聯合國的缺水分布地圖。選取一個水相對或者嚴重超負荷的國家或者地區。解釋為何、如何該地區的水陷入了缺乏的境地。確認一定要通過處理物理型和經濟型缺水來解釋社會和環境的雙重驅動因素。
  3. 在你任務2中選擇的地區中,使用你任務1
    中的模型來預測該地區15年後水供給的情況是怎麼樣的?進而,15年後的這種情況又是如何影響該地區居民的生活的?確定要包含環境驅動的影響在模型構成中。
  4. 在你選擇的地區中,設計一個考慮了所有缺水驅動因素的調節方案。任何的干預措施都會不可避免的影響到周圍的環境和整個的生態系統。討論這些影響,以及這個方案的整體優缺點。最後,你的方案是如何緩解這個問題的?
  5. 使用你在任務4中設計的調節方案和模型來預測未來水的可獲取性。你選擇的地區可以在缺水問題上變得輕鬆一些嗎?水問題會變成未來的關鍵議題嗎?如果這樣,水缺乏什麼時候會出現?
  6. 寫一個20頁的報告(summary
    sheet不包括在內)來解釋你的模型:你選擇地區的在沒有調節情況下的水缺乏狀況、你的調節措施、你的調節措施對該地區及周邊地區水供給的效果。一定要明確模型的優缺點。ICM會用你的模型來幫助別人。(人道主義)

下面是F題的翻譯:

  1. 對難民危機的衡量。確定特定的因素,可能有助於或約束難民的安全、 高效流動。這裡有以下屬性特徵:難民自身,遷徙路線,交通運輸,國家的能力(包括入口點數目和可提供的資源)。第一項任務需要制定一系列措施和參數來證明為什麼分析危機時需要考慮這些條件。
  2. 難民的流動。建立一個最優的難民遷徙模型,模型要包括6條路線上預測的流動量,考慮以下幾個方面:交通路線/可達性、 路線安全性和國家的資源能力。您可以包括不同航線、 不同入口點,單個或多個入口點,甚至不同國家。使用您在任務 1 建立的度量模型確定難民數量,以及滿足難民遷徙所必要的入口點數和比率。務必能證明任何加入遷徙的新要素,同時解釋這些動態變數的敏感性。
  3. 危機的動態。難民條件可能隨時變化。難民在尋求生活必需品同時他們家庭處在不斷變化的政治文化背景中。此外,目的國家的住所接待量、保護、食物等是動態變化並以最快速度增至最大,產生一系列影響導致修改遷徙模型的參數。確定隨時間變化的環境因素;同時說明有多大容量能被融入模型來解釋這些動態變數。如何根據這些動態變化因素預先放置哪些物資?優先放置哪些物資以及如何在模型中加入物資的實用性和流通性?考慮政府和非政府機構各自的任務和資源。非政府機構的行動如何改變你的模型和策略?同時考慮難民的其他可能目的地的相關內容,如加拿大、 中國、 和美國。您的模型你的模型在這些地區能否也起作用?
  4. 難民模型的政策。基於上述模型發表報告,提出一系列政策將有助於創造最優條件確保最優遷徙模型。你需要安排好難民和當地居民的健康安全等事項。您可以儘可能多的囊括你認為適合推動政策制定的參數和因素,同時牢記受影響國家的法律和文化的約束。還要考慮非政府機構的任務和行動。
  5. 外源性事件。除了內源性的系統動力學,外源性事件也是極有可能發生,改變不穩定的環境中的環境參數,例如,在法國巴黎的重大恐怖襲擊與敘利亞避難危機聯繫在一起,導致之前尊重難民的許多歐洲國家在態度和政策方面發生實質性的轉變。事件也引起了當地民眾的關注。例如,布魯塞爾,鎖定的巴黎襲擊在捕捉的恐怖分子藏在比利時。
  • a) 在一件重要的外源性事件中模型的哪些參數會發生變化或者完全性變化
  • b) 鄰國的難民事件會造成哪些連鎖反應?
  • c) 你建議的移民政策將如何適應種種此類事件?
  • 可擴展性。使用您的模型,將危機擴大到更大的規模 —— 10 倍。模型中有不可擴展到人口模型的功能嗎?當這場危機的範圍大大增加,你的模型中哪些參數發生變化或者變成無關變數? 如何增加解決難民安置所需的時間?如果難民融合措施的實施顯著拖延,為了維持難民和當地居民的安全與健康會出現哪些新的問題? 這些新的想法起作用的時間閾值是在什麼時候?例如,為了管控好疾病、生育、教育等問題需要哪些政策做到位?

上面兩大段是E和F的翻譯,仔細看起來,閱讀量非常大,這也是ICM問題的特色。與國賽相比,MCM/ICM這兩個方向的比賽中的ICM更加接近國賽風格。細心的小夥伴會發現,ICM的題量比國賽題量大很多,至少有5問需要解答,而且由於原版是英文版題目,我想應該有一定數量的小夥伴在拿到題目之後就會開始抓狂。不過,不需要太緊張,大概在1~2個小時之後,就有相應的數學建模論壇(比如數學中國),就會陸陸續地發出A~F題的翻譯。但是,中文翻譯題目在理解上還是會與英文原版題目翻譯存在著一定的差距,因此在看完中文翻譯之後,了解大體意思之後,還是應該回歸英文原版問題。
下面開始具體分析E題:

  • E題是有關水資源戰略的問題,分析題目的意思,可以簡單地認為應該這麼做:1、建立水資源供需模型。2、根據水資源分布地區,選擇一個缺水的地區,通過物理以及經濟因素解釋。3、使用建立的模型預測該地區15年之後的水資源情況,並且考慮在這樣的情況下居民生活收到的影響以及加入環境因素考量。4.設置解決方案,並且考慮方案的優缺點。5.假設使用了方案後,缺水現象是否會得到一定地改善?6.寫出一篇20頁的報告出來(注意,美賽ICM的論文頁數是不可以超過20頁的)。
  • 建立水資源供需預測模型,這個問題,其實並不是特別新鮮的問題,在建立水資源供需預測模型時,可以考慮使用馬爾科夫鏈預測模型,可以參考一篇題目名為:《黑河流域水資源動態變化及其趨勢的灰色Markov鏈預測》這篇文章,在這篇文章的基礎之上結合自己的需求進行分析即可建立出模型。降水量以及水資源消耗(工業用水、生活用水、水質污染等因素需要考慮進去),還可以考慮一些比如說豐水年以及枯水年的年份。第一問由於只需要建立一個模型,因此說明清楚理由,然後建立模型(注意模型中用到的數學符號,一定要在符號說明當中提出。而且,為了說明清楚,可以在建立完模型之後,畫出一個類似於程序框圖的框圖出來,方便評委老師理解你的建模思路)。由於美賽比較注重原創性,雖然有很多類似這篇文章的參考資料可以參考,建立自己思考,能否建立出於參考模型稍許不同的模型出來?(2016.12.31 3:02 AM)

之前去浙江大學有一些事情,因此沒有對文章進行更新,抱歉啦大家。

    最近在讀山東大學劉保東老師寫的書:《數學建模基礎教程》[1],我覺得這本書寫得很好,尤其是第一章書:概論和第二章書:Matlab快速入門。Matlab快速入門者一節尤其是對於二維以及三維圖像的畫法,高度概括總結,這是其他數模教材沒有注意的地方。下面言歸正傳,由於正好講解到美賽E題建模的地方,我不妨把劉保東老師對於建模的一般步驟給寫出來:
  1. 問題的提出與分析
  2. 模型假設
  3. 建立數學模型
  4. 模型參數的估計與求解
  5. 可靠性分析與假設檢驗
  6. 模型應用

基本上上述第一點的問題,從競賽的角度來說,和我們沒有啥關係,基本上問題的提出都是由於競賽組委會提出的。所以賽前只需要祈禱今年的題目盡量都符合自己的胃口,或者背景知識在自己所學的專業範圍之內(由於國賽有A、B兩道題,而美賽有A、B、C、D、E、F六道題,因此美賽比國賽容易碰到自己上手的問題,國賽則題型比較固定,A題一般是理工科問題,B題一般是社會性的問題)就好。
第二點,模型的假設,這個工作其實不太好做,最好先閱讀一些前人的文獻,看看別人建立的模型大概了解一下一個模型應該保留什麼應該捨棄什麼,還必須結合自身的水平對模型進行假設,比如今年的國賽A題,你對系泊系統錨鏈的受力分析假設完全要結合自己物理的實際水平進行建模,高中水平(文科生或者經管生),普通物理水平(大多數理工科大學生的水平),理論物理水平(物理專業學生或者理科對物理學要求較高的學生)或者工程力學的水平(最適合做這道題,一般是機械類土木類專業的學生)。所以,在模型假設的時候一定要量力而行,不要因為看了幾篇高大上的文章就以為自己掌握了別人至少十幾年的專業素養,如果這樣就太NAIVE了。只有做到自己認為恰到好處的模型假設(就是自己和自己的隊友可以把基於假設的模型比較完整地建出來,並且給出一定的結果)那麼只要結果有理有據,一般都是可以拿獎的。
第三點,建立數學模型。從功利的角度(競賽拿獎的角度出發),自己在國賽三天中或者美賽四天中完全獨立地建立出一個不錯的模型(也就是說純原創模型),對於大多數選手來說(包括我自己在內, @數學建模老司機 這種級別的大神除外,對於老司機來說,建模是他最為看重的一個項目了)是一件較為複雜的事情,也就是說,基本上是不可能做到的。所以,我們需要有著快速學習的能力,也就是說,我們需要去快速閱讀其他人做的工作(這個問題其實在前面說過了),但是千萬不要逞能,讀一些研究的深度遠遠超過自己的認知水平的文章(個人覺得絕大多數的障礙都是自己的數學水平不夠高或者很多數學手段沒有學造成的結果)。大概自己看得懂一二的文章,可以思考一下別人的方法,對這一個領域的研究手段以及主要研究的問題有一個大致了解的水平(在四天或者三天中對這個領域達到掌握的水平基本上是不可能的),這樣就可以使用相類似的辦法,構建出一個貼合比賽問題的模型出來,進而使用。
第四點,這一點是較為重要的一點,通俗地說就是模型的求解。也就是說,需要把題目中的一些問題給出具體的答案,如果是評價類問題,就要給出好壞,如果是要得出一條曲線去預測東西,那麼就要畫出一條曲線,並且說明結合這個曲線以及曲線上面的一些信息,如何預測出什麼什麼樣的結果(記住預測的東西一定要結合實際情況,比如社會因素或者環境因素)。還有一些求解具體參數的問題(構建微分方程或者差分方程進行求解的問題),還有優化類問題,比如線性規劃或者最優線路的問題。比賽中如果只建立了模型,而沒有給出具體的結果,是比賽的大忌(國賽比較嚴重,美賽到還是有一定的餘地),所以,在比賽的時候,請一定交代程序員(或者你自己就是程序員),一定要出一個結果,不管這個結果的好壞。當然,如果距離比賽結束還有很多充裕的時間,那麼請儘可能地提升自己的結果質量,這個問題和第五點就有一定的關係了。以上四點是數學建模競賽最最基礎的四點,也就是說,論文上面只有包含這四點,才是一篇較為完整的論文(能做好這四點,國賽有希望國二,美賽也有希望拿到M獎(至於以上。。。我就不知道了))。
第五點,這一點是屬於錦上添花的一點,如果你在寫完前四條並且發現時間還非常充裕(至少半天時間),那麼如果你想衝擊國一或者美賽M獎以及以上的獎項,那麼建議你還是做一下這個工作,最好看看自己的結果是否存在比較大的誤差,如果有對照數據,則可以使用對照數據拿來檢驗下模型的合理性(如果發現不太合理,則根據時間的需要決定是否需要更改原有模型,如果有時間則可以對現有模型進行一定的優化,如果沒有時間,則可以把這個寫入模型的評價中去,還是建議多寫模型的優點,少寫一些模型的缺點,如果參賽隊員寫太多缺點,自己否定自己,那麼這樣的模型還有什麼價值呢?)。另外可以對模型做一個靈敏度分析,就是看結果在一定微小的擾動下是否會出現結果出現很大的波動,一個較好的模型應該是有著較好的穩定性或者說是可靠性的,比如可以做假設檢驗,結果擬合優度檢驗等等方案進行分析。2015年美賽A題O獎中的上了UMAP雜誌的文章就是做了模型靈敏度的分析。
第六點,這一點如果從參賽的角度來說,就沒有多少必要考慮了,當然,可以將有關模型的應用寫入模型的評價中(一般模型評價分為三點:模型的優點,模型的不足,模型的推廣,所以應用部分一般寫入推廣中去)。當然,如果實在對這個賽題十分感興趣,是可以把模型真正應用起來,如果模型做得足夠出色,至少可以拿去正規期刊發表論文,參加一些其他競賽(比如節能減排、挑戰杯等),或者實現真正的經濟效益。
由於讀了劉老師的書,所以稍微寫了一點有關建模的基本步驟,這也算是給E題開了一個頭(貌似今晚完全沒有談到E題。。。。),基本上這也算是給數學建模當中的建模部分寫了一個總結,先這樣吧。E題的坑有空繼續寫(2017.1.12 2:29AM)

繼續更新吧,已經有大概半個月沒有更新這個貼子了。雖然美賽已經比完了,但是我還是繼續更新下去吧。第一問在之前基本上都說了,使用馬爾可夫鏈進行預測。問題二就是需要在問題一的基礎之上定一些比較具體的指標出來,這個主要還是需要根據自身的能力來具體定一些為何會存在缺水問題的指標出來。可以選擇的指標主要有降雨量,河流流量,生活用水,工業用水等作為指標來衡量。對了,第二問需要選擇一個地方來進行分析,後面幾問也基本上選擇這個區域來進行分析當地的水資源情況。所以,我建議大家,以後遇到這類問題的時候,選擇盡量好找數據的區域進行分析。比如今年2017年A題有關於非洲修建水壩的問題,由於尚比亞是一個比較偏遠落後的國家,因此不太方便找到一些數據,所以建模比較容易蒙蔽。貌似也就Google地球是一個不錯的工具,至少可以分析一下大壩附近的海平面高度。因此,選擇比較發達國家的缺水地區是一件比較正確的事情,比如美國。當然,選擇自己國家也是不錯的選擇,但是看聯合國缺水地圖上,中國並不是一個嚴重缺水的國家「難道是我當時分析有誤么?中國主要缺水的兩個區域是西北以及膠東半島,我自己選擇了西北的陝西省作為分析的區域」。第三問就是在第一問,第二問的的基礎之上繼續使用第一問的模型進行預測,編寫相應的馬爾可夫預測的Matlab代碼,這個在司老師的那本《數學建模演算法與應用》中就有,只需要稍微修改一下代碼就可以放進題目來使用。建議在把數值預測出來之後使用Matlab畫出水資源供需壓力曲線出來,並且做一下擬合曲線,這樣的效果會好很多。因為,只有直觀的圖表才能讓評委老師迅速挖掘出結果,然後給予你高分。對Matlab生成的圖表做一定的解釋,這樣一篇文章就寫了七七八八了。下面就是第四問了,第四問畫風一變,和三問圍繞的預測問題不一樣,這一問開始基本上就是優化調度問題了。第四第五問主要的問題就是能否找到一個解決問題的辦法,我建議的大家可以參考2013年MCM運水的問題,我覺得參考一些O獎論文的辦法應該就問題不大了,而且,貌似我記得題目本身也說了可以參考2013年美賽的題目。今年2017年也是這樣類似的問題BCD長得差不多,其中B題還是2005年MCM題目的加強版本。所以,我都有點覺得COMAP與其出這麼多的題目,不如與國賽一樣,出幾道比較好的問題。今年的題目水準甚至低於去年很多。EF題基本上都是評價類問題,非常容易變成吹水的問題,或者不知所云。

    看到了蠻多小夥伴贊的,挺開心的。

我有空繼續填坑,大家可以把數模相關的問題寫在評論中,我會不定期地把大家的問題寫在回答中。不論是建模的問題、編程的問題、還是寫作的問題,我有空都會耐心解答。

參考文獻:
[1] 劉保東, 宿潔, 陳建良. 數學建模基礎教程[M]. 北京: 高等教育出版社, 2015.


美賽三次M,國賽三次一等,研究生賽兩次一等路過,前OI、ACM選手兼數模編程人員,活躍在2007年~2011年之間。

以美賽為例,通常我們都會選擇在A、B題里選,盡量不去碰社科類、環境類,或者數據極難搜集的題目,主要選擇演算法題和模擬題。偏社科啊政策啊之類的沒做過,不擅長,也不了解。所以我們就主攻物理/圖論/運籌學方向的。

題目若是以圖論、模擬模擬、離散數學、運籌學等為主要方向,則編程人員理應主要負責;相反,若是以物理、數值分析、統計分析等為主,則主要體現副手作用,方便計算與驗證。畢竟前者是計算機相關方向的基礎課程,完全有理由比鑽研高階偏微分方程組的隊友更有發言權;而後者,就算你算出來個一二三了,最終也必須有配套的模型解釋,讓數學方向上的隊友來主導更加合理。

然後是基本要求,很簡單的幾個字,責任心與溝通能力。責任心簡單,你是隊伍中的一員,你不是個傻乎乎的計算器,計算中發現的問題、出現的問題都要及時溝通討論,做到一半畫風一轉計算題變演算法題這種事也是常有的,該寫文字說明也得寫,該推證明也得推。溝通能力則是要保證隊友的思路你要理解,你的思路也要能夠說出來讓隊友都理解,確保聽得懂,說得清,寫得出。

編程能力上則可以分成兩種情況討論。

若這道題目你是主導,你需要做的很多,並且很大一部分是不可替代的。一個整體的問題往往不是套用一個演算法就能解決的,拆成若干個部分,每個部分卻大都能套用一套演算法模型,你要有構建整個演算法的能力。你需要熟知你要用到的演算法的特點,時間複雜度(預測可行性)、數據要求(用以提假設),甚至演算法的局限性以及可以擴展的能力,這樣才能夠讓你把文字寫清楚。然後有足夠的代碼能力,能夠把演算法實現出來(就算是找庫也要能找出來),有錯誤能夠及時發現並修正。

這裡吐槽一下,近些年的數模競賽,總有人動不動上遺傳蟻群模擬退火粒子群,求個最短路也上蟻群,求個二分圖匹配也上遺傳,好好的多項式時間的確定性演算法都不用。我就納悶了,難道用這些東西的時候不知道這是個用以求解狀態空間搜索問題的近似演算法?可是這麼多年的比賽題里我也沒見過啥題目只能以狀態空間搜索來做模型還時間複雜度大到必須用近似演算法的。還有估計剛看了幾眼keras,上手就來個DNN的,我倒好奇你文章怎麼在有限的幾十頁紙和四天時間裡能把你DNN生成的類黑盒模型給解釋清楚。這一類就是屬於明顯對演算法一知半解的情況,折騰下去萬一評委看岔了給個獎也就罷了,成績要是不好,千萬別推給跟著你寫文章的隊友。畢竟數學建模是數學建模,模型的解釋性非常重要。

然後是數學、物理主導的情況,人家模型給你了,方程組給你了,接下來就是計算了,善用手頭的工具,能算出來是最重要的。符號計算得能做,解個數值解得能解,人家給你一票常微分方程組,總得能看懂能求解,給你一票偏微分方程組也要能夠至少能找到工具來解個數值解。統計相關的問題,數據能解析一下塞工具里能跑些需要的東西來,也是必須的。甚至在隊友苦算一個複雜方程時,能搭把手上符號計算幫忙算一下也是好的。

最後來說工具問題。講道理編程人員最常用的工具不外乎MATLAB(或者NumPy+SciPy+SymPy+pandas+matplotlib/seaborn這樣的Python工具鏈),最初我還不太用Python的時候有些圖論啊流啊搜索啊相關的程序拿C++寫,算完了也把結果輸出成一個.m文件再用matlab做可視化,到大三起我就傾向於Python了。這個其實並沒有規定說非得用啥,但主要是覆蓋數值計算、符號計算、常見信號處理方法(如fft)、統計和可視化,熟悉啥就用啥都好。如果大學新學編程,得選個工具學,那推薦MATLAB;如果有一定的基礎,推薦Python一套,靈活度更高一些。

至於用lingo解線性規劃啥的大可不必,因為MATLAB和NumPy做得足夠好了。R做統計分析雖然方便,多學一語言的負擔也還是有的,並且同樣的工作也能靠Python/MATLAB來完成。

額外推薦一個COMSOL,做物理模擬,特別是複合場的偏微分方程組求解非常方便。


國一,美賽M路過
作為一個專業課根本不學計算機完全不了解演算法的水利狗,在業餘編程方面,還是有點心得的…畢竟數模比賽里需要的知識,基本得靠自學T T,再加上是苦逼的隊長,沒法打醬油…
回歸正題。
如何學習編程。我主要學matlab,至於評論里其他大神說的lingo,spss之類雖有所了解但實在說不上精通,所以針對matlab來說。個人感覺夠用。
大一時,我對Matlab基本運算功能已有了解,可聽說Matlab還有更多更強大的功能呀演算法呀(流口水。),於是,躊躇滿志的我試著照著Matlab從精通到入門 一點點學習Matlab(書名好像叫這個?)。結果是學完畫三維圖我就徹底歇菜,整個過程枯燥無比…
對於我這個心血來潮,不喜歡無聊事物的人來說,實在堅持不下去。可是,如果不摸清Matlab牛逼的功能,比賽肯定吃虧呀。幸好,後來我偶然發現了這本書:《Matlab在數學建模里的應用》-卓金武。裡面介紹了很多有用的演算法,還有往屆歷年國賽真題,以及一堆有用的代碼。
附鏈接:
http://pan.baidu.com/share/link?shareid=2971634667uk=922813504
我是趁著暑假在家吹空調的時候,看看這本書,理解理解常用演算法思路,然後複製粘貼代碼用Matlab運行一下,看看能不能出圖,偶爾改改參數。前後大概有十幾天看過,然後開學就去比賽了,和另外兩個純工科小夥伴,首戰國一…之後又參加了一次美賽,我們三都覺得當時寫的特水(因為一行關於演算法的代碼都沒敲),可是居然M獎…覺得像是走了狗屎運…

總的來說,我的經驗是:
1.比賽之前,要勤奮要練習!要記得你的電腦裡面,有一個牛逼哄哄的Matlab(此處可以換成VS,SPSS等各種軟體)。練習是最好的老師,如果目前對Matlab還不熟悉,一定多敲代碼,特別是鍛煉畫圖能力,老師們看一篇文章,首先產生視覺衝擊的是你圖好不好,而不是你的演算法牛不牛逼。所以繪圖需要的相關代碼,要敲熟練了。比如可以把以前用C語言敲的題用Matlab再敲一遍,把複雜的計算用Matlab敲一遍,我自己呢,是平時做專業課作業的時候,會時常使用Matlab做迭代計算,畫圖等。這種類似的作業,各個專業都有。比如我是港航專業搬磚的,也有很多題目可以用電腦解決。慢慢的你就會提高。
2.比賽的時候,一定要學會偷懶!比賽時,代碼能不自己敲,千萬不要自己敲(注意我說的是比賽時,平時練習的話當然越多越好啦)。對於大多數模題,用的基本演算法肯定還是現成的,前人敲過的東西你再辛辛苦苦想一遍敲一遍,比賽就三天,浪費時間啊!理解演算法思路,看懂代碼含義,知道在什麼題目中可以用,怎麼修改演算法就可以了。所以時間緊張的話,一定多搜集一些常用演算法代碼。我當時比賽時就用了上面鏈接里的代碼就夠了。
3.得獎的重點在現成的演算法中,怎麼創新,怎麼加入和基礎演算法不尋常的東西。創新是絕對的得分點。我們組當時基本沒參考幾篇文章,基本模型自己建立,參考別人模型的時候也加入了很多修正條件,在模型求解裡面再用一些基本演算法。沒想到就拿獎了,哇哈哈。哦對,還有圖一定要畫的好看!

最後,再分享些資源。
O獎優秀論文,美賽:
http://pan.baidu.com/share/link?shareid=3213989867uk=922813504
matlab相關書籍資料代碼:
http://pan.baidu.com/share/link?shareid=571665865uk=922813504


希望你也能取得好成績。


謝隊友 @饒曉戎 邀【雖然過去了一年。

背景:2016年國賽二等獎(A題),我是負責編程的(他負責建模)。

說在前面:首先,這篇答案假設讀者已經了解過數模比賽的基本流程,但卻是數模編程方面的萌新,所以這裡著眼於題乾重的:需要學習哪些知識;其次,我們隊從培訓到比賽都專精最優化問題,故而給出的建議是以最優化問題作為出發點,評價、預測問題另有軟體和相關演算法需要學習;最後,很多答主已經概括性地給出意見,本文希望具體地給出快速上手的步驟和思路,作為補充

一、軟體:

只推薦MATLAB,原因有二:

1、LINGO一類的傻瓜式軟體在往後的數模競賽中占不到任何便宜,只在模型驗證方面或許能有微小作用;

2、精通MATLAB已經需要足夠精力,並且性價比也已夠高,如果額外學習與其有功能重疊的軟體或許會有幫助,但還不到值得三心二意的程度。

學習順序:

0)知道入門的界面操作命令,editclcclear等、設置路徑Add to path、三段式layout界面等個性化的操作,很多書一翻開就是這些內容,以及腳本和函數的概念用法;

1)掌握基本的計算器式命令,這一部分命令建議直接背在腦子裡,這樣代碼寫得快,比如minsum這一類;

2)熟悉進階的一些技巧性命令,比如repmatonesfindsort等、邏輯值索引之類的,這一類代碼用在寫函數時做向量化或者編演算法的時候,記住什麼時候該用就好,如果忘記調用格式的話,有help大法啊;

3)熟悉對文件的讀入和刪改、保存(比如xls、txt),雖然MATLAB提供了GUI界面,但我認為從函數封裝的角度來說,用代碼寫文件輸入在驗證模型時會更方便;

4)熟悉繪圖操作(2D、3D)及導出選項,比賽的寫作期間需要大量輸出用於分析的圖片,優雅的圖片風格也是提高論文完成度所必需的,推薦將figure save as .emf,矢量圖格式在轉成pdf格式之後優勢明顯;

5)熟悉常用的工具箱以及其中參數的意義,比如最優化工具箱(比賽那三天里會看到有人現場學工具箱,但這樣的話往往會不清楚如何分析工具箱給出的結果和改進的方向);

6)掌握基於MATLAB的各種智能演算法及結果分析,優先選擇遺傳、蟻群、粒子群。之所以在真正的求解演算法中不建議直接使用工具箱,是因為我們偶爾需要修改演算法使之適應題設、更快收斂,而自己用心寫過的代碼不僅優化程度高,改起來自然也更得心應手;

7)另外就是關於代碼的打包和整理了,這涉及到每個人的編程習慣,開始學習的時候就應該要在這方面多注意,避免混亂的代碼習慣,適當的強迫症也不是不好:)

二、書籍:

編程同學必學的有兩本,堪稱經典:

1、《數學建模演算法與應用》:專註於數學建模的演算法,每種演算法給出對應例子及源碼供學習和修改,個人認為這本書最大的價值在於沒有廢話,沒有冗餘的知識,很大程度地覆蓋到真正有用、能解決數模競賽問題的演算法;源碼的提供也給了我們很大的空間去修改,跟著這本書來學編程是完全可行的方案,教學用的代碼不會用艱深難懂的優化方式,易讀性高;可以說,在我校暑期培訓的過程中,用這一本書已經能夠勝任了(簡直就是一本工具書)。

2、《MATLAB智能演算法30個案例分析》:用案例給出諸如遺傳、粒子群、蟻群、免疫等各種各樣智能演算法的編程思路,更重要的是給源碼;同樣地,教學源碼的效率不忍直視,所以學習的重點在於演算法原理和編程實現方法,之後能將代碼效率優化到什麼程度,憑本事了。順便一提,用矩陣運算代替for-loop是提高MATLAB代碼運算速度的大殺招:)

(書籍圖片來源http://Amazon.cn)

3、另外,對於演算法的選擇問題需要遵從選舊不選新:新演算法存在的一個問題是找不到驗證其能夠收斂至全局最優解的數學證據,這在評審中對於求解演算法的打分是很嚴重的致命因素,而經過嚴格證明的演算法以遺傳為例,遠不止在數模中用到,獲得業界公認的肯定,所以不需要在論文中添加文字去證明其收斂性,可以避免老師不認新演算法;而相對來說又應該在這個基礎上選擇新演算法,諸如模擬退火、蒙特卡洛這樣的演算法在數模中已經少見,沒有必要選用,顯得自己的求解方式「低端」。

需要強調的是,所謂「舊演算法」指的是演算法已經被充分肯定。而數模論文要獲好獎的兩大因素在於數學論證和創新求解。以最優化問題為例,眾所周知在提出模型時必須有目標函數、約束條件、決策變數,而預測問題中要給出對預測結果的誤差分析,當模型中參數很多的時候可以做靈敏度分析來驗證自己模型的適用範圍等,數模競賽已經發展很久了,對問題的解法有時換湯不換藥。所以會潛意識地在論文中找能夠支撐模型在數學形式上的嚴密性的論據,甚至包括演算法是否選對了。至於創新求解,是指解法而非演算法,創新解法最簡單的例子是將非線性問題轉換成線性問題求解(然而現在也不新鮮了吧)等,在培訓時我們組做過用蟻群演算法求解中心選址的問題也可以做為思路清奇的例子吧。所以,能跳出原來的框架、用巧妙的方式在解法層面上解決數據規模大、演算法效率低的問題是很大的加分項,能讓評審老師眼前一亮的話分數自然就高了。另外,在創新求解思路的時候,可以添加適當的、不過分的假設來達到目的。

所以,對於求解總結如下:

1)從模型建立到結果分析全過程要有嚴密的數學形式做支撐;

2)提前做往年賽題儲備,積累創新解法便於啟發自己對題目的新理解,從而迸發創新點;

3)演算法有其應用範圍,所以透徹理解演算法原理、提前備好優化過的高效代碼供選擇很重要(強調「提前備好」)。

演算法和解法相輔相成就像兩個兵器庫,若能熟練到根據對手挑選出1+1&>2的神級搭配,則遇神殺神、遇鬼殺鬼:)

三、建議

答案我都看了,也喚起了很多比賽時的記憶,有些話想在這裡和讀者分享。

1)對於戾氣很大的回答,我想說,這個比賽的黑幕與僥倖可能一直存在,我也親眼所見。然而,作為沒有被黑幕照顧到的隊,我們照樣拿了全校唯一的國獎。也曾羨慕過能夠被黑幕光環照耀的同學們,但事後回想,除卻保研資格作為回報,這過程中積累下來的編程、邏輯能力和建模思想才真正讓我的實力有所增加,否則作為一個混子無論如何也是拼湊不出這篇答案的。換個角度來說,國獎結果公布下來,一等獎700多個隊、二等獎1300個隊再加上高教社杯的隊伍,運氣選手的比重佔到多少?難道這個全國性的比賽的參與者中運氣選手比實力派還來得多?所以,踏實準備、用心學習才是概率最大的獲獎途徑。況且,題主能夠提出這個問題,想必也是抱著熱忱的初心,澆冷水的做法實在不雅觀。

2)編程是數模競賽中的靈魂,第一天要幫建模隊友查文獻、改模型、想解法,第二天要自己調演算法、驗結果,第三天要幫寫作隊友出圖片、甚至解釋演算法原理(不過我就自己寫了),所以要有擔大任的心理準備。這裡多說一句,正確的模型是開始求解的前提,在模型尚且模稜兩可時若還不到最後一天請不要放棄繼續查文獻和改模型,只有正確的模型才能夠給出與標答相近的結果(最優化問題是有標答的),而入圍國獎的前提是答案接近。16年的A題3個問實際上是連起來的,然後我和建模隊友向來是模型沒把握絕不開始求解(還有matlab的版本也很重要,用R2014b就好),所以我們到了最後一天才一口氣連解3問,前兩天他心態崩了甚至想編答案,不過最後算是救回來了:)

3)隊友關係影響到解題心情,3天時間很寶貴,除了建模、求解、碼論文,爭吵這種事情是絕對不應該發生的。還有就是良好的休息,實際上人到了半夜效率很低,前兩天不如好好休息,最後一個晚上通宵也應該是在碼論文和結果分析了。這些都要在培訓中奠定基礎,所以若有校內集訓強烈建議參加。還有一句忠告:找隊友憑客觀實力,別憑交情,不好好評估實力和契合度的結果就是遇到坑逼葬送生命:)

4)作為編程隊員,可以隨時調用的代碼庫和函數庫很重要,記得提前把常用的命令組合、演算法、畫圖命令巧妙地封裝成函數,方便調用,因為這樣可以在3天時間裡擠出更多時間來查文獻【誤。數模競賽當中的題目很多都可以查到現有文獻,但不太可能可以直接應用,所以要在文獻基礎上做修改,並且在查到有用的文獻時千萬記得另建一個文件夾保存,提高效率。一般來說,論文要引用10-15篇論文,要在文中引用到的地方加上標。在模型解法都ok的情況下,可別讓格式和美觀拉了後腿。

5)最後一天寫在摘要里的結果一定要再三檢查有沒有抄錯了QAQ

四、乾貨

1)軟體的網盤:包括MATLAB、ANSYS、SPSS、MathType等

2)書籍的網盤:包括提到的兩本書還有其他,當然還有源碼

3)我改的蟻群:http://pan.baidu.com/s/1pLQHoRT

有任何問題可以評論、私信,一起交流,共同進步:)

希望能夠有幫助,祝好。

2017-10-01 22:20:23


看到這麼多人在討論數學建模中編程語言的問題,那就簡單說一說編程吧……

今年的「華為杯」研究生數學建模國二,我是團隊裡面負責編程的,我是C++程序員,對Python語言也很熟悉,但是比賽過程中,所有程序我都是用Matlab寫的……你問我為什麼不用C++,我就問一句,你用C++寫一個加權最小二乘法,然後再寫一個曲線擬合併繪出擬合圖形你要多長時間,Matlab估計十行以內……

數學建模中的編程很多時候跟應用編程不一樣,數學建模當中很多時候都是在實現某個思路,我想你在實現某個思路,解決某個問題,大多時候都是在寫偽代碼吧,寫個最小二乘,估計也就一行吧,Matlab提供了這樣的調用和機制,為什麼要用C++重寫呢?

還有你說要學些什麼東西啊,找本數學建模的書看看,看看那些題型裡面的演算法就知道了……
差不多什麼馬爾科夫,時間序列,灰色預測,模糊預測,各類優化演算法,遺傳蟻群等等,至少都要了解,知道幹什麼的,儘管你不負責演算法的設計,但是至少要知道演算法的目標,要不然你怎麼寫代碼?

另外啊,數學建模往深了玩很深,但是說水啊也很水,對論文的格式啊,描述啊等等很看重,祝好……


Matlab,SAS,Lingo,Mathematica,R,Python。。。
千萬別用SPSS,太LOW逼。。。
見過一些拿過幾次獎的,自己覺得很牛,結果一問只會用SPSS。。。
SPSS這種在國賽以後再也用不到了,國賽幾乎不考數據的題目了,主要看硬實力。美賽個別題目估計還能用SPSS水兩年,且用且珍惜吧。。。


反對 @數學建模老司機 的回答
「千萬別用SPSS,太LOW逼。。」
簡單介紹下自己情況,國賽省一,蘇北一等,華中二等,研究生國賽(華為杯)二等,美賽M。
我覺得這位答主搞錯了關鍵問題,那就是軟體只是工具,為了服務你建立模型求解而選擇使用的,不存在所謂lowb的情況。
你不能因為一款軟體簡單就否定它的價值。

拿matlab和C++舉個例子
一個用一小時編程跑十個小時得到結果
另一個用十小時編程一小時跑出結果
科研工作者更傾向matlab
而程序員可能更喜歡c++

沒有最好的軟體,只有最適合的選擇


省級一等獎,兼職編程。

matlab: 這個不說了,必會的,作圖,擬合什麼的都比較方便,基本就用這個,不過有時候需要其他工具輔助出圖。

lingo: 求解優化模型,屬於運籌優化方面的。

spss: 一般統計分析用,不過數據多了有 R。

當時只學了一周,搞得不深,可以在網上查下資料。


參加過兩次國賽兩次美賽。國賽第一次沒獎第二次國一,美賽第一次m獎第二次h獎。編程的話簡單來說會什麼就用什麼,無非就是算算術,跑模擬,做統計和畫圖(除非有些題純粹是計算,後面另說),一般的工具應該都沒啥問題(c++要畫圖的話可能找點相關的庫比較好吧,沒試過,但是沒啥不行的對吧)。

具體來講的話可能不是特別切題,因為我們參加的時候採取了一種「每個人都做每件事」的配置,所以並沒有誰是專門負責編程的,但是我講講編程應該也沒啥問題吧。

沒得獎的國賽,那次主要是演算法不夠優,而且畢竟第一次,沒什麼經驗。選的是拼接碎紙的題,大概就是a4文件被切成了小方塊,設計演算法把小圖片還原成原來的文稿。當時想過一些神經網路之類的東西,但是由於太年輕不會搞,而且簡單暴力地把邊緣相近的紙拼在一起效果也不錯(僅限最簡單的情況),於是後面的小問就不行了。

一曰算算術

國賽一等獎那次(2014),選了一個摺疊桌子的題。就是有人設計了一款桌子,收起來的時候是一塊木板,展開如下圖(從百度找到的,當時的東西懶得找了)

最後就是計算下面的曲線啊,轉軸的位置啊什麼的。敏銳的我發現了這題根本不用建模,完全就是解析幾何,於是大家輕鬆愉快地算了三天解析幾何……用到的編程只是在mathematica裡面畫了幾張圖,還有比較難算的部分扔進mathematica里算一下。就醬。

二曰跑模擬

再說美賽,M獎那次(2014)做的分析高速公路上的各種情況,左行和右行的區別什麼的。我們就用c++,做元胞自動機。三個人,一個人寫一個車的類,管理每輛車的速度、位置等信息,我寫的大概就是用於管理車的集合,每輛車要前車、後車之類信息的時候可以找出來並傳回去以便其判斷下一步怎麼走,另一個人做的是分析部分,從我這裡獲取全局情況然後計算各種指標。寫好以後再根據題目要求調一調參數,模擬看看結果。

三曰做統計

美賽H獎那次(2015)是分析欠發達國家,搞可持續發展什麼的。於是從世界銀行之類的地方下載許多數據,統計分析各種東西。用的R語言。R的好處就是她是專門為做統計創造的,而且還有可以輕鬆下載世界銀行數據的介面,數據擬合啊、畫圖啊什麼的就是一句話的事。

四曰畫圖

前面說畫圖提到了mathematica和R,做不同的圖有不同的手段。先說最常見的數據圖表,強烈推薦R的ggplot2包,作圖神器!無論是散點圖、折線圖、擬合圖、條形圖,甚至是地圖,都可以畫!而且默認風格就已經很漂亮了,性價比甩matlab好幾條街!再就是幾何圖片、函數圖像什麼的。函數圖像的話R也沒問題,mathematica也很好。幾何的話,如果是二維圖,有一個幾何神器叫做幾何畫板,中學的時候主要是老師演示幾何的時候用過,真的超好用,誰用誰知道。立體圖的話mathematica可以畫,雖然不是很方便,但是我也不知道其他可用的軟體了。

總結

我覺得主要還是掌握一兩樣趁手的工具吧。演算法可以了解一些,但是天下演算法千千萬,很難說正好學了競賽要用到的,我們都是那道題目現查演算法的,比如元胞自動機。再有就是,不建議分工太明確,雖然不敢說鄙組的「每個人都做每件事」非常優秀,但是我見過分工明確的組有一人有難八方圍觀的情況,最後一天寫論文的人巨忙無比,另外兩個人就看著……想想看,每個人都做每件事的話是3人*3天,要是串列分工的話就是1人*3天,簡直雲泥之別。祝題主好運。


1.Matlab 或者python等都可以,但推薦matlab,因為可以有很多建模現成資源可以用。
2.掌握基本語法和編程技巧,注意畫圖能力,如果確實新手,可以整理一下畫圖方法資料比賽時參考,注意dpi,美觀度等細節問題。
3.整理常用演算法庫,最短路徑什麼的,可以考慮試試lingo,,熟悉一下一些常用啟發式演算法如遺傳演算法等。
4.熟悉常用數值求解演算法,積分偏微分最優化等常見問題。
5.數據處理能力,美賽需要自己搜集數據,常見文本數據格式的讀取存儲基本處理,注意不同方法matlab可能內存使用差距很大。
6.注意進行向量式編程,提高效率。
7.整理常用計算機模擬程序,如元胞自動機等,比賽時可以拿來修改一下就能用。
8.可以找篇往年好文章按照提供的信息將其程序部分從數據到結果分析畫圖完整做一遍,熟悉流程。
9.買瓶紅牛調代碼(並沒有什麼用。。。)
10.和隊友搞好關係:)


湊巧,大二參加過,剛剛好獲得過國一,負責編程,厚顏無恥強答一波。
a,數據結構+演算法,其它都是just soso。
b,matlab simulink(忘記怎麼拼了)

重點:演算法效率很重要。


這個回答必須得匿

參加過國賽省賽區二等獎,參加過美賽參與獎

這樣的結果讓我和小夥伴氣炸了

後來我們開了淘寶店,賣 modeling 和 coding
也是做了國賽和美賽各一次
我們服務的買家中有國賽一有美賽 F

可見,model 和 codes 都可以買到,關鍵還是論文要寫的好看!


會用MATLAB?Excel 基本就夠了
有時間 再研究下r


其實我是那個最懶的人,每次培訓我都跑,每次比賽我就發現總會有那麼幾個隊伍缺編程的我就上,美賽m獎,我就瞎說一下我是怎樣段時間內瞎搞的
1.基礎演算法和智能演算法,推薦書籍,《matlab在數學建模中的應用》 (大量的源代碼可以參考)
2.數據可視化,可選,python,matlab,r,此外excel有時候也是極好用的
3.擬合與檢驗:spss,matlab的cftool等非常容易上手使用
4.解各種方程和不等式,lingo
5.關於3.4,在《matlab數學建模講點案例實戰》中前邊都有介紹
6.不太複雜的適合編程選手看的模型介紹,《趙靜的數學建模與數學實驗第三版》
7.美賽官方說明了每種題型考察範圍,比如c題數據題,d題複雜網路題(複雜網路,petri網路等都可能),雖然經常放鴿子,但是學會這樣的編程和可視化還是很有用的

8.我覺得作為編程選手還要解決好隊伍里大多數和電腦有關的問題,比如翻牆之類的
9.找適合自己的隊友,我十分感謝我美賽時候的隊友,兩個數學專業的妹子,不論寫論文還是建模真的能體現出作為數學系孩子的優勢


就拿過省一 ,分享一下個人心得
能夠將常見的優化演算法 比如 牛頓法,最速下降法轉化成matlab代碼,再提高一下查閱文檔的能力了(引用成熟演算法能力)


emmm…你的隊友們 沒錯 就是你的隊友們
會理所應當的覺得 你什麼方程都可以解 什麼圖都可以畫 什麼數據都可以處理[手動微笑]
大概目標就是做到隊友需要啥你會啥2333

不曉得你到底想做到哪種程度

計算機專業的我…會matlab以及lingo就差不多能解決大部分問題
計科專業的大神們 還會mathmatic SAS R之類的(但其實只是比賽的話 這麼多語言 又是術業有專攻 學很難學精 比如matlab元胞數組如果學的不是非常精通 比賽哪兒有時間去寫啊

首先 先把語法學好 了解語言的特點
之後 自己嘗試處理各種不同類型的小問題
然後 學習一些建模方法以及代碼實現吧…


第一次參賽沒必要分工特別明確,畢竟水平都不是太高。


匿名反對一切說要把精力放在編程上的答案.

數學建模我每年都參加,本科的時候高教社杯,研究生時候參加華為杯.基本上每年有都至少有三等獎,偶爾拿過一等獎.17年我選的背景消除,16年我選DNA相關性分析,15年我選的流行學習.

恕我直言,研究生的比賽自己編程基本不可能,華為杯的這些問題,每一個都夠你研究一輩子了,你能在4天時間內弄懂一兩個經典演算法,並跑通原作者的演算法就已經很牛逼了,自己編程實現根本不可能.

別聽那些裝逼的高票答案瞎忽悠,研究生的比賽下面這兩個軟體是最重要的.


美賽沒比過,國賽很水的,我原來以為三等都拿不到的水文,儘是胡扯,結果拿了個國二。


推薦閱讀:

如何編寫一個分散式計算框架?
有沒有免費的代碼查看工具推薦?
零基礎轉行it,哪個方向容易一些?
iOS 開發入門需要學習哪些知識,從一無所知到精通需要多長時間?
為什麼有人說《暗黑破壞神 3》中的隨機是「偽隨機」?

TAG:編程 | MATLAB | 數學建模 | 數學競賽 |