1. 程式人生 > >2018華為軟體精英挑戰賽經驗分享,止步複賽,無緣決賽

2018華為軟體精英挑戰賽經驗分享,止步複賽,無緣決賽

程式碼開源於 github,如果覺得本文對你有幫助的話,請到 github點個贊再走哦!

今年的華為軟體精英挑戰賽終於結束了(大佬們去深圳決賽了),當時初賽賽區第5,進了複賽也沒能衝進前4(前4進決賽),也算有些遺憾吧。本文梳理下比賽思路,分享下比賽程式碼。

賽題簡介

此次比賽題目是關於利用虛擬機器歷史申請使用記錄來預測未來一週虛擬機器的申請情況,並對預測的虛擬機器合理分配到伺服器上,詳見官網。開始看到這個題目,以為用機器學習、時間序列來做,後來發現自己太天真。

比賽思路

預測模型

預測模型試過很多,但很多用心寫的程式碼,不如取平均值。試過的模型有:
- 二次指數平滑
- 區域性加權模型
- 線性模型
- Arima模型

除了模型,還有試了很多去噪方法,試過不同的滑窗方式,比賽還是很累的,特別是辛苦寫的程式碼完全沒有作用,這很打擊士氣。建議大家找好隊友,分工合作,這樣才不至於中途就放棄了。最後初賽使用二次指數平滑,複賽使用區域性加權模型。

感覺預測演算法沒什麼好講的,畢竟全靠玄學,都是瞎寫一通,再瞎調參,為什麼分高也完全不知道。

放置演算法

  • 放置演算法採用動態規劃的揹包演算法,其實貪心演算法採用恰當的放置策略已經能取得接近最優解的結果,最後初賽對比了我的python程式碼和隊友的C++程式碼,最後採用的是隊友C++版程式碼,預測是動態規劃,放置是貪心演算法。
  • 由於C++程式碼主要部分是隊友完成,沒有隊友許可,這裡只將自己python版程式碼開源,此程式碼初賽可取得235+的成績。開原始碼使用的是二維揹包進行,即以優化CPU為例,將CPU作為價值,記憶體作為重量(限制條件),但這樣的問題是很容易產生記憶體放滿了,CPU佔比很低的情況。於是加入判斷,若放置的伺服器放置率小於閾值,則回收此伺服器的虛擬機器,打散順序重新放置。
  • 此放置演算法,線下測試了很多情況均可得最優解,後期花了2天移植倒C++版本,但是計算出的結果和python版相差很多,至今不知道原因。
  • 放置演算法的改進:建議使用3維揹包,即以CPU和記憶體作為約束條件,去max(CPU+MEM),這樣程式碼的執行速度更快,而且效果是一樣的。
  • 關於放置率的提升:根據放置結果,最後一個伺服器可能存在放置率不足的情況,可向最後一個新增虛擬機器直至放滿,或者直接將此虛擬機器刪除,即通過放置結果修改預測結果,初賽加入此條策略,提高了接近8分,還是挺有效的。

程式碼開源於 github,如果覺得本文對你有幫助的話,請到 github點個贊再走哦!

首發於

個人部落格