/**
* Created on 2007-4-9
*
* @status
*/
package net.analysis;
import java.util.*;
import net.utility.*;
/**
* @author 袁韶谦
*
* 计算最小距离和介数
*
* 只能处理数组形式的网络
*
*
*/
public class Betweenness {
public static int MAX_INT=999999999;
/**
* 得到网络任意两个节点间的最短路径
* @param net 网络的邻接矩阵
* @return 最短路径矩阵
*/
public static int[][] get_minimum_distance(int[][] net){
int[][] md=new int[net.length][net[0].length];
for(int i=0;i<NET.LENGTH;I++) if(md[i][j] j="0;j<net.length;j++){" for(int i="0;i<net.length;i++)" k="0;k<net.length;k++)" Floyed算法 初始化 } if(i="=j)md[i][j]=0;" md[i][j]="MAX_INT;" else if(net[i][j]="=0)">(md[i][k]+md[k][j])){
md[i][j]=md[i][k]+md[k][j];
}
return md;
}
//并行支持的最大线程个数
private final static int MAX_THREAD_NUMBER=2;
/**
* 计算介数,多线程版本
* @param n
* @return
*/
public static double[] ub_betweenness_parallel(Network n){
double CB[]=new double[n.getNetworkSize()];
for(int i=0;i<CB.LENGTH;I++)CB[I]=0; for(int i="0;i<pb.length-1;i++){" if(cidx cidx++; cidx+="istep;" ParallelBetweenness(n,cidx,cidx+istep); pb[i]="new" istep="n.getNetworkSize()/MAX_THREAD_NUMBER;" int 节点序号 cidx="0;" ParallelBetweenness[MAX_THREAD_NUMBER]; pb="new" ParallelBetweenness[] 创建并行对象数组 sleepcount="(n.getNetworkSize()/MAX_THREAD_NUMBER);" long>=n.getNetworkSize()){
Debug.outn("-_-!!");
}
}
pb[MAX_THREAD_NUMBER-1]=new ParallelBetweenness(n,cidx,n.getNetworkSize()-1); //最后一个并行对象
int cpbx=0; //当前的并行对象
int stopcount=0;
while(true){
if(pb[cpbx]==null){ //这个对象还是空的,则直接创建新的运行对象
}else if(pb[cpbx].be_done()){ //这个对象是停止着的
double[] dtao=pb[cpbx].get_result();
if(dtao!=null) //如果包含有效的结果,则累加到最终结果上
for(int i=0;i<CB.LENGTH;I++)CB[I]+=DTAO[I]; } if(stopcount 停止计数加一 stopcount++; pb[cpbx]="null;" pb[cpbx].stop(); Debug.out(?见鬼了吗??); else{>=pb.length)break; //已经计算完成,返回
}else{ //这个对象正在进行计算
try{
Thread.sleep(sleepcount); //休眠一会
}catch(InterruptedException ie){}
}
cpbx++; //转到下一个对象
if(cpbx==pb.length)cpbx=0;
}///while true
return CB;
}
/**
* 计算介数
* 采用Ulrik Brandes的快速介数算法
* @param ne
* @return
*/
public static double[] ub_betweenness(Network n){
double CB[]=new double[n.getNetworkSize()];
for(int i=0;i<CB.LENGTH;I++)CB[I]=0; for(int i="0;i<CB.length;i++)CB[i]+=dtao[i];" } if(sidx sidx){ n,int ub_dependencies(Network double[] static public * @return sidx @param n Brandes的快速介数算法 采用Ulrik 计算单一节点的单点介数,实际介数等于所有节点的单点数之和 ** CB; return dtao="ub_dependencies(n,idx);" idx="0;idx<n.getNetworkSize();idx++){">=n.getNetworkSize())return null; //错误的节点序号
Stack<INTEGER> S=new Stack<INTEGER>(); //Stack
Set<INTEGER>[] P=new Set[n.getNetworkSize()];
int[] count=new int[n.getNetworkSize()];
double[] d=new double[n.getNetworkSize()];
Queue<INTEGER> Q=new LinkedList<INTEGER>(); //Queue
double[] dtao=new double[n.getNetworkSize()];
//初始化
for(int i=0;i<P.LENGTH;I++)P[I]=NEW HashSet<Integer>();
for(int i=0;i<COUNT.LENGTH;I++)COUNT[I]=0; for(int i="0;i<d.length;i++)d[i]=-1;" while(Q.size() Q.add(sidx); d[sidx]="0;" count[sidx]="1;">0){
int v=Q.remove();
S.push(v);
int[]nbrs=n.n_neighbors(v);
for(int i=0;i<NBRS.LENGTH;I++){ class="" j="0;j<v_dep_result.length;j++)" for(int i="0;i<dtao.length;i++)dtao[i]/=2;" } int double[] public * @return ** return pre < v_dep_result; private v_sync; Object v_idx_end; v_idx_start; v_net; Network 标志当前的运行状态 v_running; boolean v_running="true;" 累加临时结果 v_dep_result[j]+="dtao[j];" i); double[]dtao="Betweenness.ub_dependencies(v_net," 最大优先级 setPriority(Thread.MAX_PRIORITY); run(){ void 还未计算完毕,返回null null; if(v_running)return get_result(){ !v_running; be_done(){ 用来判断运算是否已经完成 be_running(){ this.start(); double[net.getNetworkSize()]; v_dep_result="new" v_idx_end="ixE;" v_idx_start="ixS;" v_net="net;" ixE){ ixS,int net,int ParallelBetweenness(Network v_sync="sync;" this(net,ixS,ixE); sync){ ixE,Object Thread{ extends ParallelBetweenness 当然调用者需要多次创建对象,花费一定额外的系统资源 这样做的目的是想省去烦人的、又容易出现各种错误的同步过程 运算之后就可以销毁了 一次性对象,创建一次只能执行一个运算 袁韶谦 @author dtao; if(!((n.getNetworkType()&Network.NTYPE_DIRECTED)="=Network.NTYPE_DIRECTED)){" S empty not while dtao[v]="dtao[v]+(count[v]/count[w])*(1+dtao[w]);" v while(it.hasNext()){ it="P[w].iterator();" Iterator w="nbrs[i];" while(!S.empty()){ Q of neighbor each for P[w].add(v); count[w]="count[w]+count[v];" if(d[w]="=(d[v]+1)){" d[w]="d[v]+1;" Q.add(w); if(d[w]<0){>
<SCRIPT src="/inc/gg_read2.js"></SCRIPT>
没有合适的资源?快使用搜索试试~ 我知道了~
这个文件是复杂网络的介数介绍的一些细节
共1个文件
txt:1个
4星 · 超过85%的资源 需积分: 10 33 下载量 31 浏览量
2009-09-12
12:01:23
上传
评论 1
收藏 2KB RAR 举报
温馨提示
这个文件是复杂网络的介数介绍的一些细节。-This document is referred to a number of complex networks, introduced some of the details.
资源推荐
资源详情
资源评论
收起资源包目录
between-newnetworks.rar (1个子文件)
between-newnetworks.txt 6KB
共 1 条
- 1
资源评论
- sushuqingjun126com2013-05-13java代码实现的介数计算
- 落英玉petalgem2013-02-27就是一些基本介绍
- 倪豪2013-02-25还好吧 有点用
- jiajiamuye2013-08-20关于介数的计算,帮助不大。
- anqinghu2012-09-11说实话,用处不是很大。。。。。
limaolin1981611
- 粉丝: 0
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功