提交 b36f36f1 编写于 作者: W wizardforcel

3.3

上级 a97ab161
......@@ -48,4 +48,61 @@ Watts 和 Strogatz 发现,较小的`p`值产生高群聚性的图,如正则
+ 然后,我们为范围内的`p`值计算群聚度和路径长度。
+ 最后,我将介绍一种用于计算最短路径的高效算法,Dijkstra 算法。
## 3.3 环格
![](img/3-1.jpg)
> 图 3.1 `n=10`,`k=4`的环格
正则图是每个节点具有相同数量的邻居的图;邻居的数量也称为节点的度。
环格是一种正则图,Watts 和 Strogatz 将其用作模型的基础。 在具有`n`个节点的环格中,节点可以排列成圆形,每个节点连接`k`个最近邻居。
例如,`n = 3``k = 2`的环形网格将拥有以下边:`(0, 1), (1, 2), (2, 0)`。 请注意,边从编号最高的节点“绕回”0。
更一般地,我们可以像这样枚举边:
```py
def adjacent_edges(nodes, halfk):
n = len(nodes)
for i, u in enumerate(nodes):
for j in range(i+1, i+halfk+1):
v = nodes[j % n]
yield u, v
```
`adjacent_edges`接受节点列表和参数`halfk`,它是`k`的一半。它是一个生成器函数,一次产生一个边。它使用模运算符`%`,从编号最高的节点绕回最低的节点。
我们可以这样测试:
```py
>>> nodes = range(3)
>>> for edge in adjacent_edges(nodes, 1):
... print(edge)
(0, 1)
(1, 2)
(2, 0)
```
现在我们可以使用`adjacent_edges`来生成环格。
```py
def make_ring_lattice(n, k):
G = nx.Graph()
nodes = range(n)
G.add_nodes_from(nodes)
G.add_edges_from(adjacent_edges(nodes, k//2))
return G
```
注意,`make_ring_lattice`使用地板除计算`halfk`,所以如果`k`是奇数,它将向下取整并产生具有度`k-1`的环格。这可能不是我们想要的,但现在还不错。
我们可以像这样测试函数:
```py
lattice = make_ring_lattice(10, 4)
```
图(?)展示了结果。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册