📄 communities-complex.java.txt
字号:
/**
* Created on 2007-5-22
*
* @status
*/
package net.analysis;
import java.util.*;
/**
*
* 社区算法
*
*
* @author 袁韶谦
*
*/
public class Communities {
/**
* 计算当前网络社团分类方式的Newman模块化系数Q
* @param parts 网络的社团分类方式,社团编号从0开始
* @param part_number 社团的个数
* @param network
* @return 模块化系数Q
*/
public static double NewmanQ(int[] parts,int part_number,Network network){
double[][] e=new double[part_number][part_number];
for(int i=0;i<E.LENGTH;I++) if(nbrs[ni] ni="0;ni<nbrs.length;ni++){" for(int nbrs="net.n_neighbors(n);" int[] 初始化Q i="0;i<edges.length;i++){" n="((Integer)stack.remove()).intValue();" int m="net.getTotalEdges();" Q="0;" Network double[net.getNetworkSize()]; a="new" double[] int[net.getNetworkSize()]; Hidx="new" H="new" newmanQ="0;" double } community[i].add(i); HashSet(); community[i]="new" Set[net.getNetworkSize()]; community="new" Set[] net){ CNM(Network Set static public * 集合的元素为集合,其每一个集合代表一个社区,成员为相应节点idx @return net @param 社团分解,CNM算法 ** ret; return while... ret.add(newset); Integer(nbrs[i])); allnode.remove(new stack.add(nbrs[i]); newset.add(nbrs[i]); if(allnode.contains(nbrs[i])){ while(!stack.isEmpty()){ stack.add(seed); newset.add(seed); seed="((Integer)allnode.remove()).intValue();" LinkedList(); stack="new" LinkedList newset="new" while(!allnode.isEmpty()){ allnode="new" ret="new" partitions(Network (Note:这个函数与Partitions类中的函数一样) 可以通过Set2Array将其转换成数组 所有集合包含在返回集合中 每个联通区域表示为一个集合(成员为节点的Idx) 获取网络的连通区域 parts; cidx++; parts[ii]="cidx;" ii="((Integer)ito.next()).intValue();" while(ito.hasNext()){ ito="part.iterator();" Iterator part="(Set)it.next();" while(it.hasNext()){ it="comm.iterator();" cidx="0;" int[total]; parts="new" total+="part.size();" total="0;" comm){ Set2Array(Set comm 将集合的集合表示为数组,数组项表示原成员所属于的集合 Q; Q+="(e[i][i]-a[i]*a[i]);" for.... j="0;j<e[i].length;j++)e[i][j]=0;" a[i]="0;" double[part_number]; for..... if(pa!="pb)e[pb][pa]++;" e[pa][pb]++; pb="parts[edges[i].B_Idx];" pa="parts[edges[i].A_Idx];" edges="network.get_edge_array();" _Edge[]>i){
int idi=i;
int idj=nbrs[ni];
int ki=net.n_degree(idi);
int kj=net.n_degree(idj);
double deltaQ=1.0/(2.0*m)-(ki*kj)/(4.0*m*m);
Q.sete(nbrs[ni], i, deltaQ);
}//
}
}///for.......
for(int i=0;i<N;I++) ni="0;ni<nbrs.length;ni++){" for(int nbrs="Q.n_neighbors(i);" int[] i="0;i<n;i++){" int double a[i]="Q.n_degree(i)/(2.0*m);" if(tmpQ nbrs[ni]); tmpQ="Q.gete(i," maxidx="nbrs[0];" maxQ="0;" if(nbrs.length="=0)continue;" 初始化H 初始化a>maxQ){
maxQ=tmpQ;
maxidx=nbrs[ni];
}
}
H[i]=maxQ;
Hidx[i]=maxidx;
}//for...... //initialize H
while(true){
double maxH=0;
int maxHidx=0;
//先查找最大都H
for(int i=0;i<H.LENGTH;I++) if(H[i]>maxH){
maxH=H[i];
maxHidx=i;
}
if(maxH==0)break; //所有都H都为负值,搜索结束
newmanQ+=maxH;
int idi=maxHidx;
int idj=Hidx[idi];
//合并i和j
community[idj].addAll(community[idi]);
community[idi]=null; //删除i
Set updateH=new HashSet();
Set nbrs_i=Q.n_neighbors_S(idi);
Set nbrs_j=Q.n_neighbors_S(idj);
Iterator it=nbrs_j.iterator();
while(it.hasNext()){
int idk=((Integer)it.next()).intValue();
if(idk==idj)continue;
if(nbrs_i.contains(idk)){ //k同时和i、j相连
Q.sete(idj, idk, Q.gete(idj, idk)+Q.gete(idi, idk));
nbrs_i.remove(idk);
}else{ //k只和j相连
Q.sete(idj, idk, Q.gete(idj, idk)-2*a[idi]*a[idk]);
}
updateH.add(idk);
}//////////
it=nbrs_i.iterator();
while(it.hasNext()){
int idk=((Integer)it.next()).intValue();
if(idk==idj)continue;
//k只与i相连,不与j相连
Q.sete(idj, idk, Q.gete(idi, idk)-2*a[idj]*a[idk]);
updateH.add(idk);
}//////while..
int[] nbrs=Q.n_neighbors(idi);
for(int ni=0;ni<NBRS.LENGTH;NI++){ id=((Integer)it.next()).intValue(); ni="0;ni<nbrs.length;ni++){" for(int nbrs="Q.n_neighbors(id);" int double } while(it.hasNext()){ it="updateH.iterator();" if(tmpQ nbrs[ni]); tmpQ="Q.gete(id," maxidx="0;" maxQ="0;" if(nbrs.length="=0){" continue; H[id]="0;" 更新H updateH.add(idj); updateH.add(idi); 删除i那一行元素 0); nbrs[ni], Q.sete(idi,>maxQ){
maxQ=tmpQ;
maxidx=nbrs[ni];
}
}
H[id]=maxQ;
Hidx[id]=maxidx;
}//while(it.hasNext()) //UpdateH
a[idj]=a[idi]+a[idj]; //更新a
a[idi]=0;
}//while(true)
HashSet<SET> communities=new HashSet<SET>();
for(int i=0;i<COMMUNITY.LENGTH;I++) for(int int[] i="0;i<level;i++){" int Network } Set static public * @return net="nt.clone();" @param ** return part="partitions(net);" comm="Set2Array(part);" j="0;(j<step&&j<lball.length);j++)" _Edge[] 0); if(NewmanQ(comm,part.size(),nt) 计算当前得到的社团划分 lbets[maxi].B_Idx, net.sete(lbets[maxi].A_Idx, maxi="max_betweenness(lbets);" if(lbets.length="=0)break;" lbets="nbet.get_edge_array();" nbet="LinkBetweenness.calculate(net);" 逐步删除介数大的边 step="lball.length/level+1;" level){ preferedQ, nt,double GN_decomposition(Network level="nmQ.length;" preferedQ nt 采用GN算法得到社团分解 模块度Q nmQ[i]="NewmanQ(comm,part.size(),nt);" 得到的社团的个数 cmmc[i]="part.size();" cmmc){ nmQ,int[] nt,double[] void lball="LinkBetweenness.sorted_link_betweenness(nt);" lball[j].b_idx, net.sete(lball[j].a_idx, LinkBetweenness[] GN_decomposition_optimized(Network cmmc nmQ 获取GN分裂,得到的模块度曲线 communities; Q:?+newmanQ); System.out.println(?Newman if(community[i]!="null)communities.add(community[i]);">=preferedQ) //已经到达预先设定的Q值,返回
return part;
}
return null;
}
static int max_betweenness(_Edge[] lbets){
int maxi=0;
double maxb=0;
for(int i=0;i<LBETS.LENGTH;I++) if(lbets[i].weight>maxb){
maxi=i;
maxb=lbets[i].weight;
}
return maxi;
}
}
/**
* Created on 2007-5-22
*
* @status
*/
package net.analysis;
import java.util.*;
/**
*
* 社区算法
*
*
* @author 袁韶谦
*
*/
public class Communities {
/**
* 计算当前网络社团分类方式的Newman模块化系数Q
* @param parts 网络的社团分类方式,社团编号从0开始
* @param part_number 社团的个数
* @param network
* @return 模块化系数Q
*/
public static double NewmanQ(int[] parts,int part_number,Network network){
double[][] e=new double[part_number][part_number];
for(int i=0;ii){
int idi=i;
int idj=nbrs[ni];
int ki=net.n_degree(idi);
int kj=net.n_degree(idj);
double deltaQ=1.0/(2.0*m)-(ki*kj)/(4.0*m*m);
Q.sete(nbrs[ni], i, deltaQ);
}//
}
}///for.......
for(int i=0;imaxQ){
maxQ=tmpQ;
maxidx=nbrs[ni];
}
}
H[i]=maxQ;
Hidx[i]=maxidx;
}//for...... //initialize H
while(true){
double maxH=0;
int maxHidx=0;
//先查找最大都H
for(int i=0;imaxH){
maxH=H[i];
maxHidx=i;
}
if(maxH==0)break; //所有都H都为负值,搜索结束
newmanQ+=maxH;
int idi=maxHidx;
int idj=Hidx[idi];
//合并i和j
community[idj].addAll(community[idi]);
community[idi]=null; //删除i
Set updateH=new HashSet();
Set nbrs_i=Q.n_neighbors_S(idi);
Set nbrs_j=Q.n_neighbors_S(idj);
Iterator it=nbrs_j.iterator();
while(it.hasNext()){
int idk=((Integer)it.next()).intValue();
if(idk==idj)continue;
if(nbrs_i.contains(idk)){ //k同时和i、j相连
Q.sete(idj, idk, Q.gete(idj, idk)+Q.gete(idi, idk));
nbrs_i.remove(idk);
}else{ //k只和j相连
Q.sete(idj, idk, Q.gete(idj, idk)-2*a[idi]*a[idk]);
}
updateH.add(idk);
}//////////
it=nbrs_i.iterator();
while(it.hasNext()){
int idk=((Integer)it.next()).intValue();
if(idk==idj)continue;
//k只与i相连,不与j相连
Q.sete(idj, idk, Q.gete(idi, idk)-2*a[idj]*a[idk]);
updateH.add(idk);
}//////while..
int[] nbrs=Q.n_neighbors(idi);
for(int ni=0;nimaxQ){
maxQ=tmpQ;
maxidx=nbrs[ni];
}
}
H[id]=maxQ;
Hidx[id]=maxidx;
}//while(it.hasNext()) //UpdateH
a[idj]=a[idi]+a[idj]; //更新a
a[idi]=0;
}//while(true)
HashSet communities=new HashSet();
for(int i=0;i=preferedQ) //已经到达预先设定的Q值,返回
return part;
}
return null;
}
static int max_betweenness(_Edge[] lbets){
int maxi=0;
double maxb=0;
for(int i=0;imaxb){
maxi=i;
maxb=lbets[i].weight;
}
return maxi;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -