力導向算法的研究與改進


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM