1. 程式人生 > >從2014年到2017年——我的數模經歷

從2014年到2017年——我的數模經歷

白天剛結束了今年的研究生數模,想到這可能是我最後一次參加數模了,還是挺有感觸的。故把本人四年建模的一些所思所想記錄在這裡。

四年數模經歷

從建模課到找隊友

我並不是一開始就參加數學建模比賽的,在這之前,有半個學期的數學建模課,至於為什麼要去上這個課,大概有兩個原因,一個是因為大一的時候和兩個同學的很隨意的口頭約定,說明年一起參加數學建模(當時還是通過數學競賽才瞭解到有數學建模這回事的),那個同學也是我至今最好的朋友之一。還有一個原因,那個時候因為個人感情問題比較失落,想找一些事情轉移一下注意力,於是就去參加了建模。現在想想,還真是有點荒唐,連自己都有點不能理解。最後在後來的校內賽也僅僅拿了三等,感覺那個時候如果自己沒有在感情上遇到挫折,應該會發揮的更好,也因為自己的原因,還連累了兩個隊友。

話說回來,這門課是我們學校理學院的劉老師帶的,劉老師上課很是有趣,總是會通過生活的中的各種例子來啟發我們的思考。我還記得劉老師給我們講的第一個數學建模的例子是分析椅子能否在地面上放平的問題(該問題出自清華大學姜啟源教授的《數學模型》這本書上),這個看似簡單的問題,對於當時的我們來說卻顯得很抽象,劉老師帶著我們沿著書中的思路,將一個直觀的現實問題一步步轉化成一個數學證明問題。當時心力就覺得,哇!數學還能這麼玩?劉老師絕對是一個很聰明的老師,除了我之外,我想還有很多人被他一步步帶入數學建模的世界。

不過雖然開始的時候很好,一切看似正常,但後來要組隊的時候,比較尷尬的事情出現了。數學建模是三個人一隊參賽的,我本來是想和我的兩個好朋友組隊的,但是突然有一天得知訊息,那兩個好朋友的一個人能因為前一階段轉專業的關係,認知了另外一個人,並且和他一起組了隊,然後把另一個朋友也拉了過去,我一下子變成了光桿司令,感覺像是被拋棄了一樣。說真的,那個時候真的不是滋味,雖然表面上我和她們說沒事,時間還早,我可以再找隊友。其實我心裡真的很急,我曾試圖想拉我另外兩個好朋友和我一起,不過他們表示都沒有興趣,後來我又拉了我的兩個部員,結果其中的男生過來上了一節課後,感覺什麼都聽不懂,就退出了。我覺得如果他能來上劉老師的第一節課,可能就有興趣了,真是可惜。不過讓我欣慰的是,另一個女生Vicky表示很感興趣,雖然還缺一個隊友,不過對於那個時候那種狀態下的我,已經非常高興了。在後來的一段時間,Vicky的閨蜜,同時也是我的同學lingyi剛好從美國學習回來,表示也想參與進來,我們一拍即合,終於組成一個完整的Team了。

2014年6月 中丹杯校內賽

我們第一次參加數模比賽是緊接著數模課程後的“中丹杯”校內賽,是我們學校為選拔參加全國大學生是數學建模競賽做準備的。我還記得題目大概是做食品分類的,通過常規的聚類演算法就可以解決。不過對於剛接觸的數學建模的我,很多思想壓根不懂,一切都是現學現用,學校也充分考慮到大家都是新手,給了我們兩個星期的時間,我本來以為兩週時間很充分,所以我們一拖再拖,直到交論文的前兩天,我們才真正開始做起來,查文獻、想演算法、寫程式碼、寫論文,弄了近兩天兩夜才勉強做出來。那兩天應該也是我本科階段第一次高強度的通宵。雖然感覺自己做的不怎麼樣,但對於第一次參賽的我們,能夠比較完整地完成一次比賽還是很興奮的。

2014年9月 高教杯全國大學生數模

接下來的是暑假一個月左右的建模培訓和國賽,培訓期間我才意識到,中丹時做的食物分類問題是數模裡再簡單不過的問題。對於培訓期間遇到歷年國賽的各種題目,幾乎是無從下手。再加上我隊友暑假有事不能來參加培訓,我們平時交流問題也是各種不方便,甚至有的時候自己一個人看著題目心裡想著放棄。但後來又一次次把自己從放棄的邊緣硬扯回來,因為我不想幹一件事中途就放棄,不想讓周圍的人嘲笑,不想連累的我兩個隊友。就這樣硬是撐到了國賽,題目是嫦娥三號月球軟著陸軌道計算,說真的,那次比賽幾乎把我們打垮了,一個三個問還是四個問我記不清楚了,我們一個問都沒做出來,甚至連一個完整的模型都沒有。我覺得那次比賽我們辜負了我們導師的期望,而作為隊長的我也因承擔主要責任。我開始懷疑自己,懷疑自己的能力,剛提交完論文的那一刻,我只想趕緊溜走,再也不要回到建模的世界。

