黃金點遊戲總結部落格
黃金點遊戲作業要求:
專案原始碼的github地址:
2. 不適用,因為這個專案我們的實現比較簡單,我們本身並沒有用PSP記錄時間。
3. 設計了Data類用於formalize獲取到的隊伍資料,用Policy類包含所有用到的方法。用getNumbers作為輸入介面呼叫這兩個模組。在結對程式設計中,其中在
4. 程式碼中有兩個類
- Data類,從輸入流中讀取資料,對輸入資料進行預處理,提取出一些屬性資訊比如隊伍數,輪數,和每一輪的黃金點等等。將這些資訊打包在黃金點歷史和隊伍歷史中傳遞給policy類
- Policy類,用Data類傳遞的資料進行初始化,其中包含幾種常見演算法,比如算數平均,滑動平均和指數滑動平均,以及波動程度檢測和隨機波動生成等方法。
- 演算法的關鍵在於,檢測當前的波動程度,一般用前五次黃金點的波動極差,方差和標準差來衡量,具體設定的threshhold根據作圖經驗性的設定。比如對前400輪資料進行作圖,觀測到對於波動範圍不大的情況下,一般極差不超過3,方差不超過2.5,在這種情況下,我們採取的是對短期建模較為準確的滑動平均,並且輸出的兩個值分別是滑動平均和指數滑動平均。如果我們檢測到最近黃金點的波動比較平穩,這個時候我們進行隨機數擾動就有利可圖並且也易於預測。這個時候我們就會輸出僅考慮了自己輸出隨機數以後的滑動平均。如果波動比較劇烈,這個時候輸出隨機數反倒容易扣分,所以就老老實實地一個輸出滑動平均,一個輸出對長期建模比較準確的指數滑動平均。
5. 各個類之間的結構就是類似pipeline的結構,由Data類處理過的輸入輸出到Policy類中,由演算法處理後輸出要輸出的兩個數字。
6. Code Contract的有點在於能夠生成語言無關的檢測,通過定義前置條件,後置條件和不變數來對一些關係進行約束。避免一些沒有意義的引數測試,來生成有意義的單元測試。由於Code Contract執行的是編譯前檢查,所以能夠提高編譯效率。但是缺點在於,程式碼契約有可能對程式碼造成不必要的約束。在我們的結對程式設計中,由於我們的程式碼比較簡短,我們也並沒有使用Code Contract。
7. 我們約定的程式碼規範是要求對於函式的域必須是私有的,被隱藏的。程式中沒有異常捕捉,因為我們的程式在邏輯上保證了數字不會越界產生未預料的輸出。雖然加一些assert語句是有益的。
8. 我們的程式沒有介面,因為程式是在伺服器上被呼叫,輸入輸出通過命令列。
9. 理由同上,本條不適用。
10. 結對的過程中,我們的合作方式是先一起協商策略,林郅琦負責編碼和測試工作,我負責程式碼複審。在第一輪的比賽結束後代碼調整的半個小時裡,我負責對前400 rounds資料的統計分析,策略調整和閾值估計,林郅琦對程式碼進行相應修改。
討論時照片:
11. 我們採取的結對程式設計是我做領航員,林郅琦做駕駛員。我進行復審和程式碼邏輯修改的意見,林郅琦負責程式碼的編碼和測試。結對程式設計的優點,其中一方對程式碼比較熟悉,能夠非常熟練地對程式碼做出修改,另一方可以進行分析和意見的提出,能夠對編碼的思路提出建議。缺點在於,在編碼速度上不如兩人同時編碼。
林郅琦的優點:
- 動手能力強
- 對python庫比較熟悉,能夠迅速找到需要使用的函式
- 對時間序列預測的演算法有了解
他的缺點:
- 對資料統計和分析沒有重視
我的優點:
- 能根據實際情況想出相應的對策
- 根據前400輪的統計資料和實時波動情況進行統計量分析和策略調整
- 對他人的程式碼邏輯和資料結構能夠理解和掌握,便於之後的修改
我的缺點:
- 沒有對自己的新想法和新模型進行編碼和優化
如果採用三明治方法,我會首先說:
你這段程式碼寫的非常規範,並且邏輯也很清晰嚴密。
但是如果能根據比賽的實際情況進行一下調整就更好了。比如分析出前3~5輪黃金點的極差,方差或者標準差的帶下進行不同的策略調整,或者對其他選手所採用的策略進行大致預估。
你這幾個演算法寫的還是挺有效的,但是如果能將這幾個演算法根據比賽的實際情況進行有機結合,效果會更加出色!
12. 理由同上,我們並沒有用PSP表格記錄我們結對程式設計的時間
13. 其他收穫:這次比賽的結果比較的遺憾。在前400輪的比賽中,我們穩穩地拿到了最後一名,後來對我們的輸出情況和黃金點的波動情況進行了分析,發現由於總共有6支隊伍都在比賽的過程中輸出了隨機數,而我們的程式在預測的時候只考慮了自己的隨機數,這就使得我們的預測結果每一輪都比實際的黃金點結果要高,並且在這種情況下指數滑動平均完全失去了預測功能。後來我們調整了策略採取對短期建模比較好的滑動平均並隨機應變,在第二輪取得了第三名,最後總分倒數第三名,非常遺憾。在比賽的過程中,我們理解了並不一定要一一種方式解決問題,能夠隨機應變的策略才是好策略。同時也對其他隊伍的演算法非常的佩服,因為他們的演算法非常的魯棒,既能夠在強烈的干擾下做出相對準確的預測,又能在平穩的情況下進行更加精準的預測。