小世界网络 · 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 替你把这张网算出来你说清楚 · 它写 · 你来验

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

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

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

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

如果点了运行十几秒都没反应,多半是代码里有很慢的循环(比如用递归去算最短路径)—— 按 F5 刷新一下,回去改代码。

先别急着看图 —— 用三个数验一验它试错的地方

代码跑出来了、图也画了,不代表它做对了。把你运行时看到的那几个数填进来,对一下。

检查什么应该是你看到的是对不对
节点数 100 —
总边数(N × K ÷ 2) 200 —
平均好友数(= 2×边数÷节点数) 4.0 —
把 P 改成 0.3 再跑,Y 变成 应明显变小(≤ 8) —
i三个都对上,再去看 C 和 Y;有一个不对,就回去把需求补一句,重新问一次。

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

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

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

把“一次算完”说成助手听得懂的话

改代码也要讲清楚三件事:改哪里、改几次、结果长什么样。

在上面这段代码的基础上改:固定 N = ,K = ; 让 P 分别取 ; 每个 P 跑 次、取平均值(随机模拟每次会有点不一样); 最后打印成一张表,每行是:P、C、Y。
i随机模拟每次结果会小幅波动。同一个 P 多跑几次,看看差多少 —— 这个差异待会儿要解释。
运行结果会显示在这里…

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

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

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

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

第一次:先按最直接的想法画

先不要想“怎么画才好看”,就照你脑子里第一个念头画。你会在图上看到一个问题。

用 matplotlib 把上面那张表画成 : 横轴是 P,纵轴是 。 图存成 plot.png,图里的文字用英文。
! 画完先看一眼纵轴。如果 C 的柱子几乎贴着横轴、只剩 Y 立着 —— 别急着说“我看不出规律”。那个现象本身,就是这一步要解决的问题。 回到上面,把“纵轴”换成另一个选项,再画一次。
i浏览器里的 matplotlib 没有中文字体,图的标题、坐标轴请用英文(P、C、Y、relative)。
运行结果会显示在这里…

小世界区间到底在哪儿?你自己定标准,自己找

书上说「P 在某个区间里,网络既抱团又通达」。可这个区间是谁定的? —— 是你定的。你得先说清楚:通达要到什么程度算够,抱团要保住多少算还在。

Y 至少掉到原来的50%
C 至少还要留着80%
i拖这两个滑块,看绿色高亮的那几根柱子怎么变。
现在轮到你了:按你定的标准,小世界区间是哪一段?
我标的是:P 从 到
i先自己看图挑一段,再点对一下 —— 看看你漏了哪一根、多算了哪一根。
最后一步:和 AI 商量一下,这个区间到底在哪儿

区间这件事,最怕「AI 说是就是」。所以别问它「答案是啥」,要问它「你凭什么这么判断」, 最好再让它反过来挑你的错。

i AI 说的话,不要全信,也不要全不信 —— 它给的理由,要能对上你上面那张表的数字。 对不上的地方,就是你真正学到东西的地方。

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

前面算的都是「用规则造出来的网」。现在换一张真的:我们班的熟人网络。 把调查表发到班级群,每人写下自己最常来往的同学学号 —— 有几个写几个 (有人交游广写七八个,有人只写一两个,这本身就是数据的一部分)。收齐之后,轮到你来算 —— 我们这个班,会不会也是一个「小世界」?

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

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

第三步:写代码分析它

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

先把需求说清楚(和任务一一样,先说库,再说事)
数据已经放在变量 responses 里了。多少人,以里面实际的条数为准,不要写死。 请把它建成一张网络: 把这两位同学之间的好友关系当作 ; 算出 和 、节点数、边数、平均好友数,全部打印出来; 再画出这张班级网络。
! 别把那一大段数据粘给 AI。数据已经在 responses 变量里了, 粘进去它会把额度全花在复述数据上,代码反而写不完被截断。
运行结果会显示在这里…
第四步:我们班在这张「小世界地图」上的哪个位置?

光算出 C 和 Y 还不够 —— 它们大不大,得跟谁比?跟同样大小的网络比。 把一组「同样人数、同样平均好友数」的标准小世界网络摆出来,看我们班落在哪一段。

我们班的人数,以 responses 里实际的条数为准(不要在代码里写死)。 平均每人认识 个人(取整数、且是偶数,用来生成同样大小的标准网络)。 请用 nx.watts_strogatz_graph 生成一组同样大小的标准小世界网络, P 取 ,算出每张的 C 和 Y; 再把我们班的 C、Y 一起标上去,看看我们班相当于 P 多大的小世界网络。
运行结果会显示在这里…
i 判据就三句话:我们班的 C,比同样大小的随机网络高很多;我们班的 Y,和随机网络差不多小。 两条同时成立,才叫「小世界」。只有 C 高、Y 也大,那是「只有小圈子、不连通」。
第五步:写下你的结论

把我们班放在小世界地图上的哪个位置、为什么,写成三句话。写不出来,说明还没真明白。

小世界编程助手