朋友可能知道我比較擅長數學與MATLAB吧?在備考公務員考試的時候,碰到一個問題:
詢問我是否可以使用MATLAB求解。對著題目思考……計算一段時間。感覺這道題目是比較難的。不應該出現在這樣的考試當中。因為公務員考試要求的是快速!在理解題目的同時還需要需要嘗試很多次!是否可以使用MATLAB暴力求解呢?
很多數學題目可以歸結為排列組合問題。這也是離散數學的一個分支。計算機也是用離散的去逼近連續的。仔細閱讀題目,發現題目與自己以前使用「遺傳算法」求解的「哥隆尺」問題比較相似。遺傳算法比較適合計算那種離散的、可解空間非常大的問題。因為學生的分數個個不相同。參考上次的遺傳算法求解「哥隆尺」問題,使用pdist函數撰寫約束條件用ga命令可以寫出如下代碼:
運行多次,得到的結果都不是很理想:最優值偏離答案很多,而且分數也不符合「各個分數不相等」條件。思考一下符合條件的組合佔所有可能組合的概率約為:2.9E25/100^30。約等於2.9E-35。
在如此小的概率下,遺傳算法的搜尋是無能為力的。記得日本神岡中微子的搜尋嗎?質子的平均壽命是10的34次方年。可以大概理解質子裂變的概率。我們有大亞灣以及江門中微子實驗室。
對於排列問題,遺傳算法可以使用「自我繁殖」的方式。這樣使得下一代約束在約束範圍內。這也是MATLAB關於旅行者問題(TSP)求解的一個例子。但是,組合問題好像不能如此。各位可以思考一下,能否像TSP那樣?
現在,我們發現問題的難度。這時候計算機是幫不上忙的。數學思維幫我們度過難關。深入思考一下題目:按照題目要求,我們需要提高高分的,低於60分的儘量接近60。同時考慮到各個學生分數的不一樣。假設X人低於60分,所以他們的成績分別為:59,58,57,……60-X;高分人數為30-X,成績分別為:100,99,98,……71+X。計算總成績,得到一元二次方程:X²+11X-165=0。求解得到其中的一個正根約為8.47。所以答案應該為8。若果不使用數學思維的話,可能無從下手。
結論:1.有時候,知識的「魔咒」很明顯。自己知道答案可能就認為非常簡單。從論壇上面的回覆也可以看出。很多時候從答案推結果容易,反過來卻未必。與計算機裡面的「門」函數類似。
2.遺傳算法有其局限。可以提高種子的數量「避免」早熟。但是,如果種子都同一化而沒有多樣化的話結果也是如此吧?
有你的支持,我更加努力。