环境
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
可能pipFQ太慢,用镜像吧... 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://*.com/questions/26060423/how-to-construct-graphs-in-metis-for-python
http://blog.csdn.net/ztf312/article/details/47664515 (networkx画出图