1. 程式人生 > >2017年華為軟體精英挑戰賽初賽解題思路

2017年華為軟體精英挑戰賽初賽解題思路

 題目連結:http://codecraft.huawei.com/
 常規解題思路:網路流(最小費用最大流)+ 啟發式搜尋演算法 + 演算法效能優化
1. 最大流最小費用演算法
       假設一個超級源點和超級匯點,其中將整個網路設定反向。超級源點和所有的消費節點相連,連線邊的最大流量就是消費節點的消費流量;超級匯點和所有的網路節點相連,連線邊費用為零,如果該網路節點被選擇設定為伺服器連線點,則連街邊最大流為無窮大,否則為0。
       基於該假設可以選擇使用景點的最小費用最大流求解。但是因為執行時間有限,可以採用改進的spfa演算法進行運算,具體的實現思路和程式碼可以參考:
https://github.com/lanyangyang2631546/20170308minimum-cost-flow-in-maximum-flow

       後來還有效率更高的zkw演算法:https://github.com/sanshanxiashi/MCMF_zkw ;
2. 啟發式搜尋演算法
       採用啟發式搜尋演算法的目的就是尋找最優的網路節點掛載伺服器。
       大體看了一圈,貌似模擬退火的演算法要比遺傳演算法效果好,效率高;但是我們採用的是兄弟實驗室最新的成果:
       
       論文http://lamda.nju.edu.cn/yuy/GetFile.aspx?File=papers/aaai16-racos.pdf               在github上有一段大規模資料的優化演算法,適合用在大規模的資料上 3. 演算法的效能優化
       工程演算法和學術演算法不一致的地方就在於工程演算法更加註重演算法的效能優化,包括程式碼重構、迴圈剪枝等;
       還有一個提升效能的方法就是選擇合適的優化初始值,可以從直連節點進行比較篩選得到。

如果僅僅有1-3點還是不夠的,還需要從兩個方面進行考慮:
        一方面,需要對搜尋進行有效剪枝,避免在區域性最優陷入過長時間等等。
        另一方面,應當充分利用網路資訊進行啟發式搜尋,比如尋找相鄰的消費節點,訪問度數較低的節點合併入訪問度數高的節點等等。