過了一段時間,比賽結果公佈,我好朋友的那一隊拿了省一等(在參與全國評獎的時候不幸被刷),而我們這一隊啥都沒有。這對我我來說真的又是一次打擊。我不想就這樣被打敗,因為真的不甘心,我兩個隊友也是。於是,我們開始反思,反思我們隊的問題出在哪。得出的結論是,我們三個人平時的交流太少,同時課餘時間也沒有很好地去學習建模的相關知識,分工不明確,導致在比賽期間有點不知所措。於是,交流過後,我們決定繼續參加寒假期間的美國大學生數學建模。並在此之前,明確了各自的分工,三個人不定期地交流最近看的東西,其中我負責學習演算法和程式設計,那段時間,我幾乎天天學習MATLAB,接觸數學建模中常用的各種演算法,雖然很多演算法都不怎麼能看得懂,但也能明白如何在MATLAB使用了。因為對於數學建模,你不一定要完全搞懂一個演算法,而是隻要理解這個演算法的功能和如何使用就能比較好地解決問題了。現在想來,那段時間接觸的一些東西,尤其是神經網路,對我現在的科研學習還是很有影響的(因為我現在的方向是機器學習和計算機視覺,需要用到神經網路和深度學習的理論)。

2015年2月 美國大學生數模

美賽算是我數學建模經歷中的一個轉折點。我記得當時是2月初,學校剛好下了很大的雪。供我們比賽的機房空調好像還壞了。我們選的題目是埃博拉病毒的傳染病模型,要求大概是選擇某一個地區建立病毒傳播模型,並指定藥物分配策略。相比無於國賽,我們這次時間規劃得很有條理,不管是模型建立還是編寫程式碼進行模型求解,都順利多了,我想這和我們之前的準備有關係。最後不得不說的是,由於是美賽,論文需要用英文寫,而剛好我的兩個隊友的英語都非常棒,我們的指導老師陳老師也及時與我們交流問題,所以最後這次比賽的最終獲得的一等獎主要歸功於我的兩個隊友。

通過這次比賽,我們也大概瞭解了國賽和美賽的區別。國賽大多數題目都需要按照題目的思路進行準備地建模,很多題目都會有相對固定的答案;而美賽相對開放性更強,但相對於國賽,會抓不到題目的重點,容易跑偏。從題目難度上感覺美賽略微簡單一點,但差距不大。而我們也發現更時候做這種開放性的題目,因為可創新的地方比較多,容易出亮點。

不管怎樣,當看到自己的付出有所回報時,還是很開心的。雖然事後聽到一些關於我們隊的閒言閒語,但我我們並不在意,自己通過努力換來的成果,何必在意他人的說三道四。

2015年5月 MathorCup國際賽(CAA世界大學生數模)

美賽後,我似乎重新燃起了對數學建模的熱情,總覺得一切結束的太快。於是又和我的兩個隊友商量,是否願意再參加一次?Vicky表示贊同,而lingyi表示後面可能沒有時間,很遺憾退出了。沒有辦法,我和Vicky一邊網上看看最近有沒有比賽,一邊重新找隊友。就在那個時候看到了MathorCup國際賽(全名很長,叫MathorCup全球大學生數學建模競賽暨CAA世界大學生數學建模挑戰賽),感覺還不錯,就直接報名參加了,導師我們還是聯絡了美賽的導師。

這次的題目是是針對網上某一商品的評論,將對商家有參考意義的評論篩選出來。本質上是一個分類問題。題目非常短,只有四五行,所有的資料都是需要自己來找。我們還是頭一次遇到這樣的問題,看似簡單卻無從下手。因為我從來沒有做過文字分析,所以當時感覺就懵了。還好陳老師有一定的經驗,他建議我們用C++做文字分析,其中也給了我們很好的幫助。其實這應該是一個典型的機器學習二分類問題,但當時我們還沒有這一塊的概念。只是糊里糊塗地拿過來用了一下,大概思路就是自己去網上找了一些評論資料集,然後人工標註了一下,接著在一部分資料集中做一些詞頻統計,並取出權重較大的詞用於對剩下的評論集做評估。

