无权重图的增长模型
1. 无权重图增长模型概述
在图论中,无权重图的增长模型是一类重要的研究对象。这类模型的特点是节点数量和边的数量会随时间变化(通常是增长)。在选择图的表示方法时,需要考虑到这种动态变化。而且,在时间 $t$ 时,新到达的节点 $i$ 与现有节点 $j$ 建立新连接的概率 $\theta_{i→j}$ 并非恒定不变,而是随时间变化。例如,在基于度的优先连接模型中,这个概率取决于节点 $j$ 在节点 $i$ 到达时的度值。理论上,每添加一个节点后,都应该重新计算连接概率向量 $\theta_{i→j}$,这通常需要扫描边的列表并更新图中所有节点的度,一般操作数量的阶为 $O(N^2)$ 或更高。不过,增长图模型通常可以非常高效地实现,通常时间复杂度为 $O(K)$,其中 $K$ 是图中最终的边数。这是因为增长模型的每一步通常只会修改相对较少数量节点的度,所以在每个时间点,只需要更新连接概率向量 $\theta_{i→j}$ 的少数条目。
2. 巴拉巴西 - 阿尔伯特(BA)模型
-
模型原理
:BA 模型通过合适的增长机制生成具有幂律度分布 $p_k \sim k^{-\gamma}$(其中 $\gamma = 3$)的图。该模型从一个包含 $n_0$ 个节点的完全图开始,在每个时间 $t$ 添加一个新节点 $n$,并将其连接到 $m \leq n_0$ 个已存在的节点。新节点 $n$ 在时间 $t$ 与现有节点 $i$ 连接的概率 $\theta_{n→i}$ 是节点 $i$ 在时间 $t - 1$ 的度 $k_{i,t - 1}$ 的线性函数,即:
$\theta_{n→i} = \frac{k_{i,t - 1}}{2l_{t - 1}}$
其中 $k_{i,t - 1}$ 和 $l_{t - 1}$ 分别表示节点 $i$ 的度和网络在时间 $t - 1$ 的总边数。 -
简单实现的复杂度
:简单实现 BA 模型时,在每个时间步 $t$ 重新计算整个向量 $\theta_{i→j}$,然后使用算法 23 进行离散拒绝采样,所需的操作数量为:
$\sum_{t = 1}^{N} l_t = \frac{Nn_0(n_0 - 1)}{2} + \frac{mN(N + 1)}{2}$
这个操作数量的复杂度为 $O(N^2m)$。 -
高效采样方法
:存在一种更巧妙的采样 BA 图的方法,利用稀疏邻接矩阵的 $ij$ 形式表示,无需计算概率 $\theta_{i→j}$。给定向量 $i$ 和 $j$,每对 $(i[k], j[k])$($k = 1, 2, \ldots, K$)表示图的一条边。由于图是无向的,每条边可以在 $i$ 和 $j$ 中只存储一次,所以给定标签 $\ell$ 在 $i$ 或 $j$ 中出现的总次数等于节点 $\ell$ 的边数,即 $k_{\ell,t - 1}$。考虑将向量 $i$ 和 $j$ 连接得到的向量 $V$,其前 $l_{t - 1}$ 个分量对应向量 $i$,后续 $l_{t - 1}$ 个分量对应向量 $j$。由于每个节点在向量 $V$ 中出现的次数等于其度,从 $V$ 中均匀随机采样一个元素 $v$,$v$ 等于 $\ell$ 的概率恰好为 $\frac{k_{\ell,t - 1}}{2l_{t - 1}}$。这就是
ba()过程的核心,其伪代码如下:
Algorithm 35 ba()
Input: N, n0, m
Output: i, j
1: l ← 0
2: for i = 0 to n0 - 1 do
3:
for j = i + 1 to n0 - 1 do
4:
i[l] ← i
5:
j[l] ← j
6:
l ← l + 1
7:
end for
8: end for
9: n ← n0
10: t ← 1
11: while t < N - n0 do
12:
for j = 0 to m - 1 do
13:
i[l + j] ← t + n0
14:
v ← sample_neighbour(i, j, l)
15:
while check_neighbour(i, j, v, l, j) = TRUE do
16:
v ← sample_neighbour(i, j, l)
17:
end while
18:
j[l + j] ← v
19:
end for
20:
n ← n + 1, l ← l + m
21: end while
22: return i, j
该算法首先构建一个包含 $n_0$ 个节点的完全图(第 2 - 8 行)。然后逐个添加节点,在时间 $t$ 时添加标签为 $n = t + n_0$ 的节点及其 $m$ 个边桩到现有网络(包含 $n_{t - 1} = n_0 + t - 1$ 个节点和 $l_{t - 1} = \frac{n_0(n_0 - 1)}{2} + m(t - 1)$ 条边)。对于新节点的每个边桩 $j$,先将新节点的标签添加到数组 $i$ 的末尾,然后使用
sample_neighbour()
函数选择一个候选邻居 $v$。
sample_neighbour()
函数的伪代码如下:
Algorithm 36 sample_neighbour()
Input: i, j, l
1: v ← ⌊RAND(0, 1) × 2l⌋
2: if v < l then
3:
return i[v]
4: else
5:
return j[v - l]
6: end if
为避免出现多条边,需要检查
sample_neighbour()
返回的节点 $v$ 是否已经被选为新节点 $n$ 的邻居。这个检查由
check_neighbour()
函数高效完成,其伪代码如下:
Algorithm 37 check_neighbour()
Input: i, j, v, l, j
Output: {TRUE | FALSE}
1: for k = 0 to j - 1 do
2:
if v = j[l + k] then
3:
return TRUE
4:
end if
5: end for
6: return FALSE
算法 35 的时间复杂度为 $O(Nm^2)$。实际上,首先需要构建一个阶为 $n_0$ 的完全图(时间复杂度为 $O(n_0^2)$),然后对于每个新节点 $n$,调用 $O(m)$ 次
select_neighbour
和
check_neighbour
函数,它们的时间复杂度分别为 $O(1)$ 和 $O(m)$。因此,生成一个包含 $N$ 个节点的网络所需的总操作数量随 $N$ 和 $m$ 增长为 $O(n_0^2 + (N - n_0)m^2)$,主要由 $O(Nm^2)$ 主导。该算法已在程序
ba
中实现,可从
www.complex-networks.net
下载。
下面是 BA 模型算法流程的 mermaid 流程图:
graph TD;
A[开始] --> B[构建n0个节点的完全图];
B --> C[初始化n = n0, t = 1];
C --> D{是否t < N - n0};
D -- 是 --> E[循环m次添加边桩];
E --> F[将新节点标签添加到i末尾];
F --> G[选择候选邻居v];
G --> H{检查v是否已选};
H -- 是 --> G;
H -- 否 --> I[将v添加到j末尾];
I --> J[更新n和l];
J --> D;
D -- 否 --> K[返回i, j];
K --> L[结束];
3. 广义优先连接模型
-
模型概率形式
:对于任何连接概率形式为 $\theta_{n→i} = \frac{f_i}{\sum_{\ell} f_{\ell}}$ 的增长模型(其中 $f_i$ 是节点 $i$ 结构属性的非负函数),可以采用更高效的采样方法。例如,在 BA 模型中 $f_i = k_i$;在 DMS 模型中,现有节点 $i$ 在时间 $t = 1, 2, 3, \ldots$ 从新到达节点 $n = n_0 + t$ 接收一条边的概率为:
$\theta_{n→i} = \frac{k_{i,t - 1} + a}{\sum_{l = 1}^{n - 1} (k_{l,t - 1} + a)}$
其中 $-m \leq a$,此时 $f(k_i) = k_i + a$。DMS 模型生成的图具有幂律度分布 $k^{-\gamma}$,其中 $\gamma = 3 + \frac{a}{m}$。 - 低效实现复杂度 :与线性优先连接情况类似,在每一步重新计算所有节点的连接概率 $\theta_{n→i}$ 会导致算法效率低下,时间复杂度为 $O(N^2m)$。
- 高效采样策略 :更高效的采样 DMS 模型图的方法基于离散逆采样。概率分布 $\theta_{n→i}$ 可以用线段 $AB$ 表示,其总长度为 $\sum_{i = 1}^{n - 1} (k_{i,t - 1} + a)$。线段 $AB$ 由 $n - 1$ 个子线段组成,每个子线段对应图在时间 $t$ 的一个节点,其长度分别等于 $(k_{1,t - 1} + a), (k_{2,t - 1} + a), \ldots, (k_{n - 1,t - 1} + a)$。通过在 $AB$ 上均匀随机采样一个点 $p$,该点落在与节点 $i$ 相关的子线段内的概率与 $(k_{i,t - 1} + a)$ 成正比。因此,可以通过在 $AB$ 上均匀随机采样一个点 $p$,找到 $p$ 所在的子线段,并选择对应该子线段的节点,从而以式(A.30)给出的概率采样图中的每个节点。
-
具体实现数组
:这种采样策略可以通过使用两个数组来实现,即节点标签数组
labels[]和实数数组sum_widths[],其中sum_widths[i - 1]包含前 $i$ 个子线段的长度之和。例如,对于一个包含 $N = 6$ 个节点的网络,假设其度序列为 ${k_1 = 3, k_2 = 2, k_3 = 4, k_4 = 1, k_5 = 1, k_6 = 1}$,从一个包含 $n_0 = 3$ 个节点的种子网络开始,设置 $m = 1$ 和 $a = -0.5$。可以用线段和对应的labels[]及sum_widths[]向量来表示连接概率。节点 1 对应的子线段长度为 $k_{1,t - 1} + a = 2.5$,因为labels[]向量的第一个元素是 1,sum_widths[]对应元素的值为 2.5。同样,节点 3 对应的子线段长度为 $k_{3,t - 1} + a = 3.5$。 -
新节点连接过程
:假设新节点标签为 7 到达且需要连接 $m = 1$ 个边桩。在 $[0, sum_widths[5]]$ 上均匀随机采样一个数 $p$,假设 $p = 5.27$,则 $p$ 落在与节点 3 相关的子线段内,因此将节点 7 与节点 3 连接。新节点 7 的度为 $k_7 = 1$,应关联一个长度为 $k_7 + a = 0.5$ 的新子线段。可以通过在
labels向量中添加值为 7 的新元素,在sum_widths[]向量中添加值为 $sum_widths[5] + 0.5 = 9.5$ 的新元素来实现。同时,由于节点 3 获得了一条新边,其对应的子线段长度应从 3.5 扩展到 4.5。为避免每次更新操作复杂度为 $O(n)$,可以在sum_widths[]向量末尾添加一个长度为 1.0 的新子线段并分配给节点 3,这样操作的时间复杂度为 $O(1)$。 -
DMS 模型采样函数
:DMS 模型增长图的过程与 BA 模型类似,主要区别在于使用了额外的向量
labels[]和sum_widths[],以及合适的sample_neighbour_dms()函数,其伪代码如下:
Algorithm 38 sample_neighbour_dms()
Input: i, j, l, K
1: p ← RAND(0, 1) × sum_widths[K - 1]
2: i ← find_segment_label(p, labels, sum_widths)
3: return i
sample_neighbour_dms()
的时间复杂度仅取决于
find_segment_label()
函数的时间复杂度,该函数用于找到采样值 $p$ 所在子线段对应的节点标签。可以通过对
sum_widths[]
向量进行稍微修改的二分搜索来实现,时间复杂度为 $O(log K)$。因此,DMS 模型采样图的时间复杂度为 $O(Nm log K) = O(K log K)$,远优于在每一步重新计算 $\theta_{n→i}$ 的简单实现的时间复杂度 $O(N^2m) = O(KN)$。DMS 模型已在程序
dms
中实现,可从
www.complex-networks.net
下载。通过类似的策略,还在程序
bb_fitness
中实现了 Bianconi 和 Barabási 提出的带适应性的优先连接模型。
下面是 DMS 模型采样节点的流程表格:
|步骤|操作|
|----|----|
|1|在
[0, sum_widths[K - 1]]
上随机采样 $p$|
|2|通过
find_segment_label
找到 $p$ 所在子线段对应的节点标签 $i$|
|3|返回节点标签 $i$|
无权重图的增长模型
4. 不同模型复杂度对比
为了更清晰地了解 BA 模型和 DMS 模型在不同实现方式下的性能差异,我们对它们的时间复杂度进行详细对比。以下是不同模型和实现方式的时间复杂度总结表格:
|模型|实现方式|时间复杂度|
|----|----|----|
|BA 模型|简单实现|$O(N^2m)$|
|BA 模型|高效采样(
ba()
算法)|$O(Nm^2)$|
|DMS 模型|简单实现(每步重新计算 $\theta_{n→i}$)|$O(N^2m)$|
|DMS 模型|高效采样(使用
sample_neighbour_dms()
)|$O(Nm log K) = O(K log K)$|
从表格中可以看出,简单实现的 BA 模型和 DMS 模型时间复杂度较高,都为 $O(N^2m)$。而采用高效采样方法后,BA 模型的时间复杂度降为 $O(Nm^2)$,DMS 模型的时间复杂度降为 $O(K log K)$,这表明高效采样方法在处理大规模图时具有明显的优势。
5. 模型应用场景分析
- BA 模型应用场景 :BA 模型生成的图具有幂律度分布,这种分布在许多现实网络中都有体现,如社交网络、互联网等。在社交网络中,一些热门人物(节点度较高)更容易吸引新的连接,这与 BA 模型的优先连接机制相符。因此,BA 模型可以用于模拟社交网络的增长过程,帮助分析社交网络的结构和演化规律。
- DMS 模型应用场景 :DMS 模型通过调整参数 $a$ 可以控制幂律度分布的指数 $\gamma$,使其具有更强的灵活性。在一些需要更精确控制网络结构的场景中,DMS 模型更具优势。例如,在电力网络中,不同节点的重要性和连接能力可能存在差异,DMS 模型可以根据实际情况调整参数,更准确地模拟电力网络的增长和结构。
6. 模型实现的注意事项
-
避免重复边
:在实现 BA 模型和 DMS 模型时,都需要注意避免出现重复边。在 BA 模型中,通过
check_neighbour()函数检查候选邻居是否已经被选择;在 DMS 模型中,虽然没有专门的重复边检查函数,但在实际应用中也需要考虑这个问题。可以在添加新边时,检查新边是否已经存在于图中。 -
数组更新
:在 DMS 模型中,使用
labels[]和sum_widths[]数组来表示累积分布。在添加新节点和边时,需要及时更新这两个数组。同时,为了避免更新操作的复杂度过高,采用在sum_widths[]向量末尾添加新元素的方法,确保每次更新操作的时间复杂度为 $O(1)$。
7. 未来研究方向
- 模型扩展 :目前的 BA 模型和 DMS 模型都是基于简单的优先连接机制。未来可以考虑对模型进行扩展,引入更多的因素,如节点的属性、边的权重等,以更准确地模拟现实网络的复杂性。
- 并行计算 :随着图的规模不断增大,模型的计算时间也会相应增加。可以研究如何利用并行计算技术,提高模型的采样效率。例如,将图的不同部分分配到多个处理器上并行处理,减少整体计算时间。
下面是未来研究方向的 mermaid 流程图:
graph TD;
A[当前模型] --> B[模型扩展];
A --> C[并行计算];
B --> D[引入节点属性];
B --> E[引入边的权重];
C --> F[多处理器并行处理];
C --> G[分布式计算];
综上所述,无权重图的增长模型(如 BA 模型和 DMS 模型)在图论和网络科学中具有重要的应用价值。通过采用高效的采样方法,可以显著降低模型的时间复杂度,提高计算效率。同时,不同的模型适用于不同的应用场景,在实际应用中需要根据具体需求选择合适的模型。未来,对模型的扩展和并行计算技术的研究将有助于进一步提高模型的性能和应用范围。
超级会员免费看
2568

被折叠的 条评论
为什么被折叠?



