python环境下使用METIS

时间:2023-02-01 23:53:13

环境

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)无权重图

以下图为例

python环境下使用METIS

用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)带权重图

以下图为例 蓝色数字为边权重

python环境下使用METIS

参数为三个一维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画出图