小世界网络 · AI 建模仿真实验台

自己问 AI、自己粘代码、自己跑出结果 —— 不注册、不下载

Python 引擎启动中…

世界为什么这么小?一个可以自己动手的探究

1967 年,有人做了个实验:把一封信交给一个人,只准靠「熟人的熟人」转交,送到一个陌生城市的陌生人手里。 结果这封信大约只转了六次手。问题是:凭什么?

下面 5 个地方,你可以按自己的顺序动手。先猜,再试,然后跟同伴说说你发现了什么。

第 1 关 · 一封信要转几次手?

先别动手。20 个人围成一圈,每个人只认识左右两个邻居。一封信从 1 号出发,要送到正对面的 11 号。你猜要转几次手?先把这个数记下来。

传了几手
0 步
网络里的捷径
0 条
随便两个人平均要几手
—
i你猜的是几手?点「让信出发」,看看和你想的一样不一样。

第 2 关 · 把人和关系变成点和线

挑 4 位你最常来往的同学,把名字写进去。然后一件一件地勾:他们之间,谁真的认识谁?

勾的时候,你其实在做一件事:把人变成点,把关系变成线。数学家管这个动作叫「建模」。
顺带算一下:4 个人之间最多能连 6 对关系,真正认识了几对?C = 认识的边数 ÷ 6。

认识的边数(你数一下)
集聚系数 C
0.00
↗C 越接近 1,圈子抱得越紧。

第 3 关 · 一条捷径,值多少?

「转了几手」只说明两个人之间。换成问整张网:随便挑两个人,平均要几步才能找到对方? 这个数叫 平均最短路径 Y。

现在问题变了:往这个圈里加几条跨圈的捷径,Y 会掉多快?先猜一个数,再拖滑块。

往圈里加几条跨圈的捷径0
平均最短路径 Y
—
比不加捷径短了
—
i0 条捷径时 Y = 6.26。你猜加到几条,它才会明显掉下来?

第 4 关 · 这张网里,什么在变?

一张网能动的其实只有三样:多少人、每人认识几个、有多少跨圈捷径。拖它们,一边拖一边问自己:哪一样一动,整张网就变了样?

总人数 N40
每人最多认识 K 人4
跨圈捷径的概率 P0.00
i

第 5 关 · 同样 100 个人,三种活法

下面三张图,人数一样、每人认识的人数也一样,只有一样东西不同。三张都是用同一套规则真算出来的。先看,别急着读表 —— 你觉得它们像三种什么样的社会?

P = 0
规则网络

P ≈ 0.05
小世界网络

P = 1
随机网络

网络集聚系数 C(抱团)平均最短路径 Y(通达)像什么
规则网络 P=00.5012.88一群人排排坐,只有身边人认识
小世界 P≈0.050.436.10既抱团,又通达 —— 真实现象大多在这
随机网络 P=10.033.43每人随便抓阄认人,圈子碎掉
✓中间那张,就是我们要找的东西:抱团还在,距离却短了很多。
现在试着回答一句话:为什么只要很少的几段跨圈关系,就能让整张网变近?(说给同桌听,说得出来才算明白)

到这儿,你手上有什么了?

你刚才做的事,其实就是做研究:先猜,再试,然后发现自己猜错在哪。 把下面三件事说给同桌听——说得出来,才说明真的懂了:

① 如果有个人从没听过「小世界」,你会用哪张图、哪句话给他讲明白?
② C 和 Y 分别像什么?为什么这两个数常常不能两全?
③ 如果让你带一个问题进下一关,你最想知道什么?

任务一 · 让 AI 替你把这张网算出来你说清楚 · 它写 · 你来验

刚才五关,你都是靠一双手点出来的。现在换一件事:让别人替你把它算出来。 右下角有一个助手,它很会写程序,但它只会照着你说的话做 —— 你想让它算什么,就得先想清楚、说清楚。 拿到代码后粘进下面的框里,跑一跑,看看它算的和你心里想的一不一样。

第一步 · 先把你想做的事,写成助手能听懂的一句话

留空的地方,助手会替你猜 —— 猜错了,改代码花的是你的时间。

请用 Python 帮我写一段程序:
① 建立一个有 个节点的环形网络,每个节点和左右各 个邻居相连(所以每人一共认识 ? 个人);
② 每条边以概率 P 重连成一条跨圈的捷径;
③ 计算网络的 和 ,并把它们打印出来;
④ 最后用 matplotlib 画 。
i “画这张网络的图”和“把两个数画成图”是两件事。你要的是前者 —— 图上应该看到 100 个点排成一个圈, 中间横着几条彩色的线(那就是捷径)。如果你拿到的是几个孤立的数据点,说明需求没说清。
凭什么这么写?—— 每个空在防哪一种「AI 猜错」
多少人:不说,AI 会自己编一个(可能是 50),你的手算全对不上。
左右各几个:只说「每人连 4 个人」,AI 可能理解成左右各 4 个,边数直接翻倍。
概率 P:不提重连,AI 可能给你一个完全随机的网络 —— 那就没有「小世界」了。
算哪两个数:不说清楚,它可能只给你一个,或者给你一堆用不上的。
怎么输出:不说,它可能画图、可能什么都不打印,你连数都看不到。
P 取 0:这是你手里唯一的验证锚点。不说,你就没法判断程序对不对。
i先别急着信它。你能想个办法,检验这段代码对不对吗?
提示:有一个情况,你已经知道答案了 —— P = 0。
运行结果会显示在这里…

任务二 · 从「一个数」到「一组数」让你自己发现它有多慢

刚才你是拖一下、看一眼。现在要的是数据:8 个不同的 P,各自的 C 和 Y。

先按最笨的办法做:自己改一次 P、跑一次,记下一行。跑上两三行,你大概就会碰到一个问题 —— 那个问题,正好是这一步要解决的。

i随机模拟每次结果会小幅波动。同一个 P 多跑几次,看看差多少 —— 这个差异待会儿要解释。
运行结果会显示在这里…

任务三 · 让数据自己说话先画,再看,再想办法

把任务二那 8 行数据画成柱子图。先按最直接的想法画一次 —— C 和 Y 放在同一根轴上。

画完你多半会发现一个问题。那个问题不是画错了,是数据在提醒你:这两个数根本不能直接比。 接下来怎么处理,由你来想。

(画图也用 Python。最后一行写 fig.savefig('plot.png', dpi=150),图会显示在右边。)

i浏览器里的 matplotlib 没有中文字体,图的标题、坐标轴请用英文(P、C、Y、relative)。
运行结果会显示在这里…

我们班的网络用真实数据验一次

前面算的都是「用规则造出来的网」。现在换一张真的:我们班的熟人网络。 把调查表发到班级群,每人写下自己最常来往的 3 位同学的学号。收齐之后,轮到你来算 —— 我们这个班,会不会也是一个「小世界」?

第一步:把链接发出去
第二步:把数据读进来

点下面的按钮,网站会把问卷收集到的数据放进一个叫 responses 的变量里:
[{"code":"03","friends":["05","11","22"]}, ...]

第三步:写代码分析它

每个学生写自己最常来往的 3 个学号,就形成一张有向的熟人网络。 现在算:平均每个人认识几个?网络的集聚系数 C 是多少?平均最短路径 Y 是多少?

运行结果会显示在这里…
小世界编程助手