精华内容
下载资源
问答
  • 使用 Java 测试网络连通性的几种方法
    千次阅读
    2021-01-12 20:28:25

    目录

    概述

    简单判断两台机器的可达性

    清单 1:简单判断两台机器的可达性

    指定本地和远程网络地址,判断两台机器之间的可达性

    程序清单 2:指定本地地址和远程地址,判断两台机器之间的可达性

    IPv4 和 IPv6 混合网络下编程

    程序清单 3: 判断本地地址和远程地址是否同为 IPv4 或者 IPv6

    程序清单 4:跳过本地地址和 LinkLocal 地址

    结束语


    概述

    在网络编程中,有时我们需要判断两台机器之间的连通性,或者说是一台机器到另一台机器的网络可达性。在系统层面的测试中,我们常常用 Ping 命令来做验证。尽管 Java 提供了比较丰富的网络编程类库(包括在应用层的基于 URL 的网络资源读取,基于 TCP/IP 层的 Socket 编程,以及一些辅助的类库),但是没有直接提供类似 Ping 命令来测试网络连通性的方法。本文将介绍如何通过 Java 已有的 API,编程实现各种场景下两台机器之间的网络可达性判断。在下面的章节中,我们会使用 Java 网络编程的一些类库 java.net.InetAddress 和 java.net.Socket,通过例子解释如何模拟 Ping 命令。

    简单判断两台机器的可达性

    一般情况下,我们仅仅需要判断从一台机器是否可以访问(Ping)到另一台机器,此时,可以简单的使用 Java 类库中 java.net.InetAddress 类来实现,这个类提供了两个方法探测远程机器是否可达

    boolean isReachable(int timeout) // 测试地址是否可达 boolean
    isReachable(NetworkInterface netif, int ttl, int timeout) // 测试地址是否可达.
    

    显示更多

    简单说来,上述方法就是通过远端机器的 IP 地址构造 InetAddress 对象,然后调用其 isReachable 方法,测试调用机器和远端机器的网络可达性。注意到远端机器可能有多个 IP 地址,因而可能要迭代的测试所有的情况。

    清单 1:简单判断两台机器的可达性

      public static void isAddressAvailable(String ip) {
            try {
                InetAddress address = InetAddress.getByName(ip);//ping this ip
    
                if (address instanceof java.net.Inet4Address) {
                    System.out.println(ip + " is ipv4 address");
                } else if (address instanceof java.net.Inet6Address) {
                    System.out.println(ip + " is ipv6 address");
                } else {
                    System.out.println(ip + " is unrecongized");
                }
    
                if (address.isReachable(5000)) {
                    System.out.println("SUCCESS - ping " + ip + " with no interface specified");
                } else {
                    System.out.println("FAILURE - ping " + ip + " with no interface specified");
                }
    
                System.out.println("\n-------Trying different interfaces--------\n");
    
                Enumeration<NetworkInterface> netInterfaces = NetworkInterface.getNetworkInterfaces();
                while (netInterfaces.hasMoreElements()) {
                    NetworkInterface ni = netInterfaces.nextElement();
                    System.out.println(
                            "Checking interface, DisplayName:" + ni.getDisplayName() + ", Name:" + ni.getName());
                    if (address.isReachable(ni, 0, 5000)) {
                        System.out.println("SUCCESS - ping " + ip);
                    } else {
                        System.out.println("FAILURE - ping " + ip);
                    }
    
                    Enumeration<InetAddress> ips = ni.getInetAddresses();
                    while (ips.hasMoreElements()) {
                        System.out.println("ip: " + ips.nextElement().getHostAddress());
                    }
                    System.out.println("-------------------------------------------");
                }
            } catch (Exception e) {
                System.out.println("error occurs.");
                e.printStackTrace();
            }
        }

    从上可以看出 isReachable 的用法,可以不指定任何接口来判断远端网络的可达性,但这不能区分出数据包是从那个网络接口发出去的 ( 如果本地有多个网络接口的话 );而高级版本的 isReachable 则可以指定从本地的哪个网络接口测试,这样可以准确的知道远端网络可以连通本地的哪个网络接口。

    但是,Java 本身没有提供任何方法来判断本地的哪个 IP 地址可以连通远端网络,Java 网络编程接口也没有提供方法来访问 ICMP 协议数据包,因而通过 ICMP 的网络不可达数据包实现这一点也是不可能的 ( 当然可以用 JNI 来实现,但就和系统平台相关了 ), 此时可以考虑本文下一节提出的方法。

    指定本地和远程网络地址,判断两台机器之间的可达性

    在某些情况下,我们可能要确定本地的哪个网络地址可以连通远程网络,以便远程网络可以回连到本地使用某些服务或发出某些通知。一个典型的应用场景是,本地启动了文件传输服务 ( 如 FTP),需要将本地的某个 IP 地址发送到远端机器,以便远端机器可以通过该地址下载文件;或者远端机器提供某些服务,在某些事件发生时通知注册了获取这些事件的机器 ( 常见于系统管理领域 ),因而在注册时需要提供本地的某个可达 ( 从远端 ) 地址。

    虽然我们可以用 InetAddress.isReachabl 方法判断出本地的哪个网络接口可连通远程玩过,但是由于单个网络接口是可以配置多个 IP 地址的,因而在此并不合适。我们可以使用 Socket 建立可能的 TCP 连接,进而判断某个本地 IP 地址是否可达远程网络。我们使用 java.net.Socket 类中的 connect 方法

    void connect(SocketAddress endpoint, int timeout)//使用Socket连接服务器,指定超时的时间
    

    这种方法需要远程的某个端口,该端口可以是任何基于 TCP 协议的开放服务的端口(如一般都会开放的 ECHO 服务端口 7, Linux 的 SSH 服务端口 22 等)。实际上,建立的 TCP 连接被协议栈放置在连接队列,进而分发到真正处理数据的各个应用服务,由于 UDP 没有连接的过程,因而基于 UDP 的服务(如 SNMP)无法在此方法中应用。

    具体过程是,枚举本地的每个网络地址,建立本地 Socket,在某个端口上尝试连接远程地址,如果可以连接上,则说明该本地地址可达远程网络。

    程序清单 2:指定本地地址和远程地址,判断两台机器之间的可达性

    void printReachableIP(InetAddress remoteAddr, int port) throws IOException {
            String retIP = null;
    
            Enumeration<NetworkInterface> netInterfaces;
            try {
                netInterfaces = NetworkInterface.getNetworkInterfaces();
                while (netInterfaces.hasMoreElements()) {
                    NetworkInterface ni = netInterfaces.nextElement();
                    Enumeration<InetAddress> localAddrs = ni.getInetAddresses();
                    while (localAddrs.hasMoreElements()) {
                        InetAddress localAddr = localAddrs.nextElement();
                        if (isReachable(localAddr, remoteAddr, port, 5000)) {
                            retIP = localAddr.getHostAddress();
                            break;
                        }
                    }
                }
            } catch (SocketException e) {
                System.out.println(
                        "Error occurred while listing all the local network addresses.");
            }
            if (retIP == null) {
                System.out.println("NULL reachable local IP is found!");
            } else {
                System.out.println("Reachable local IP is found, it is " + retIP);
            }
        }
    
        boolean isReachable(InetAddress localInetAddr, InetAddress remoteInetAddr,
                            int port, int timeout) throws IOException {
    
            boolean isReachable = false;
            Socket socket = null;
            try {
                socket = new Socket();
                // 端口号设置为 0 表示在本地挑选一个可用端口进行连接
                SocketAddress localSocketAddr = new InetSocketAddress(localInetAddr, 0);
                socket.bind(localSocketAddr);
                InetSocketAddress endpointSocketAddr =
                        new InetSocketAddress(remoteInetAddr, port);
                socket.connect(endpointSocketAddr, timeout);
                System.out.println("SUCCESS - connection established! Local: " +
                        localInetAddr.getHostAddress() + " remote: " +
                        remoteInetAddr.getHostAddress() + " port" + port);
                isReachable = true;
            } catch (IOException e) {
                System.out.println("FAILRE - CAN not connect! Local: " +
                        localInetAddr.getHostAddress() + " remote: " +
                        remoteInetAddr.getHostAddress() + " port" + port);
            } finally {
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        System.out.println("Error occurred while closing socket..");
                    }
                }
            }
            return isReachable;
        }

    IPv4 和 IPv6 混合网络下编程

    当网络环境中存在 IPv4 和 IPv6,即机器既有 IPv4 地址,又有 IPv6 地址的时候,我们可以对程序进行一些优化,比如

    • 由于 IPv4 和 IPv6 地址之间是无法互相访问的,因此仅需要判断 IPv4 地址之间和 IPv6 地址之间的可达性。
    • 对于 IPv4 的换回地址可以不做判断,对于 IPv6 的 Linklocal 地址也可以跳过测试
    • 根据实际的需要,我们可以优先考虑选择使用 IPv4 或者 IPv6,提高判断的效率

    程序清单 3: 判断本地地址和远程地址是否同为 IPv4 或者 IPv6

    // 判断是 IPv4 还是 IPv6 if(!((localInetAddr
                    instanceofInet4Address) && (remoteInetAddr instanceofInet4Address)
                    || (localInetAddr instanceofInet6Address) && (remoteInetAddr
                    instanceofInet6Address))){ // 本地和远程不是同时是 IPv4 或者 IPv6,跳过这种情况,不作检测 break; }
    

    程序清单 4:跳过本地地址和 LinkLocal 地址

    if( localAddr.isLoopbackAddress() ||
                    localAddr.isAnyLocalAddress() || localAddr.isLinkLocalAddress() ){ // 地址为本地环回地址,跳过
                    break; }
    

    结束语

    本文列举集中典型的场景,介绍了通过 Java 网络编程接口判断机器之间可达性的几种方式。在实际应用中,可以根据不同的需要选择相应的方法稍加修改即可。对于更加特殊的需求,还可以考虑通过 JNI 的方法直接调用系统 API 来实现,能提供更加强大和灵活的功能,这里就不再赘述了。

    原文链接: https://developer.ibm.com/zh/languages/java/articles/j-lo-connectiontest/

    更多相关内容
  • 计算网络节点模块内连通度和模块间连通度是复杂网络分析的重要组成。我们可以通过分析节点的模块内连通度和模块间连通度来对节点的重要进行度量,具有较低的模块内连通度和模块间连通度的节点的重要则相对较低。
  • 在这篇文章中,考虑一个资源配置问题--节点配置(在有限的网络位置中,选择若干位置放置节点,且放置节点的总费用最小),同时放置节点的位置构成的网络可以保持网络连通性。对于这样类型的问题建立一个数学优化模型...
  • 无线传感器网络中基于节点连通性的机会路由.pdf
  • 为了更好地解决无线传感器网络节点定位精度和锚节点数目之间的矛盾,提出一种基于连通性的移动锚节点定位算法。首先,对网络节点的覆盖特性进行分析,发现锚节点移动步长与通信半径之间存在临界值,在此临界值周围...
  • 为了在计算网络连通性时将网络中各节点和链路的毁伤概率考虑在内,提出了一种基于毁伤概率的节点网络连通性算法。介绍了通过消除关联矩阵内的中间节点来获取节点间路由的方法,提出了节点间不连通故障组的概念,并...
  • 研究传感器节点随机部署于监测区域内, 无节点地理位置信息情况下, 如何能量有效地保证网络的通信连通与感知覆盖; 节点采用基于概率的联合感知模型。提出CDS-based SSCA算法, 其为一种基于连通支配集构造树的节点调度...
  • 连通性修复是保证网络有效性、可靠性的重要手段,而目前关于1-连通性修复的...将费马点、三角剖分与最小生成树有效结合,设计了一种基于费马点的网络连通性修复策略,并且从理论上证明了该策略的近似比和复杂度分别为
  • 为了更加科学合理地确定公路网络的布局,在现有连通性计算方法的基础上,提出考虑节点对间连接的重要性不同作为节点网络可靠连接的影响因素对公路交通网络布局进行优化。以网络加权连通度为目标,并考虑连接效率及...
  • 对于随机部署在监测区域的无线传感器网络节点连通性的研究是其后续研究、管理和应用的基础,针对在实际应用中,节点随机部署而可能出现与基站不能正常通信的问题,提出了一种使用与基站连通的节点作为代理解决基站不...
  • 分析了边界节点的连通性和网络的整体连通性,而后通过仿真研究,分析了存在边界节点与消除边界效应后的网络连通度分布、连通度期望和网络是k点连通的概率,从而说明了边界节点对无线传感器网络连通性的影响。
  • 针对同时考虑节点和边单元失效的一般赋权网络,提出了一种考虑节点失效网络连通可靠计算的Monte Carlo随机模拟算法.Monte Carlo随机模拟方法包含单元状态抽样、网络...
  • 认知无线电自组织网络中两个节点连通性
  • 该方法根据Ad hoc网络信息传播特点,给出Ad hoc网络连通性定义,提出一种新的最短距离计算方法求解网络连通性,达到降低算法时间复杂度的目的,最后根据节点删除后对网络连通性造成的破坏程度对节点进行关键性排序。...
  • 研究传感器节点随机部署于监测区域内, 无节点地理位置信息情况下, 如何能量有效地保证网络的通信连通与感知覆盖; 节点采用基于概率的联合感知模型。提出CDS-based SSCA算法, 其为一种基于连通支配集构造树的节点调度...
  • 网络游戏-提高量子通信网络连通性的纠缠粒子对分发节点部署方法.zip
  • 为解决考虑端口连通性限制的路由与波长分配问题,建立了其整数线性规划(ILP)模型,并提出了3种考虑端口连通性(IPCA)的动态路由机制,包括基于K最短路(KSP)的IPCA(IPCA-KSP)机制、IPCA-Dijkstra机制与全路径搜索机制...
  • 为改善车辆传感器网络的实时连通性问题,提出一种路边节点梯度值可滑动的定向扩散梯度场DDGF-SRG,并给出了梯度场的实时动态调整规则。通过给路边节点分配固定梯度值,将规模巨大车辆传感器网络划分成若干以路边节点...
  • 复杂网络连通性

    2021-09-01 10:51:11
    许多实际的大规模复杂网络都是不连通的,但是往往会存在一个特别大的连通片,它包含了整个网络中相当比例的节点,这一连通片称为巨片。如下图所示 一些关于网络拓扑性质的研究往往是针对巨片来研究的。 二、有向...

    一、无向网络中的巨片

    许多实际的大规模复杂网络都是不连通的,但是往往会存在一个特别大的连通片,它包含了整个网络中相当比例的节点,这一连通片称为巨片。如下图所示
    在这里插入图片描述
    一些关于网络拓扑性质的研究往往是针对巨片来研究的。

    二、有向网络中的蝴蝶结结构

    实际的大规模有向网络往往既不是强连通也不是弱连通的,但是许多有向网络往往有一个包含了网络中相当部分节点的很大的弱连通片,称为弱连通巨片。这一弱连通巨片又往往具有一种包含4个部分的蝴蝶结结构。
    在这里插入图片描述
    (1)强连通核( Strongly connected core, SCC):也称为强连通巨片,它位于网络的中心。SCC中任意两个节点之间都是强连通的,即存在从任一节点到另一节点的有向路径。
    (2)入部(IN):包含那些可以通过有向路径到达SCC但不能从SCC到达的节点。也就是说,一定存在从IN中任一节点到SCC中任一节点的有向路径;反之,从SCC中任一节点出发沿着有向边都无法到达IN中的一个节点。
    (3)出部(OUT):包含那些可以从SCC通过有向路径到达但不能到达SCC的节点。也就是说,一定存在从SCC中任一节点到OUT中任一节点的有向路径;反之,从OUT中任一节点出发沿着有向边都无法到达SCC中的一个节点。从IN中任一节点到OUT中任一节点必然存在有向路径,而且该路径必经过SCC中的某些节点。
    (4)卷须(Tendrils) :包含那些既无法到达SCC也无法从SCC到达的节点。对于挂在IN上的任一卷须节点,必至少存在一条从IN中某一节点到该节点的不需经过SCC的有向路径;对于挂在OUT上的任一卷须节点,必至少存在一条从该节点到OUT中某一节点的不需经过SCC的有向路径。此外,还有可能存在从挂在IN上的卷须节点到挂在OUT上的卷须节点的不经过SCC的有向路径,这些串在一起的卷须节点称为管子(Tube)。

    展开全文
  • 通过仿真模拟方法,对网络理论模型和实际复杂网络分别进行研究,采用逐步移除节点和重复计算的方式,考察网络最大连通子图和节点移除比例的关系,同时对数值仿真结果进行合理分析。研究结果表明,基于网络全局信息的...
  • 节点位置无关的无线传感器网络连通性部分覆盖协议
  • 对于多类型用户节点,根据泊松分布的认知无线电模型,从理论上给出具有多类型次用户节点网络连通性的必要条件。其中,多类型次用户节点之间通信链路的存在与否不仅取决于它们之间的距离,也跟周围邻居用户节点的...
  • 考虑网络发生级联失效前后,节点负载量和网络连通性的变化情况,提出一种基于级联失效的有向无标度网络节点重要度评价模型。首先建立有向网络级联失效模型,推导出节点失效前承担的负载量,然后结合节点负载与其在...
  • 我们可以通过了解节点的模块内连通度和模块间连通度来对节点的重要进行度量,具有较低的模块内连通度和模块间连通度的节点的重要则相对较低。

    1.为什么要计算网络节点模块内连通度和模块间连通度

      我们可以通过了解节点的模块内连通度和模块间连通度来对节点的重要性进行度量,具有较低的模块内连通度和模块间连通度的节点的重要性则相对较低,具体划分如下表(其中 Z i Z_i Zi为节点i的模块内连通度的z-scores, P i P_i Pi为根据节点i的模块间连通度计算的参与系数,participation coefficient):

    Z i Z_i Zi< 2.5 Z i Z_i Zi > 2.5
    P i P_i Pi < 0.62peripheralsmodular hubs
    P i P_i Pi > 0.62connectorsnetwork hubs
    Z i Z_i Zi < 2.5 Z i Z_i Zi > 2.5
    P i P_i Pi < 0.62不重要的节点key species
    P i P_i Pi > 0.62key specieskey species

    2.网络节点模块内连通度(within modular degree)和模块间连通度(among modular degree)计算公式

    模块内连通度z-scores计算公式:
    Z i = K i − K s i ‾ σ K s i Z_i = \frac{K_i - \overline{K_{s_i}}}{\sigma_{K_{s_i}}} Zi=σKsiKiKsi
    其中,
    Z i Z_i Zi为节点 i 模块内连通度的z-scores;
    K i K_i Ki为节点 i 模块内连通度;
    K s i ‾ \overline{K_{s_i}} Ksi为节点 i 所在模块 s 所有节点的 K i K_i Ki的平均值;
    σ K s i \sigma_{K_{s_i}} σKsi为节点 i 所在模块 s 所有节点的模块内连通度的标准差。

    模块间连通度参与系数的计算公式:
    P i = 1 − ∑ s = 1 N m ( K i s K i ) 2 P_i =1- \sum_{s=1}^{N_m}(\frac{K_{is}}{K_i})^2 Pi=1s=1Nm(KiKis)2
    其中,
    P i P_i Pi为节点 i 的参与系数;
    N m N_m Nm为模块数,number of modular;
    s s s 表示模块 s s s
    K i K_i Ki为节点 i 模块内连通度;
    K i s K_{is} Kis为节点 i 在各个模块中的连通度;

    3.计算代码及注释

    测试数据及源代码可参考:
    计算网络节点模块内连通度和模块间连通度R代码及测试数据
    更多R语言分析微生物生态学的资源可参考如下链接:
    https://mianbaoduo.com/o/bread/mbd-YpmTlZpr

    #该代码参考自:https://github.com/cwatson/brainGraph/blob/master/R/vertex_roles.R
    #g表示graph文件,其中graph的节点含有modular属性;
    #也就是说,使用下面的函数计算前请先计算各节点的模块属性,并将其赋值给节点
    #wtc <- cluster_louvain(igraph,NA)
    #modularity(wtc)
    #V(igraph)$module<-membership(wtc)
    
    #计算模块内连接度的z-scores
    within_module_deg_z_score <- function(g, A=NULL, weighted=FALSE) {
      stopifnot(is_igraph(g))
      if (is.null(A)) {
        if (isTRUE(weighted)) {
          A <- as_adj(g, sparse=FALSE, names=TRUE, attr='weight')
        } else {
          A <- as_adj(g, sparse=FALSE, names=TRUE)
        }
      }
      memb <- vertex_attr(g, "module")
      N <- max(memb)
      nS <- tabulate(memb)
      z <- Ki <- rep.int(0, dim(A)[1L])
      Ksi <- sigKsi <- rep.int(0, N)
      names(z) <- names(Ki) <- rownames(A)
      for (S in seq_len(N)) {
        x <- rowSums(A[memb == S, memb == S])
        Ki[memb == S] <- x
        Ksi[S] <- sum(x) / nS[S]
        sigKsi[S] <- sqrt(sum((x - Ksi[S])^2) / (nS[S]-1))
      }
      z <- (Ki - Ksi[memb]) / sigKsi[memb]
      z[is.infinite(z)] <- 0
      df <- data.frame(Ki,z,row.names = names(Ki))
      return(df)
    }
    
    #计算节点的参与系数
    part_coeff <- function(g, A=NULL, weighted=FALSE) {
      stopifnot(is_igraph(g))
      if (is.null(A)) {
        if (isTRUE(weighted)) {
          A <- as_adj(g, sparse=FALSE, attr='weight')
        } else {
          A <- as_adj(g, sparse=FALSE)
        }
      }
      memb <- vertex_attr(g, "module")
      Ki <- colSums(A)
      N <- max(memb)
      Kis <- t(rowsum(A, memb))
      pi <- 1 - ((1 / Ki^2) * rowSums(Kis^2))
      names(pi) <- rownames(A)
      return(pi)
    }
    

    还有其它博客也介绍了 Z i Z_i Zi P i P_i Pi的计算,例如:
    使用ggClusterNet一条代码计算网络模块内连通度(Zi)和模块间连通度(Pi)
    加载了ggClusterNet包后,只需要一行函数即可计算 Z i Z_i Zi P i P_i Pi,但我仔细阅读了其计算的函数之后,对一些地方存在一些疑问(在代码中注释了),此时该函数计算的结果也与上面函数within_module_deg_z_score()计算结果不同,经过修改后的函数within_module_degree2()计算的结果与上面函数within_module_deg_z_score()计算的结果计算结果相同。
    因此,在使用R包时,特别是一些未经严格检验的R包时,需要了解更多的细节,以免计算错误,得到错误的结果。

    原函数如下:

    #参考自:https://github.com/taowenmicro/ggClusterNet/blob/master/R/module.roles.R
    network_degree <- function(comm_graph){
      ki_total <-NULL
      net_degree <- degree(comm_graph)
      for(i in 1:length(V(comm_graph))){    
        ki <- net_degree[i]    
        tmp <- data.frame(taxa=names(ki), total_links=ki)   
        if(is.null(ki_total)){ki_total<-tmp} else{ki_total <- rbind(ki_total, tmp)}   
      } 
      return(ki_total) 
    }
    
    #compute within-module degree for each of the features
    
    within_module_degree <- function(comm_graph){
      mods <- vertex_attr(comm_graph, "module")
      vs <- as.list(V(comm_graph))
      modvs <- data.frame("taxon"= names(vs), "mod"=mods)
      #不理解此处为什么要用decompose.graph(),难道不应该直接用模块内的节点去取子图吗?我在within_module_degree2()中对我的想法进行了实现
      sg1 <- decompose.graph(comm_graph,mode="strong")
      df <- data.frame()
      for(mod in unique(modvs$mod)){ 
        mod_nodes <- subset(modvs$taxon,modvs$mod==mod) 
        neighverts <- unique(unlist(sapply(sg1,FUN=function(s){if(any(V(s)$name %in% mod_nodes)) V(s)$name else NULL})))  
        g3 <- induced.subgraph(graph=comm_graph,vids=neighverts)   
        mod_degree <- degree(g3) 
        for(i in mod_nodes){      
          ki <- mod_degree[which(names(mod_degree)==i)]     
          tmp <- data.frame(module=mod, taxa=names(ki), mod_links=ki)      
          df <- rbind(df,tmp)      
        }   
      } 
      return(df) 
    }
    
    within_module_degree2 <- function(comm_graph){ 
      mods <- vertex_attr(comm_graph, "module")
      vs <- as.list(V(comm_graph)) 
      modvs <- data.frame("taxon"= names(vs), "mod"=mods)
      df <- data.frame()
      for(mod in unique(modvs$mod)){  
        mod_nodes <- subset(modvs$taxon,modvs$mod==mod) 
        g3 <- induced.subgraph(graph=comm_graph,vids=mod_nodes)  
        mod_degree <- degree(g3) 
        for(i in mod_nodes){      
          ki <- mod_degree[which(names(mod_degree)==i)]      
          tmp <- data.frame(module=mod, taxa=names(ki), mod_links=ki)      
          df <- rbind(df,tmp)    
        }   
      } 
      return(df)
    }
    #calculate the degree (links) of each node to nodes in other modules.
    among_module_connectivity <- function(comm_graph){ 
      mods <- vertex_attr(comm_graph, "module")  
      vs <- as.list(V(comm_graph)) 
      modvs <- data.frame("taxa"= names(vs), "mod"=mods)
      df <- data.frame() 
      for(i in modvs$taxa){   
        for(j in modvs$taxa){     
          if(are_adjacent(graph=comm_graph, v1=i , v2=j)){      
            mod <- subset(modvs$mod, modvs$taxa==j)       
            tmp <- data.frame(taxa=i, taxa2=j, deg=1, mod_links=mod)       
            df <- rbind(df, tmp)       
          }     
        }    
      }  
      out <- aggregate(list(mod_links=df$deg), by=list(taxa=df$taxa, module=df$mod), FUN=sum)  
      return(out)  
    }
    
    #compute within-module degree z-score which
    #measures how well-connected a node is to other nodes in the module.
    
    zscore <- function(mod.degree){  
      ksi_bar <- aggregate(mod_links ~ module, data=mod.degree, FUN = mean)  
      ksi_sigma <- aggregate(mod_links ~ module, data=mod.degree, FUN = sd) 
      z <- NULL 
      for(i in 1:dim(mod.degree)[1]){   
        mod_mean <- ksi_bar$mod_links[which(ksi_bar$module == mod.degree$module[i])]    
        mod_sig <- ksi_sigma$mod_links[which(ksi_bar$module == mod.degree$module[i])]    
        z[i] <- (mod.degree$mod_links[i] - mod_mean)/mod_sig   
      }  
      z <- data.frame(row.names=rownames(mod.degree), z, module=mod.degree$module)  
      return(z) 
    }
    
    #The participation coefficient of a node measures how well a  node is distributed
    # in the entire network. It is close to 1 if its links are uniformly
    #distributed among all the modules and 0 if all its links are within its own module.
    
    participation_coeffiecient <- function(mod.degree, total.degree){ 
      p <- NULL  
      for(i in total.degree$taxa){   
        ki <- subset(total.degree$total_links, total.degree$taxa==i)   
        taxa.mod.degree <- subset(mod.degree$mod_links, mod.degree$taxa==i)   
        p[i] <- 1 - (sum((taxa.mod.degree)**2)/ki**2)   
      } 
      p <- as.data.frame(p)
      return(p)
    }
    
    展开全文
  • 传感器节点的部署包括连通网络和非连通网络2种情况.为了最小化网络部署开销,对非连通网络的传感器节点部署问题进行了研究,建立了整数线性规划模型,并证明该问题为NP-complete问题.为找到该问题的近似最优解,通过理论...
  • 在考虑社会网络拓扑结构特征的基础上,提出了基于代数连通性的社会网络影响传播最大化模型。模型以代数连通性为主要参量计算边的中心性,实现网络社区的快速划分,通过降维达到算法效率优化;模型挖掘社区内影响力大...
  • 如何保证多跳自组织网络连通性是无线传感器网络研究的核心问题. 在正态遮蔽衰退模型的基础上, 借 助状态转移概率矩阵提出一种基于马尔可夫链策略的节点密度控制算法. 该算法利用一步转移概率矩阵求出信号在...
  • 为了简单而有效地评估网络拓扑结构中各节点重要性,本文基于节点的连接度和局部连通性,定义了一个节点重要度函数.该重要度函数指标实质上与网络中的平均最短距离指标是一致的,通过该重要度函数指标值的大小可以得到...
  • 节点部署是无线传感器网络的基本问题之一,有效的节点部署能够提高网络的覆盖率和连通性。提出了一种改进的虚拟力节点部署方法,在传统的基于虚拟力的网络节点部署算法的基础上,利用计算几何中的Delaunay三角剖分定义...
  • 为提高无线传感器网络(WSN)k 连通性路径检测算法的精度,提出一种基于分布式色调识别的无线传感器网络 k 连通性路径检测算法。首先,利用图模型给出了所研究无线传感器网络的模型结构,并对于构建的模型给出了理论...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,689
精华内容 13,475
关键字:

如何查询网络节点,网络的连通性

友情链接: V3.33.zip