環境
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畫出圖