提交 c87e91f0 编写于 作者: W wizardforcel

3.4

上级 b36f36f1
......@@ -106,3 +106,38 @@ lattice = make_ring_lattice(10, 4)
```
图(?)展示了结果。
## 3.4 WS 图
![](img/3-2.jpg)
> 图 3.2 WS 图,`n=20`,`k=4`,`p=0`(左边),`p=0.2`(中间),`p=1`(右边)。
为了制作 Watts-Strogatz(WS)图,我们从一个环格开始,并为一些边“重新布线”。 在他们的论文中,Watts 和 Strogatz 以特定顺序考虑边,并用概率`p`重新布置每个边。 如果边被重新布置,则它们使第一个节点保持不变,并随机选择第二个节点。它们不允许自环或多边;也就是说,节点不能拥有到它自身的边,并且两个节点之间不能拥有多个边。
这是我的这个过程的实现。
```py
def rewire(G, p):
nodes = set(G.nodes())
for edge in G.edges():
if flip(p):
u, v = edge
choices = nodes - {u} - set(G[u])
new_v = choice(tuple(choices))
G.remove_edge(u, v)
G.add_edge(u, new_v)
```
参数`p`是边的重新布线的概率。`for`循环枚举了边,并使用`flip`,它以概率`p`返回`True`,来选择哪些被重新布置。
如果我们重新布置节点`u`到节点`v`的边,我们必须选择一个节点来替换`v`,称为`new_v`。为了计算可能的选择,我们从节点集开始,它是一个集合,并且移除`u`和它的邻居,这避免了自环和多边。
然后我们从选项中选择new_v,将`u``v`的现有删除,并从添加一个`u``new_v`的新边。
另外,表达式`G[u]`返回一个字典,他的键是包含`u`的邻居。在这种情况下,它比使用`G.neighbors`更快一点。
这个函数不按照 Watts 和 Strogatz 指定的顺序考虑边缘,但它似乎不会影响结果。
图(?)展示了`n = 20``k = 4`和范围内`p`值的 WS 图。当`p = 0`时,该图是环格。 当`p = 1`时,它是完全随机的。我们将看到,有趣的事情发生在两者之间。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册