後來我接觸機器學習的相關知識後,再回想這次比賽,我覺得我們在模型中用到的關鍵詞權重更新機制是我們拿了二等獎的關鍵。因為這其中融入了一些機器學習的思想在裡面,只不過那個時候的我們自己都沒有這些概念。而我在看歷年比賽題目的時候也發現,最近幾年的比賽中關於大資料和機器學習的題目開始逐漸活躍起來。這應該和大環境有關吧。這樣的一個好處是數學建模可以面向更廣大的群體,題目的開放性也大大提升。因為往往資料探勘這一塊的題目是非常開放的。

2016年9月 華為杯研究生數模(第13屆)

2015年的9月,我因為數學建模的原因,成功保上了碩士研究上。可喜的是,我的兩個一起參加數學建模的好朋友也順利保上了研究生。在大四下學期,我們三個商量著明年再一起參加研究生數模。一方面因為那麼長時間沒有建模了,或多或少有點手癢吧,另一方面,也算是完成當初三個人沒有一起組隊的遺憾吧。

一年後,我們回到了當初比賽的地方,又開始了持續四天的比賽。當然,我們之前還是做了點準備的,因為考慮到研究生數模要比本科生數模更專業,我們翻開了前10年的比賽題目,並總結我們隊的優勢和劣勢。比賽開始的時候,我們也是輕車熟路,很快就進入了狀態,我們選的是關於等位基因的一些研究問題。這題應該屬於資料探勘型別的題目,雖然題目的答案可能是唯一的,但是可選的方法比較多,所以開放的空間還是很大。一共四個問,我們應該是做出來三問,最後一個問應該是做錯了。所以最後只拿了二等獎。

但參加了這麼多比賽,我們似乎已經沒有那麼在意拿什麼獎了,我們更多的是開始享受建模的過程,享受大家在一起一起交流並解決問題。這其中的樂趣,在其他地方真是很難感覺到的。似乎一年一次的建模成了我們的傳統,每到這個時候,就要在一起過個節。

2017年9月 華為杯研究生數模(第14屆)

其實這次比賽剛結束,我是在結束當天休息完後寫這篇部落格的。相對於上一次的數模,這次還是有點吃力的。我覺得主要問題出在我,因為我是負責程式設計的,而我們的進度也是在第一問的程式結果上卡了兩天。因為程式執行的結果一直不理想,所以我們就反覆地去檢查程式碼,直到第二天半夜,我們竟然決定臨時換題目。這在數模上幾乎是沒有辦法的辦法的,因為換題目太耽誤時間。不過,第三天早上,一個學長在我們程式的基礎上成功跑出了理想的結果。我們瞬間鬥士又回來了,又複查了一遍我們的程式,竟然也調試出了正確的結果。我們自己也很疑惑,到現在我都沒有想到當時的問題出在哪裡。不管怎麼樣,有了第一問的基礎,後面的題目進度就很快了,我們也在接下來的兩天裡把前兩天落下的進度趕了上來。總之最後也算是比較完整的完成了這次的比賽。

比賽結束後,其中的一個朋友因為學校裡有事,直接就回去了,另一個同學和我在學校一塊吃了頓飯,兩人也交流了一些以後的打算。大概就是以後應該不會再參加數學建模了。一是考慮到研三的時候事情可能比較多,而是考慮到更想參加一些其他的比賽,嘗試一些新的東西。總之,我的建模生涯應該到此宣告結束了。

數模帶給我的東西和未來的一些計劃

相比於數模給我帶來的各種獎項,我覺得更有意義的是在四年的數模生涯中自身多方面能力的提升。其一是程式設計能力,因為數學建模離不開程式求解模型,而我在每次比賽中負責的就是程式設計,所以對我來說,提升最為明顯的是自己的程式設計能力;其二是閱讀專業文獻的能力,每次接觸一個新的問題,我們都需要閱讀比較多的相關文獻。而且因為時間有限,我們必須在短期內迅速從海量文獻中篩選對自己有幫助的資訊;其三是表達能力和溝通能力的提升,建模是一個團隊的比賽,在比賽中清楚地表達自己的觀點和想法極為重要,這方便了隊友之間的交流,加快解決問題的進度;其四是建模能力,建模本身就是一種能力,通俗的講,就是將現實中的物理模型,經過合理的假設和簡化,抽象成一種可解決的數學模型,這對於日後解決實際問題是非常有幫助的。

現在自己讀研二,自己規劃的路應該是偏向於科研,可能一年後會選擇聯絡一個導師繼續讀博,閒暇之餘會多學一些程式設計(目前在學C++和python),合適的話也會嘗試一些新的競賽(比如資料探勘機器學習相關的),同時也會選擇看一些課外書,這主要考慮到我的課外閱讀量太少了,平時閱讀的書籍都侷限在自己的專業書籍。如果有機會的話,以後還想出去轉轉,接觸一下不一樣的學習和生活,不過這些都是以後的事了。