一、 賽題解讀
2018的華為軟件挑戰賽賽題還是很好理解的,簡單講就是分成了兩個部分,一是根據多用戶請求雲端彈性服務器資源個數的時間序列歷史數據,來對未來一段時間的用戶請求情況進行預測,二是通過裝箱(背包)對預測資源進行分配。算是一個比較容易上手的題目。
在官方的指導文檔中,更是給出了一個簡單、基本的解題思路,並含有偽代碼,對於第一次參賽的人非常友好。
二、 初賽方法
- 預測部分——二次指數平滑預測 + 三次指數平滑預測
因為指數平滑方法的簡單穩定,適用於中短期發展趨勢預測,所以我們組一開始便選擇了這個方法,后來得知大多數隊伍在預測部分都是指數平滑法。這也算是我們誤打誤撞,新手福利吧。
(1) 一次指數平滑:是一種特殊的加權平均法,對於本次實際值和本次預測值賦予不同的權重,求得下一次預測值。
St = α * xt + (1 - a)St-1
其中St為第t次預測值,xt為第t次實際值,α為權值(即平滑系數)。新預測值是根據預測誤差對原預測值進行修正得到的。α的大小表明了修正的幅度。α值愈大,修正的幅度愈大,α值愈小,修正的幅度愈小。
一次指數平滑法比較簡單,預測的時間序列為一條直線,不能反映時間序列的趨勢和季節性。
(2)二次指數平滑: 二次指數平滑用於線性趨勢的時間序列
二次指數平滑,將一次平滑的結果作為實際值再次平滑,這樣做保留了趨勢的信息,使得預測的時間序列可以包含之前數據的趨勢,二次指數平滑的預測結果是一條斜的直線。
(3) 三次指數平滑預測:在二次平滑的基礎上繼續平滑,可用於拋物線型的數據。
根據評分結果來看,二次指數平滑+三次指數平滑的方法得分最高,所以我們最終采取了這種具有多個參數的預測模型。
- 放置部分
在放置部分,我們可以把問題理解成一個裝箱問題,只是加了一個關於CPU和MEM的約束關系(1:1,1:2,1:4)。在放置部分我們分別使用過貪心算法和退火算法(有向師兄請教),但是在公布的數據上的結果(得分和分配效果)都是一樣,為了穩妥起見(也是增加逼格),最終使用的是退火算法。
三、 遇到的問題
- 使用VS2017作為Linux C++開發工具
對於一直在Visual Studio 上進行程序調試的小白來講,對於在Linux下進行編譯,雖然覺得這是必要的,但在內心里還是很抗拒的,就像熟悉了MATLAB之后再去使用其他IDE一般。慶幸的是,VS2017可以編輯、編譯、調試Linux上的C++、python程序,進行跨平台的開發。具體操作請參考:
https://www.cnblogs.com/xylc/p/6533716.html?&from=androidqq
2. 數據去噪
剛開始並未對數據進行有效的處理,直接將所有數據拿進去使用了。后來在QQ交流群中注意到有人在談論數據去噪問題,官方給出的數據集中是有一些噪點的。
3∂原則
如果數據服從正態分布,在3∂原則下,異常值為一組測定值中與平均值的偏差超過3倍標准差的值。如果數據服從正態分布,距離平均值3∂之外的值出現的概率為P(|x-u| > 3∂) <= 0.003,屬於極個別的小概率事件。
如果數據不服從正態分布,也可以用遠離平均值的多少倍標准差來描述。即,使用Z-分數(Z-score)進行判斷,計算每個數據的Z-分數。
樣本中每個數據x - 樣本平均數u,除以樣本標准差δ,即可以計算每個數據的Z-分數。Z-score的值應該為【-3,+3】,超過該值的存在為異常值的可能,需要進一步判斷。
在這里,我們認為數據符合正態分布,將距離平均值3∂之外的數據點視為噪點,並用前一個位置和后一個位置的平均數進行填充。
3.評分規則
有關用例的評分規則部分之前一直沒有好好看過,一直在急急忙忙的作比賽碼代碼,比賽末端,在方法上已經沒有好的想法突破之際,我們終於開始靜下心來研究評分規則,希望在這上面找到一些提高分數的突破口。
在step4中,得分 = 預測精度 * 資源利用率。那么,處理好預測精度和放置利用率之間的平衡也很重要,假如說,每個服務器可以放置5個虛擬機,預測到16個虛擬機,就會形成有一個服務器只放置1個虛擬機,造成了資源容量浪費的情況,拉低了整體的資源利用率,盡管在預測精度上可能更加准確了,但是拉低了整體的評分。所以,在某些情況下,可以犧牲部分預測准確度以達到更高的資源利用率。
所以我們在最后,增加了一個對最后一個服務器利用率的判斷,如果最后一個服務器的資源利用率<0.3,則不進行放置,同時刪除對應的預測的虛擬機。
四、 寫在最后——感悟與經驗
- 對比賽的准備不足,記得是在比賽已經開始之后,周圍的人都在談論華為軟挑,這才報名組隊參加。毫無准備,導致整個比賽過程都慌慌張張,沒有方向感。
- 深切認識到了自己編程能力和數據結構知識的不足,之前掌握的那點C++編程完全不夠看,真正認識到數據結構的重要性,如哈希表。從此走上了好好學習,天天向上的道路。
- 團隊協作的重要性,集思廣益十分鍾,效果說不定會超過苦思冥想大半天。當然要分工明確,不然會造成“人等人”的尷尬局面(當然,鑒於我們組另外倆都是女生,所以我也就承擔了大部分工作)。
- 寫完代碼要注釋,比賽結束要總結。像我這樣過了一年才進行總結的,相應的資料找不到,代碼也要重新溫習一遍。
- 在競爭激烈的西北賽區首次參賽進入前64強,對這個成績,雖然也有遺憾,但更多的是激勵。