1.基礎力導向算法
1.1算法模型
FR算法模型創建在粒子物理理論的基礎上,將無向圖的節點模擬成原子,經過模擬原子間的力場來計算節點間的相對位置。該模型假設任意兩個節點間存在斥力,相互鏈接的兩個節點間存在引力。經過模擬節點間的相互做用力,計算獲得節點的速度和偏移量,通過不斷的迭代計算,最終達到一種動態平衡的狀態。
1.2算法思路
(1)計算任意兩點間的相互斥力。
(2)計算有邊鏈接的節點間的相互引力。
(3)根據節點所受的協力計算速度,將速度轉化爲節點位置偏移量,此時注意經過最大偏移量限制移動距離,防止偏移過大沒法收斂。
(4)根據偏移量計算每個節點的位置。
(5)通過屢次迭代,最終達到動態平衡,節點位置近似不變。
1.3僞代碼
2.改進1:引入模擬退火算法優化結束條件
2.1引入模擬退火算法的緣由
在基礎力導向算法中,因爲迭代次數是外部指定的參數。在不一樣拓撲結構的無向圖而言,達到收斂的迭次次數不一樣。若是迭代次數過大,相應的計算耗時也會這增長,存在一些多餘的迭代過程。若是迭代次數太小,此時算法尚未收斂,會致使節點分佈不均衡,效果不理想。所以,須要引入一種機制來控制算法迭代終止的條件。
2.2模擬退火算法
模擬退火算法來源於固體退火原理,即高溫狀態的固體漸漸冷卻,固體內部粒子動能逐漸變小,最終在常溫狀態下達到平衡,此時動能最小。在模擬退火算法有一個溫度的概念,「溫度」從一個初值逐漸減少爲0,與此同時限制節點的最大偏移量也逐漸減少,最終達到在恰當時機控制算法終止的目的。
2.3僞代碼
3.改進2:引入Barneshut算法優化計算性能
3.1引入Barneshut算法的緣由
對於採用了模擬退火算法的力導向算法,已知其時間複雜度爲O(k * (n*n+m)),在節點和邊數量級比較大時,存在較大的性能瓶頸,會致使畫面佈局時間等待過長問題。所以,須要對該算法進行性能優化。
3.2Barneshut算法
Barneshut算法主要思想是根據節點位置距離創建一顆樹,將鄰近多個的節點當作一個超級節點,從而減小了斥力計算環節中須要計算任意兩點間的斥力的複雜度,這部分的時間複雜度由O(n*n)降爲了O(n*logn),最終引入Barneshut算法後使得力導向算法的時間複雜度降爲O(k*(n*logn+m))。
Barneshut算法是很巧妙的方法,將鄰近區域的節點分組合並,普遍用於n-body仿真。它遞歸地將節點集合存儲在四叉樹結構中。頂點表明整個區域,它的質量爲全部節點質量之和,它的位置爲全部子節點的質心位置。這個算法之因此快是由於咱們不須要去計算每個組body裏面的節點。
Barneshut算法步驟:
(1)建立根節點body,不斷地按節點位置將全部節點劃分到body的四個象限,由此創建樹結構。
(2)遍歷計算每個節點與樹結構之間的斥力,若當前節點的位置與樹結構body節點的質心位置足夠遠(s/d<0.5),則將全部的做用力施加於根節點上;若不足夠遠,則遞歸地計算當前節點與body節點的子節點的斥力。
圖1 創建Barneshut樹結構
參考資料:
COS 126 Programming Assignment BarnesHut Galaxy Simulator