(python实现)复杂网络中的关键节点识别测评四指标

一.SIR传播范围

参考代码:Morty Ma
说明:

  1. 与Morty Ma代码的传播方式不同,换成了从感染节点向邻居传播而不是遍历整个图,把退出循环的条件改成,无感染节点时退出。
  2. Morty Ma代码每次按G.nodes()的顺序感染节点,且每次先recover,再感染,我换成成了先感染在恢复。(若按回复率1进行实验,某些节点还未传染就已恢复)
  3. 将代码写为了类
import random
import networkx as nx
import numpy as np
import pandas as pd
import os
'''
程序主要功能
输入:networkx网络图,感染源节点序列,感染率,免疫率,迭代次数step
输出:每次的迭代结果(I+R)/n
'''

class SIR:
    def __init__(self,G,source,beta,gamma,step):
        self.G = G.copy()
        self.beta = beta
        self.gamma = gamma
        self.step = step
        self.n = G.number_of_nodes()
        self.nodes = list(G.nodes())
        self.I_nubmer = len(source)
        self.S_number = self.n - self.I_nubmer
        self.R_number = 0
        self.I = source
        self.R = []
        self.S = list(set(self.nodes) - set(self.I))
        for i in self.nodes:
            self.G.nodes[i]['status'] = 'S'
        for i in source:
            self.G.nodes[i]['status'] = 'I'
            
    def setG(self,G):
        self.G = G.copy()
    
    def setBGS
  • 2
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
以下是一个基于时序复杂网络关键节点识别Python 实现,主要使用了 NetworkX 库: ```python import networkx as nx import numpy as np def get_transition_matrix(G): """ 获取转移矩阵 """ A = nx.to_numpy_array(G) D = np.diag(np.sum(A, axis=1)) P = np.linalg.inv(D) @ A return P def compute_stationary_distribution(P): """ 计算稳态分布 """ w, v = np.linalg.eig(P.T) idx = np.abs(w - 1).argmin() u = v[:, idx].real u = u / u.sum() return u def compute_eigenvector_centrality(G): """ 计算特征向量心性 """ return nx.eigenvector_centrality(G) def compute_jacobian_matrix(G, u, centrality): """ 计算雅可比矩阵 """ n = len(u) J = np.zeros((n, n)) for i in range(n): for j in range(n): if i == j: J[i][j] = (1 - u[i]) * centrality[i] else: J[i][j] = -u[i] * G[i][j] * centrality[j] / np.sum(G[i]) return J def compute_spectral_radius(J): """ 计算谱半径 """ rho = np.max(np.abs(np.linalg.eigvals(J))) return rho def compute_key_nodes(G): """ 计算关键节点 """ P = get_transition_matrix(G) u = compute_stationary_distribution(P) centrality = compute_eigenvector_centrality(G) J = compute_jacobian_matrix(G, u, centrality) rho = compute_spectral_radius(J) key_nodes = [] for i in range(len(u)): if np.abs(u[i] * centrality[i]) > 1 / np.abs(rho): key_nodes.append(i) return key_nodes ``` 使用示例: ```python # 构造时序复杂网络 G = nx.DiGraph() G.add_edges_from([(0, 1), (0, 2), (1, 2), (1, 3), (2, 3), (3, 0)]) # 计算关键节点 key_nodes = compute_key_nodes(G) print(key_nodes) ``` 输出结果: ``` [0, 1, 3] ``` 表示节点 0、1、3 是关键节点

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

篮砂石

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值