设置在网络中传播病毒的起始节点

set the starting node for spreading a virus in a network

我正在使用 R 编程寻找复杂网络中有影响力的节点。我想使用度中心性,这意味着节点在图中的邻居数。我有一个图表和每个节点的度中心性。现在我想知道当我们开始从每个节点传播病毒时,在指定时间内将感染多少个节点。根据我的研究,我应该使用我在 "igraph" 包中找到的 SIR(易感、感染、恢复)流行病模型,问题是我无法指定起始节点。似乎这个函数是基于 SIR 方程式工作的:

s'= -(beta)SI
I' = (beta)SI - (gamma)I
R' = (gamma)I

其中 beta 是感染参数,gamma 是恢复参数。 这是 igraph SIR 代码:

function (graph, beta, gamma, no.sim = 100) 
{
if (!is_igraph(graph)) {
    stop("Not a graph object")
}
beta <- as.numeric(beta)
gamma <- as.numeric(gamma)
no.sim <- as.integer(no.sim)
on.exit(.Call("R_igraph_finalizer", PACKAGE = "igraph"))
res <- .Call("R_igraph_sir", graph, beta, gamma, no.sim, 
    PACKAGE = "igraph")
class(res) <- "sir"
res
}

似乎大部分工作都在 "R_igraph_sir" 中完成,但我在那个包中找不到这样的功能。 有没有办法设置起始节点?

您似乎想要一个 SIR 模型,您可以在其中通过猴子修补现有 R 代码来设置最初感染的节点。由于 R 包是从 C 代码编译的,这可能很难,具体取决于您的编程经验,并且通常不建议使用 monkeypatching,如果不出意外的话,因为您会在更新 igraph 包的那一刻丢失代码。

相反,您可以使用 igraph 包自己相对轻松地实现它。下面是 python 中未经测试的实现,应该可以轻松移植到 R。

第一步以beta

的概率感染图中与被感染节点相邻的任何节点

在感染阶段之后,任何受感染的节点都可以从图中移除,概率为 gamma

在给定的时间步数之后,您会发现受影响节点的数量与 infected_nodes 数组的大小相同。这不会计算已删除的节点,因此如果您想要整个模拟中的感染总数,您可以在每次感染节点时添加一个计数器

infected_nodes = []
# Set the infection rate
beta = 0.1
# Set the removal rate
gamma = 0.1
# Set how many timesteps you want to pass through
n_timesteps = 100
# Start from the node you have chosen using edge centrality
infected_nodes.append(chosen_node)
for _ in n_timesteps:
    # Infection stage
    for node in infected_nodes:
        for neighbor in igraph.neighborhood(graph, node):
            # random.random simply returns a number between [0,1)
            if random.random() < beta:
                infected_nodes.append(neighbor)
    # Removal stage
    infected_survivors = []
    for node in infected_nodes:
        if random.random() < gamma:
            graph = igraph.delete_vertices(graph, node)
        else:
            infected_survivors.append(node)
    infected_nodes = infected_survivors

一些杂音:

  • 这假设每个节点在每个时间步都访问它们的所有邻居。如果您只希望每个节点每回合能够感染 n 个邻居,您将需要对邻居进行大小 n 的随机抽样,而不是遍历所有节点。
  • 在删除阶段,可以删除新感染的节点,这意味着节点有可能没有机会感染其邻居。如果这在您的情况下不现实,您将不得不将新感染的节点存储在一个单独的数组中,并在感染阶段开始时将它们添加到受感染的节点中
  • 这显然比 R 包提供的 C 实现要慢