1. 程式人生 > >2017華為演算法大賽總結

2017華為演算法大賽總結

題目介紹

給定一個網路圖,兩個網路節點之間存在頻寬限制和費用租賃資訊。任一網路節點可以當做伺服器或者消費節點。給定一部分網路節點為消費節點,消費節點有流量需求。消費節點的流量來自伺服器,伺服器可以位於任一網路節點。 部署伺服器有成本,滿足流量也需要成本。求在滿足消費節點需求的前提下,成本最小的伺服器部署方案。

演算法基礎

Dijstra演算法

一種貪心演算法,求一個節點到其他節點的最短路徑問題。
使用兩個陣列進行分別維護前置節點,最短路徑。
初始化時,把前置節點都置為-1,最短路徑為該節點到其他節點距離。
再使用一個flag陣列,標記節點是否已找到最短路徑。
每一次尋找到一個flag為flase的陣列,對其臨近節點進行最短距離更改。
直至所有的節點都為true,則演算法結束。

SPFA演算法

使用一個優先佇列,對節點進行入隊。入隊時,對節點標記為已訪問,出隊時,標記為未訪問。然後依次對列隊中的節點進行出隊操作,對每個節點相連線的節點進行鬆弛操作,如果被鬆弛節點不在佇列中,則進行入隊。如果已經在佇列中,則更改這個節點數值距離。

優勢

SPFA比較適合與稀疏圖,速度較快!稠密圖使用Dijstra

多源多匯費用流

新建一個超級消費節點,一個超級伺服器。每次尋找一條從超級消費節點到超級服務之間的最短路徑,即單位流量費用最小的一條路,在這條路上分配流量。分配完成之後,更改各個線路上的流量限制,使用新的網路節點圖再次進行最短路徑計算,直至消費節點的流量需求全部滿足。此時,則求出在滿足消費節點需求的前提下的最小費用。

尋找伺服器位置與個數

  1. 首先對伺服器位置與個數進行初始化。根據題目計算最小成本可得,當某個消費節點需求量較大時,直接把伺服器部署在該消費節點,可以省去大量的流量租賃費用。因此,使用貪心演算法,對消費節點按流量需求進行從小到大排序。初始化時,把所有消費節點都部署伺服器,然後依次減去伺服器,當成本減小時,則去掉部署在該位置伺服器,如果沒有減小成本,則保留在該消費節點的伺服器。
  2. 完成初始化後,設計遺傳演算法進行迭代尋找最佳部署方案,即最小成本。
    初始種群個數為10個,第一步初始化的部署方案作為一個個體放在初始種群中。其餘個體進行隨機初始化。交叉操作採用單點交叉,交叉概率設為0.8。變異時,隨機選取一個部署有伺服器的節點,向相鄰節點移動。變異概率為0.2。 採用精英保留策略,每次保留2個最優子個體到下一代中。