自己问 AI、自己粘代码、自己跑出结果 —— 不注册、不下载
1967 年,有人做了个实验:把一封信交给一个人,只准靠「熟人的熟人」转交,送到一个陌生城市的陌生人手里。 结果这封信大约只转了六次手。问题是:凭什么?
下面 5 个地方,你可以按自己的顺序动手。先猜,再试,然后跟同伴说说你发现了什么。
先别动手。20 个人围成一圈,每个人只认识左右两个邻居。一封信从 1 号出发,要送到正对面的 11 号。你猜要转几次手?先把这个数记下来。
挑 4 位你最常来往的同学,把名字写进去。然后一件一件地勾:他们之间,谁真的认识谁?
勾的时候,你其实在做一件事:把人变成点,把关系变成线。数学家管这个动作叫「建模」。
顺带算一下:4 个人之间最多能连 6 对关系,真正认识了几对?C = 认识的边数 ÷ 6。
「转了几手」只说明两个人之间。换成问整张网:随便挑两个人,平均要几步才能找到对方? 这个数叫 平均最短路径 Y。
现在问题变了:往这个圈里加几条跨圈的捷径,Y 会掉多快?先猜一个数,再拖滑块。
一张网能动的其实只有三样:多少人、每人认识几个、有多少跨圈捷径。拖它们,一边拖一边问自己:哪一样一动,整张网就变了样?
下面三张图,人数一样、每人认识的人数也一样,只有一样东西不同。三张都是用同一套规则真算出来的。先看,别急着读表 —— 你觉得它们像三种什么样的社会?
P = 0
规则网络
P ≈ 0.05
小世界网络
P = 1
随机网络
| 网络 | 集聚系数 C(抱团) | 平均最短路径 Y(通达) | 像什么 |
|---|---|---|---|
| 规则网络 P=0 | 0.50 | 12.88 | 一群人排排坐,只有身边人认识 |
| 小世界 P≈0.05 | 0.43 | 6.10 | 既抱团,又通达 —— 真实现象大多在这 |
| 随机网络 P=1 | 0.03 | 3.43 | 每人随便抓阄认人,圈子碎掉 |
你刚才做的事,其实就是做研究:先猜,再试,然后发现自己猜错在哪。 把下面三件事说给同桌听——说得出来,才说明真的懂了:
刚才五关,你都是靠一双手点出来的。现在换一件事:让别人替你把它算出来。 右下角有一个助手,它很会写程序,但它只会照着你说的话做 —— 你想让它算什么,就得先想清楚、说清楚。 拿到代码后粘进下面的框里,跑一跑,看看它算的和你心里想的一不一样。
留空的地方,助手会替你猜 —— 猜错了,改代码花的是你的时间。
运行结果会显示在这里…
如果点了运行十几秒都没反应,多半是代码里有很慢的循环(比如用递归去算最短路径)—— 按 F5 刷新一下,回去改代码。
代码跑出来了、图也画了,不代表它做对了。把你运行时看到的那几个数填进来,对一下。
| 检查什么 | 应该是 | 你看到的是 | 对不对 |
|---|---|---|---|
| 节点数 | 100 | — | |
| 总边数(N × K ÷ 2) | 200 | — | |
| 平均好友数(= 2×边数÷节点数) | 4.0 | — | |
| 把 P 改成 0.3 再跑,Y 变成 | 应明显变小(≤ 8) | — |
刚才你是拖一下、看一眼。现在要的是数据:8 个不同的 P,各自的 C 和 Y。
先按最笨的办法做:自己改一次 P、跑一次,记下一行。跑上两三行,你大概就会碰到一个问题 —— 那个问题,正好是这一步要解决的。
改代码也要讲清楚三件事:改哪里、改几次、结果长什么样。
运行结果会显示在这里…
把任务二那 8 行数据画成柱子图。先按最直接的想法画一次 —— C 和 Y 放在同一根轴上。
画完你多半会发现一个问题。那个问题不是画错了,是数据在提醒你:这两个数根本不能直接比。 接下来怎么处理,由你来想。
(画图也用 Python。最后一行写 fig.savefig('plot.png', dpi=150),图会显示在右边。)
先不要想“怎么画才好看”,就照你脑子里第一个念头画。你会在图上看到一个问题。
运行结果会显示在这里…
书上说「P 在某个区间里,网络既抱团又通达」。可这个区间是谁定的? —— 是你定的。你得先说清楚:通达要到什么程度算够,抱团要保住多少算还在。
区间这件事,最怕「AI 说是就是」。所以别问它「答案是啥」,要问它「你凭什么这么判断」, 最好再让它反过来挑你的错。
前面算的都是「用规则造出来的网」。现在换一张真的:我们班的熟人网络。 把调查表发到班级群,每人写下自己最常来往的同学学号 —— 有几个写几个 (有人交游广写七八个,有人只写一两个,这本身就是数据的一部分)。收齐之后,轮到你来算 —— 我们这个班,会不会也是一个「小世界」?
点下面的按钮,网站会把问卷收集到的数据放进一个叫 responses 的变量里:
[{"code":"03","friends":["05","11","22"]}, ...]
每个学生写自己最常来往的 3 个学号,就形成一张熟人网络。 现在算:平均每个人认识几个?网络的集聚系数 C 是多少?平均最短路径 Y 是多少?
responses 里了。多少人,以里面实际的条数为准,不要写死。
请把它建成一张网络:
把这两位同学之间的好友关系当作
;
算出
和
、节点数、边数、平均好友数,全部打印出来;
再画出这张班级网络。
responses 变量里了,
粘进去它会把额度全花在复述数据上,代码反而写不完被截断。
运行结果会显示在这里…
光算出 C 和 Y 还不够 —— 它们大不大,得跟谁比?跟同样大小的网络比。 把一组「同样人数、同样平均好友数」的标准小世界网络摆出来,看我们班落在哪一段。
nx.watts_strogatz_graph 生成一组同样大小的标准小世界网络,
P 取 ,算出每张的 C 和 Y;
再把我们班的 C、Y 一起标上去,看看我们班相当于 P 多大的小世界网络。
运行结果会显示在这里…
把我们班放在小世界地图上的哪个位置、为什么,写成三句话。写不出来,说明还没真明白。