python環境下使用METIS


環境

ubuntu 14.04

python 2.7

順便說下我windows下裝了anaconda都裝不成功....只好轉戰ubuntu

 

配置

關於METIS有兩個庫 -  PyMetis & metis

按照PYPI里的說法,pymetis中包含了METIS,而metis只是個wrapper 需要自己單獨給METIS配環境變量。

所以肯定是用pymetis啦, 而且我pip裝不了metis..說是找不到這個庫了... 可能用pymetis替代了吧

既然是圖割,順便再裝networkx庫吧。

sudo pip install pymetis
sudo pip install networkx

可能pip翻牆太慢,用鏡像吧... pip install -i http://<mirror>/simple <package>

 

使用METIS

 part_graph(nparts, adjacency=None, xadj=None, adjncy=None, vweights=None, eweights=None, recursive=None)

這個函數就是用來分割圖的,假設有n個點,編號從0~(n-1)

nparts:聚類數

傳入adjancy matrix的方法

(1)無權重圖

以下圖為例

用list即可,共n行,每行是與i點相連的點編號,如

D=[[1,2,3],
   [0,4],
   [0],
   [0],
   [1,5,6,7],
   [4],
   [4],
   [4]]

(edgecuts,parts)=pymetis.part_graph(nparts=2,adjacency=D)

 

(2)帶權重圖

以下圖為例 藍色數字為邊權重

參數為三個一維list - adjncy. xadj. eweights

adjncy: 表示與每個節點相連的節點編號   [1,2  ,  0,3  ,  0,3  ,  1,2]

xadj:表示adjncy的每個節點開始與結束位置(結束位置不包含)   [0,2,4,6,8] . 這樣就表示0~2為節點0相連的節點,2~4為節點1相連的節點...

eweights: 與adjncy一一對應表示邊權重,必須是整數。 [1,5,1,5,5,1,5,1]

則代碼為

adj=[1,2,0,3,0,3,1,2]
xadj=[0,2,4,6,8]
w=[1,5,1,5,5,1,5,1]
(edgecuts,parts)=pymetis.part_graph(nparts=2,adjncy=adj,xadj=xadj,eweights=w)


返回值為(cutcount, part_vert)

cutcount為Int 表示cut的邊數

part_vert為長度為n的list . 表示每個節點所屬的聚類編號。

 

參考:

http://metis.readthedocs.io/en/latest/

http://stackoverflow.com/questions/26060423/how-to-construct-graphs-in-metis-for-python

http://blog.csdn.net/ztf312/article/details/47664515   (networkx畫出圖

 


免責聲明!

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



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