版本更新记录
这座虚拟城市是7×24 常驻运行的:虚拟时间 实测 ≈560:1(标称 600;1 虚拟日 ≈ 2.4 真实分钟),
所有人看到的是同一座城。下面是各版本新增与修正的功能。
v1.5.8 当前版本
2026-10-18 发布 · 构建 202610181910
- 【🔴 修掉一个让上一版修复"看起来无效"的根因】
上一版(v1.5.6)起,迁入者的户口改为按开关派生(约 60% 本地 / 40% 外来)。
但服务端**每次从快照恢复时都会把全部市民的户口重算一遍**,其中
迁入者被硬编码成"本地户籍" ⇒ 运行期刚写进去的"外来常住"迁入者,
每重启一次就被抹掉一次。
- 实测:第 7189 天的快照里,切换后迁入的 995 人有 357 个外来;
重启一次后,同一批人变成 1,045 人全部本地。
- ⇒ 这就是为什么户口份额一直停在 62.8% 而不下降 ——
不是修复没生效,是每次重启都被回滚了。
- 改法:快照里有就保留、不重算(户口虽说是纯函数,但"迁入者按哪个规则赋值"
取决于写入那一刻的开关状态,已带时间维度);只有字段缺失或长度不符时才重建。
- 验证:重启前后对比,新迁入者中的"外来常住"保留了(不再归零)。
- 已被污染的数据已由业主授权、一次性修正(2026-10-18):
只改「切换日之后迁入」的那 1,072 人(他们本来就该按新规则,属"修 bug 的后果");
切换日之前的 37,033 名迁入者一个未动(那是当时的历史口径,不是 bug)。
修正用了最小侵入方式:只就地改快照里户口那一段字节,
其余字节逐字节不变(已断言)—— 不用整体重写,因为整体重写会丢政府层账本。
结果:本地户籍 62.90% → 62.83%,外来常住 +409 人;
被标为"外来"的迁入者从 13 人恢复到 413 人。
(原快照已备份,可回滚。)
- 【抽样接口:新增三个可选参数,修两个缺陷】
起因:使用方要按"迁入日期 ≥ 切换日"切分户口,而旧接口会给他们 0 人。
- 缺陷一:
/api/surveySample 用等间隔抽样,
系统性漏掉数组末尾(实测 n=50,000 时漏 35,530 人 / 6.1%),
而迁入者与新生儿都追加在末尾 ⇒ 最近的迁入者一个都抽不到。
修法:?random=1 改用浮点步长均匀覆盖全表;
不传则完全保持旧的确定性抽样(同一天反复调返回同一批人,这个语义不变)。
(中间试过"偏移起点"和"偏移窗口",两次实测都无效——
因为漏掉的人数正好等于取模损失,只能换步长算法。)
- 缺陷二:
/api/citizen?id=X 在找不到该 id 时会
随机返回一个人 ⇒ 任何 id 都"存在" ⇒ 无法用它探测某人是否存在。
修法:?strict=1 ⇒ 传了 id 但找不到就返回 404。
不传则保持原行为;不传 id 时仍随机("随便给我一个人"是正当用途)。
- 新增
coverage 字段:每次返回都告诉你
「覆盖了多少人、漏了多少、是哪种模式」—— 让这个缺陷看得见,
而不是让调用方自己算。
- 【新增诊断字段
switches】
/api/state 现在直接返回引擎内实际生效的开关值
(CITY_HUKOU_MIGRANT 等),外加一个探针值。
起因:桥接日志说开关已设、系统层面的环境变量也确认有,
但数据表现得像没生效 —— 而这个"进程内真值"此前没有任何观测手段。
现在一眼可查。只增字段,不影响既有读取方。
- 【性能修复:日志缓冲的 O(n) 裁剪】
现象:同一个进程跑久了,日均模拟耗时从 8 秒 涨到 20 秒(约 2.5 倍);
重启后立刻回落 —— 说明是某个**随运行增长的结构**在拖慢。
根因:四个日志缓冲(log 4 万 / loveLog 20 万 /
majorLog 40 万 / lifeLog 30 万)的裁剪写成
if (len > CAP) splice(0, 1) —— 数组满之后每来一条就移动整个数组。
恋爱事件每天数十条 ⇒ 每天几百万次元素移动。
修法:摊销裁剪(超过 1.1×CAP 才裁一次 ⇒ 摊薄到约 11 元素/条)。
按上限折算快 3,636 / 18,181 / 36,363 / 27,272 倍;代价是内存峰值 +10%。
⚠ 语义已单独验证(判据 A 只跑 3 年、缓冲远未到上限,测不到这段代码):
用纯逻辑对比"旧裁剪 vs 摊销裁剪"取到的「最新 N 条」,四个数组逐条相同。
(构建 202610181910)
- 【口径提醒】户口份额仍应写四件套:
当前实际(引擎全量统计)| 标定 60.3473%(2024 上海统计公报)| 差 |
状态(规则已改、存量未重算、缓收敛)。
不要因为"修了 bug"就写成"已修复" —— 历史存量仍偏。
v1.5.7 历史
2026-10-17 发布 · 构建 202610172209 · 本版合并今日三次构建(财富榜 / 户口修复 / 迁入标记)
- 【关于版本号:今日的三次构建已经合并为一个】
本版今天先后构建过三次(
202610171120 → 202610172143 → 202610172209),
内容分别是「虚拟城市财富榜」「户口份额修复」「迁入标记与到城日」。
现在合并为同一个版本 v1.5.7 —— 因为同一天的改动对外只应有一个版本号,
否则客户与使用方无法判断「今天的版本」到底是哪一个。
如果你之前看到过 v1.5.5 或 v1.5.6,那是同一天的中间构建,
其内容已全部包含在本版,下面按「新 → 旧」排列。
线上接口现在报的版本就是 v1.5.7。
- 【新增三个字段:迁入标记与到城日】
查任何一位市民,现在都能看到
migIn(是否在模拟期间迁入)、
migDay(到城是哪一天)、bornDay(出生日)。
此前这三个字段只在脱敏导出模式(anon=1)下才有,
普通查询拿不到 —— 这不是"忘了",是分支问题:它们在脱敏分支里被追加,
而非脱敏分支没有。
- 【⚠ 字段语义速查:三类别用 bornDay 区分】
bornDay 有一个坑:迁入者的 bornDay 也是 0
(与"建城时就在"的人无法区分)。要区分三类人,必须两个字段合用:
- 迁入者:
migDay ≥ 0(值 = 到城虚拟日)
- 建城初始人口:
migDay == -1 且 bornDay == 0
- 在城出生:
migDay == -1 且 bornDay > 0(值 = 出生日)
⚠ 若用 bornDay == 0 当"本地原有居民",
会把约 3.7 万名迁入者混进去。这一条是使用方核 CSV 时发现的,本卡片已据此修正。
- 【为什么现在必须有:口径从第 7014 天起变成混合的】
v1.5.6 修掉了"迁入者被计为本地户籍"的问题,但只对新迁入者生效
(历史存量按可复现性原则不重算)。
于是"迁入者"这个群体里同时存在两套规则:
- 虚拟第 7014 天之前迁入的人:户口 100% 计为本地户籍(旧口径);
- 第 7014 天之后迁入的人:按 60.35% 本地 / 39.65% 外来 派生(新口径)。
⇒ 任何按"迁入者"做户口细分的统计,都会把两套规则的人混在一起。
有了 migDay 就能按 migDay ≥ 7014 切开。
这一条是使用方明确要求的:
「字段到位前我们标"口径混合、不可细分";到位后按 migDay ≥ 7014 切分」。
- 【口径提醒】用
migDay 切分时注意:
-1 表示非迁入者(旧快照也补 −1);
新口径组目前样本很少(切换才十几个虚拟日),
样本不足 500 时不宜报分布,只能报个数。
- 【本版只动接口,不动模拟】权威口径验收判据保持
9018C2374EB44444 不变
—— 这次改的是服务端返回的字段,引擎的模拟逻辑一行未动。
- 【修掉"迁入者被计为本地户籍"】这是使用方实测发现的一处口径失真。
此前每个迁入本市的人都自动算"本地户籍",而现实中他们是"外来常住"。
- 实测后果:本地户籍份额从标定值 60.3473% 漂到 62.8%(+2.48pp),
且随虚拟时间单调上升(迁入只进不出)。
验算到 0.007pp:60.3473% + 39.6527% × (迁入者 36,760 / 人口 586,943 = 6.263%) = 62.83%。
- 改法:迁入者的户口改为按与普通市民相同的比例派生
(不是"一律外来")。
为什么不是"一律外来":实测发现那样会过度修正——
新生儿随母落户,所以"迁入者的后代也算外来"会把份额越拉越低,
10 年反而偏低 2.44pp。数学上只有"同比例派生"能让份额稳定在标定值。
- 实测效果(3,000 人 × 10 年):份额漂移由 +1.55pp 收窄到 +0.10pp。
- 【顺带修掉一处"同一人因迁入被罚两次"】
犯罪风险模型里本来有两项:
外来常住 ×1.25 与 迁入者 ×1.35
(依《经济研究》2011 那篇"失业民工缺乏社会网络"的机制)。
旧逻辑下两项互斥所以看不出问题;一旦迁入者可能被算成"外来常住",
两项会同时生效 = ×1.69。已加互斥守卫——
迁入者的脆弱性只由"迁入"这一项体现,因为文献说的正是"迁入/无社会网络",
而不是"户口类别"。
修后实测:户口开关开启/关闭,犯罪与人口逐项完全相同
—— 这个开关因此成为纯"标签纠错",不改变任何行为。
- 【本版开启,但只对新迁入者生效】
快照里已存的约 3.7 万名迁入者保持原口径(不重写历史数据)——
因为历史调研记录必须能与"当时那个城市"对上,改了就永久脱钩。
因此份额会从 62.8% 缓慢向 60.35% 收敛,收敛速度取决于迁入速度(约 5.3 人/虚拟日)。
这一条是使用方提出的理由,比"成本"更硬:是可复现性问题。
- 【口径提醒(给引用本城数据的人)】引用"本地户籍份额"时必须带三件套:
分子 / 分母 / 门槛。当前应写:
62.8%(引擎全量统计,含未修正的历史存量) | 标定 60.3473%
(2024 上海统计公报「户籍常住/常住」口径)| 差 +2.5pp。
⚠ 不要用抽样接口算这个数:该接口是确定性系统抽样,同一虚拟日反复调返回同一批人,
会带来 1~2pp 的噪声。
- 【引擎】13,2xx 行(约 90 万字节)· 新增 1 个开关(默认关,本版由部署配置开启)·
权威口径验收判据保持
9018C2374EB44444 不变。
- 【新增:虚拟城市财富榜】一张可以看的榜——谁最有钱、哪一家最有钱。
- 三张榜:个人榜(含房净值)· 家庭榜(同一户内全体成员合计)· 个人榜(纯金融净资产,供对照)。
- 全城概览:人均 / 中位 / 基尼系数 / 前 1% 与前 10% 占比 / 有房率 / 负净值人数 / 房贷余额合计。
- 名次变化:每行标出与上一月相比的名次升降(▲▼)与净值变化 ——
这才是一张榜真正的信息量。
- 【为什么用"含房净值"而不是账面存款】
引擎里的
wealth 只是金融净资产。实测:有房户金融净资产约 −10.7 万、
无房户约 +15.5 万 —— 只看这个口径会得出「穷人更有钱」的倒置结论。
因此榜的口径是含房净值 = 金融净资产 + 房产(按所在区计价)− 剩余房贷,
与引擎自己的 cityNetWorth 完全一致(已做等价性断言:偏差 0.000000 元)。
房产按区计价:同一套房在黄浦与在崇明估值不同,与城市里的房价梯度一致。
- 【按虚拟历"每月算一次",不是实时】
榜的语义本来就是「一段时间内的结论」——天天变的不叫榜。
所以本版定成:每个虚拟月(30 天)统计一次,展示本月的榜单。
好处有三:① 计算量降到 1/30;② 月内榜单稳定;③ 有了上月可比,名次升降才有意义。
技术细节:同一虚拟月内的请求直接返回缓存(实测 1.2~2 毫秒);
跨月时重算一次,并把上一次结果降级为"上月榜"用于对比。
- 【性能】60 万人的城市首次计算从 4.5 秒优化到约 1.8 秒,
月内重复请求 1~2 毫秒。做法:按区预计算房价(区只有 16 个,
把 O(N) 次除法降到 16 次)+ 净值内联计算。
- 【口径边界,页面里也明写】「户」是引擎口径(同住者算一户,含与父母同住的成年子女),
与国家统计局的"家庭户"接近但不完全相同 ⇒ 本榜的家户数字不能与官方统计的家庭财富中位数直接比较。
负净值是真实状态(房贷余额可高于房产估值),不做截断。榜上的都是模型生成的虚拟市民。
- 【接入方式】新增接口
/api/wealthrank,页面 /city/wealth.html。
同时把站点的 /api/ 反代到引擎,页面因此可以同源取数(不再有跨端口与混合内容问题)。
v1.5.4 历史
2026-10-16 发布 · 构建 202610161621
- 【修掉"离婚一次、房子消失一套"】这是本版最重要的引擎修复。
此前离婚析产对夫妻双方都执行"房产折成现金 + 产权清零",
而一套房在产权模型里是 0/1 标记 ⇒ 每离婚一次净减 1~2 个房主,
房子在账上就此消失。
- 实测后果:线上有房率从建城标定的 61.3% 一路衰减到 41.7%
—— 而模型自己的目标是 59.6%(对齐上海城镇家庭自有率约 60%)。
用线上真实开关复跑,本模型在第 8 个虚拟年给出 41.32%,
与线上实测 41.72% 只差 0.4 个百分点 ⇒ 衰减机制被完全定位。
- 改法:离婚时房产由一方取得、另一方拿现金补偿
(与现实一致)——取得方承接全部按揭,补偿款从取得方财富里划出,
不凭空造钱;只给失去住房的一方记两年禁购。
- 效果与结论(跨种子实测 · 2026-10-17 补):正式实验为
20 臂 · 2,500 人 × 12 年 × 10 个快照,结果是
不建议开启 ——
- 有房率相对效应 −3.18%,95% 置信区间
[−5.89%, −0.47%](显著,方向为负);
- 人均财富相对效应 −4.65%,95% 置信区间
[−7.28%, −2.02%](显著);
- 其余 29 项指标(教育/健康/犯罪/婚育/迁移)全部跨 0
⇒ 证明该修复没有污染其它系统。
代价付了、收益没拿到 ⇒ 保持默认关闭。
机制原因:修复只在「有房夫妻离婚」时起作用,而线上真实状态下有房几乎
全靠逐年买入(8 年才约 100 人)⇒ 作用对象极稀少 ⇒ 效应≈0。
从真实快照复跑:关 4.416% → 开 4.371%,
差 −0.045 个百分点(1 个人)。
- 一处已撤回的表述:本卡片初稿曾写「有房率 38.58% → 42.75%(+4.17pp)」,
该数字不成立,已更正。它来自"从 61% 有房起步"的人为配置,
而非线上真实状态。教训:任何效应量都必须在其将被使用的那个状态下测量。
- 诚实边界:① 该修复由独立开关控制,本版默认关闭
(线上行为与本版前完全一致);② 开启会让人均财富显著下降
—— 现金补偿把取得方推入负债(现实中"买下对方那一半"确实如此);
③ 该修复在语义上正确(与现实一致),一旦将来把"存量住房"真正做进引擎、
使有房率进入 30~60% 区间,它就会成为有效修复;④ 真正缺口已锁定为
新生儿/迁入者没有获得既有住房的路径(实测 8 年新增成人 +89,
成为房主的仅 3 人)。
- 【新增四类独立度量产物 —— 把"看不见的量"变成看得见】
起因是一次数得清的失败:此前做学历类改动时,我们用了一个看不见学历的尺子
(主产物 84 列里没有学历),跑了 40 臂、约 11 小时,只得到无意义的结论。
⇒ 本版系统性排查了"哪些维度改了无法验证",并逐个补上独立探针:
- 健康(此前零度量):新增
health_probe ——
平均健康分、低健康占比、虚弱占比、分年龄档。
实测分年龄单调:0~14 岁 87.96 → 75 岁以上 68.50,虚弱率 0% → 100%。
- 犯罪/司法:新增
crime_probe ——
有前科占比、在押人数(含羁押候审/服刑拆分)、年立案/判决/释放、案件漏斗。
- 住房:新增
housing_probe ——
有房率、房价收入比(均值+中位+分位+超阈占比)、租金负担、月供负担、
买不起占比、分年龄档,并落盘收入与房价分布让每个比率都能当场验算。
- 连同既有的学历探针,本版共 4 类 8 个探针产物。
- 【统计汇总接入探针】跨种子置信区间报告新增第四层 15 个指标
(学历 3 · 健康 3 · 犯罪 3 · 住房 6),指标总数由 17 增至 32。
此前报告只读主产物 ⇒ 对学历/健康/犯罪/住房四类改动结构性失明;
本版把这个盲区消掉 —— 今后这几类改动都能自动出跨种子 95% 置信区间。
(诚实标注:接入已过结构验证,但尚未实跑过带住房探针的多种子批次。)
- 【接通两个"写了却从未生效"的机制】
- 购房逐门诊断:引擎里本有一套完整的"哪一道门在拒绝购房者"计数,
但既没有注入开关、计数也从不落盘 ⇒ 从未产出过。本版接通后首次跑出:
购房被调用 683.7 万次、成交仅 267 次,其中53.3% 卡在"家庭收入覆盖不了月供"
(年龄门槛只卡 0.0%)—— 瓶颈因此被精确定位,不必再推测。
- 房屋产权继承:其开关在虚拟机环境下读不到,导致实验中继承恒为关闭。
本版补上宿主注入,并经对照验证(关闭时继承 0 次、开启时 56 次转移 + 111 次空置)。
- 【引擎】仿真引擎现为 13,195 行(约 90 万字节 · 非空行 12,948)。
本版引擎改动全部由独立开关保护且默认关闭 ⇒
权威口径验收判据保持
9018C2374EB44444 不变。
v1.5.3 历史
2026-10-16 发布 · 构建 202610161113
- 【修掉一处"越年轻学历越低"的方向性错误】这是本版最重要的改动。
此前引擎只在 18 岁写一次学历,而那一刻的规则是"最多到大专";
22 岁与 25 岁两个本应"解封"的关口都没有重算
⇒ "18 岁落定的大专"成了终身学历。
- 造成的现象:模拟中出生成长的世代,本科及以上只占 2.9%,
而开城那一代是 15.2%(≈七普)—— 即"父辈学历远高于子辈",与教育扩张完全相反。
更隐蔽的是:全人口的大专+占比一直是对的(≈33.9%),
因为开城人口按当时实际年龄算学历 ⇒ 边缘分布掩盖了队列结构的错误。
- 怎么定位的:先排除"分位数被压低"(初始/新增的分位数都是均匀的),
再排除"映射表算错"(按当前年龄重算,截断值与存储值一致),
最后用逐人比对找到 25~45 岁里 24.5% 的人"存储学历低于按年龄应得"。
- 修复:补上 22 岁与 25 岁的重算(受独立开关保护,默认关闭)。
- 实测效果(同一人口 · 开/关对比):
本科+ 13.41% → 15.60%;且精准落在年轻人——
20~29 岁本科+ 4.2% → 17.1%(约 4 倍),40 岁以上基本不变。
这正是修复应有的样子:只影响"正在长大"的世代。
- 诚实边界:本次只解开"18 岁封顶",不产生"越年轻学历越高"的
队列效应 —— 那需要"按出生年的学历分布",而上海未发布"分年龄×文化程度",
属已知数据缺口。另外该修复是前瞻性的:存量市民学历不被追溯修改,
结构改善会随虚拟时间渐进显现。
- 【修掉一处会让整城崩溃的缺陷】当载入的快照缺少「前科」或「在押」这两个
按人数组时,刑事案件推进环节会直接抛异常、整个城市停止运行。
现已按本项目既有纪律补齐:缺的数组一律按人口补齐,绝不抛。
(该缺陷由多种子重复实验暴露:20 个臂中有 2 个在 2.2 秒内崩溃。)
- 【继续教育通道:在读不再受年龄限制】(承接 v1.5.2)
引擎真正记录是否在读,并支持复读 · 专升本 · 自学考试 · 成人高考 · 在职进修。
实测在读年龄分布:20~24 岁 29.7% · 25~29 岁 34.4% · 30~34 岁 12.4% ·
40~44 岁 6.9% · 50 岁以上 2.6%;最大入学年龄 60 岁,平均 29.2 岁。
- 【引擎】仿真引擎现为 13,123 行
(本版实测 · 约 89 万字节 · 非空行 12,876)。
本版引擎侧改动集中在学历队列结构与快照兼容性两处,
均由独立开关或"缺则补齐"保护 —— 关闭时行为与上一版逐字节一致
(判据 A
9018C2374EB44444 保持)。
v1.5.2 历史
2026-10-15 发布 · 构建 202610151828
- 【全学段教育:在读状态、年级与升学关口】虚拟人档案现在能看出"孩子在读几年级":
- 在读学段与年级——按真实学制给出「本科在读 / 硕士在读」等状态;
同一年龄的人不在同一年级:入学年龄截止日(出生在下半年者晚一届,约占三分之一)
叠加少量复读与跳级。
- 升学关口——档案显示这位市民经历过的小升初 / 中考 / 高考结果原文
(如「中考:考入市重点高中」「未达普高线,进入中职或三校」)。
这些是城市运行中真实记录下来的事件,不是事后推算。
- 日常作息按学段与年级区分——同为小学,低年级以识字与拼音为主,
高年级进入小升初复习;大学高年级是毕业设计 · 求职或考研。
- 口径边界:在读状态按学制推出,属可解释的近似,不是凭空估算。
⚠️ 本版稍后已升级为真值——引擎现已真正记录「是否在读」,见下方『继续教育』一条;
这条保留为本版最初的推算口径。
- 【学校供给可按学段分别设定】此前学校供给等级只影响 15~25 岁;
现在可按幼儿园 / 小学 / 初中 / 高中 / 高校分别设定,各自影响对应年龄段。
默认不启用:未配置时行为与以前完全一致,不给既有市民带来任何变化。
- 【高校地点层:真实校名 + 真实坐标】已备好 66 所上海高校的真实位置
(来源:OpenStreetMap 公开数据),每所都校验过落在其所属行政区内;
⚠️ 本版稍后已在地图上启用,见下方该条。最初一版曾用"虚拟校名 + 模型生成坐标",
后来改为真实校名时坚持坐标也必须真实 —— 否则等于告诉读者一个错误的真实位置,
比用虚拟名更糟。
- 【继续教育:在读不再受年龄限制】此前"在读"只是按学制推算的显示口径,
而且22 岁以后不再有在读表达。现在引擎会真正记录是否在读,
并支持复读 · 专升本 · 自学考试 · 成人高考 · 在职进修:
- 为什么改——中国允许成人高考、自学考试与复读,相关规则里
没有年龄上限,门槛是学历层次(想读本科须已有专科或同等学力)。
此前模型把学历写成年龄的函数且 22 岁截止,与真实规则不符。
- 现在能看到——档案里 30 岁、40 岁甚至 50 多岁的人真的在读书,
且学历逐级提升、不跳级(读本科者必有专科)。
- 实测年龄分布(离线 50 年验证 · 5,000 人 · 1,660 次入学事件):
20~24 岁 29.7% · 25~29 岁 34.4% · 30~34 岁 12.4% · 35~39 岁 9.8% ·
40~44 岁 6.9% · 45~49 岁 2.9% · 50 岁以上 2.6%;
最大入学年龄 60 岁,平均 29.2 岁;在学规模平均约 54 人(全部为成人继续教育)。
- 四条判据全部通过:在读不受年龄限制 ✅ · 不跳级 ✅ · 在读年龄呈长尾 ✅ · 长期稳定不发散 ✅。
- 长期影响:50 年里"大专及以上"占比从 28.3% 升到 31.8%(+3.5pp)——
继续教育在起作用的自然结果,不是学历膨胀。
- 【高校地点层已上线】上面备好的 66 所真实高校现在已画在地图上,
真实校名 + 真实坐标(来源 OpenStreetMap,ODbL 许可,图上已署名),
分布与真实地理吻合(杨浦 · 徐汇 · 松江大学城密集)。
想关掉:网址加
?campus=0,或控制台执行
localStorage.setItem('campus_layer','0')。
- 【修掉一处会"冻住地图"的缺陷】校园图层是可选装饰层,
但它此前一旦绘制出错,会让整个地图渲染循环停止(表现为画面静止、不再刷新)。
现已加保护:该层出错时只自动关闭它自己,地图照常运行,
并在浏览器控制台留一条说明。教训:可选层不该有能力杀死主循环。
- 【档案接口新增两个真值字段】
/api/citizen 现在返回
enrolled(是否在读)与 enrollEnd(预计毕业日)。
此前只有按学制推算的显示口径,无法从外部确认"引擎里真的有在读的人";
现在可以了 —— 这是把展示层从"推算"切到"真值"的第一步。
- 【运行观测增强】服务日志的 memwatch 行现在带日均耗时 / 人均耗时,
可直接判断推演速度是正常还是变慢,不必再靠日志时间戳推断
(该日志本身没有时间戳)。
- 【引擎】仿真引擎现为 13,067 行
(本版实测 · 约 89 万字节 · 非空行 12,820)。
引擎侧改动集中在两处:全学段教育(学段/年级/在读状态的推算、按学段分别设定学校供给)
与继续教育通道(是否在读 / 预计毕业日两个按人字段、学历层次逐级提升与中断重返)。
新增随机性全部由市民编号派生、不消耗随机流;继续教育通道默认关闭,
关闭时引擎行为与上一版逐字节一致(判据 A
9018C2374EB44444 保持)。
v1.5.1 历史
2026-10-13 发布 · 构建 202610131144
- 【户口分层改为真实口径】v1.5.0 里写的"城市 / 县城 / 农村三档"是错的,本版修正。
两条原因:
- 上海没有"县"——崇明 2016 年撤县设区,全市 16 个区;
"县 / 镇"是乡镇层级,不是户口类型。所以"县城"这一档在上海无处对应。
- 更要紧的是:v1.5.0 的"城市 / 县城"拆分比例(72 / 28)
没有任何官方来源,是把两条互相正交的统计轴混算了——
城镇化率 89.85%属于「户口性质:非农 / 农业」,
而户籍常住 / 外来常住属于「户口登记地:本地 / 外地」。
把这两条轴的数字相减去凑一个"中档",算出来的数没有现实对应。
- 【上海现在只有两档】按 2024 年上海统计公报的官方单列数字:
本地户籍 60.35%(户籍常住 1,496.77 万)·
外来常住 39.65%(983.49 万)—— 两者之和 = 常住人口 2,480.26 万 = 100%,
是对常住人口的完备二分。
⚠ 官方口径释义:外来常住 = 离开户口登记地半年以上的外省、自治区、直辖市的人口
⇒ 必然非本市户籍(该指标官方正是用于民工子弟学校配置、居住证与就业证办理)。
- 【为什么没有"农村"档】官方没有单列上海农业户口人数(统计年鉴无此项)。
若强行做三档,就必须假设"全部 983.49 万外来常住都是非农",
而这个假设没有官方依据 ⇒ 宁缺勿猜,本版不设该档。
- 【其他城市仍然能用】分层定义改为由各城声明,引擎不再假设任何城市的档位构成:
- 有县城市(石家庄 / 重庆 / 西安 / 成都…)⇒ 三档:城市户口 / 县城户口 / 农村户口,
比例取本城统计公报的行政区划口径;
- 无县城市(上海 / 北京 / 天津 / 武汉…)⇒ 按本城公报有无单列决定两档或三档。
已用两个假想城市实测机制:有县口径(45/20/35)⇒ 实测 44.80/20.24/34.96;
无县口径(70/22/8)⇒ 实测 69.86/22.00/8.14。
- 【不影响仿真】户口在本引擎里是纯标签(只用于调研问卷分层抽调),
不做任何行为影响,且由 (seed, id) 哈希派生、不消耗主随机流
⇒ 建城与仿真轨迹与上一版逐字节一致
(判据 A
9018C2374EB44444 保持),改的只是分层标签与口径说明。
- 【顺带修好一处前端缺陷】页面顶栏的版本号此前一直显示前端内置的旧常量,
原因是接口返回的版本字段没有被写回页面读取的那个对象(顺序对、对象错)。
本版修好,并把接口漏发的版本说明(APP_NOTES)补上——
于是"📄 版本 → 展开说明"现在能看到真实的版本说明。
v1.5.0 历史
2026-10-12 发布 · 构建 202610122200
- 【司法体系】城市第一次有了完整的纠纷化解链条:四层漏斗
(协商 → 调解 → 仲裁 → 诉讼)、合同、上诉(二审)、以及法官岗位与法定学历门槛。
标定锚点全部取自公开口径:上海诉讼率 347 件/万人/年、诉前分流率 57.01%、
自动履行率 95.36%、上诉率 ≈11%(即 89% 服判息诉)、
小额诉讼上限 73,099.50 元(终局)、执行到位率 54.29%。
法官门槛依《法官法》第 12 条(本科 + 法律职业资格 + 5 年法律工作)与第 25 条(员额制)。
实测:全市 1,475 名本科以下市民中法官 0 人(1,721 人全量扫描);
6 年年度复验无漂移;上诉率 11.4% 对官方 11%。
- 【户口分类】原来只有"城市"一档,本版细分为
城市 / 县城 / 农村三档(城镇化率对齐上海 2024 年统计公报 89.85%),
并且调研问卷可以按户口分层抽调。迁入人口按城市户口;
新生儿随母。实测:城市 65.85% / 县城 24.32% / 农村 9.83% ⇒ 城镇化率 90.2%。
- 【犯罪成因】此前犯罪只有"哪些类型"和"什么后果",
没有个体动机 —— 抓的是谁基本靠均匀随机抽。
本版给每个人一个风险乘数:经济压力(负债 / 破产 / 家庭月供缺口)、
失业 × 脆弱性(农村户口、迁入者)、健康冲击、性格与情绪、职位便利、关系冲突。
方向按实证文献校准(章元等《城乡收入差距、民工失业与中国犯罪率的上升》,
《经济研究》2011:失业而非收入差距是主因,机制是脆弱性)。
⚠ 乘数已均值归一 ⇒ 只改变"谁更容易犯罪",不放大犯罪总量。
实测:失业 ×2.39、失业且农村户口比城市户口高 26.9%、负债 10 万 ×2.36、职级 ≥5 ⇒ 涉案额 ×3.25。
⚠ 诚实标注:除"失业 × 脆弱性"有文献支持方向外,所有倍数均为模型假设,
中国没有"负债 10 万使犯罪率上升 X%"这类权威公开数据。
- 【住房:修掉三个真缺陷】
- 断供判据缺一项:原判据不检查"是否真的欠着贷款",导致没有月供的自有房主
在财富转负时也会以"因无力偿还按揭"被处置房产。
修正后按户有房率 +9.49pp(y12 28.0% → 37.5%)、断供触发 −63%。
- 存量房主从未标定:线上一直走快照恢复路径,而建城标定只在第 0 天执行
⇒ 有房率只有 2.54%(14,506 个房主里 14,448 个有贷款)。
新增一次性存量引导(保留已有房主,只补缺失存量)⇒ 线上 2.54% → 47.5%。
- 房产没有继承:此前遗产只分金融财富、不分房产,房子随人口更替单向消失。
本版按法定顺序(配偶 → 子女 → 父母)转移产权与剩余房贷,无人继承则空置。
⚠ 已知偏差(已写进接口):住房自有率仍有约 12pp 缺口,
根因是"购房窗极窄(仅已婚 25~45 岁可买)+ 标定存量集中在 54~72 岁"。
实测拆掉全部可负担性门槛后成交涨 2.6 倍,有房率仍下降
⇒ 不可用于住房政策实验,也不宜与官方绝对值对标。
- 【政府账本随快照持久化】此前快照不保存政府账本
⇒ 每次服务重启国库归零 ⇒ 地铁(单级 ~24 亿)永远攒不够钱,手动"建地铁"总被预算拒绝。
本版把账本写入快照并在恢复时读回。实测:跨月界后快照 meta 含 gov,
treasury 1,643,698,145 元完整保留。
- 【手动干预不再"假成功"】此前
/api/intervene 丢弃返回值、无条件回
{ok:true},而预算不足时政策一个字段都不改
⇒ 前端无法区分"成功"与"因预算被拒"。现在如实回报
ok / applied / reason / need / treasury。
- 【验证与记录】本版沉淀了 8 条验证纪律(见版本记录附录),
其中最重要的一条:"日志里没有" ≠ "没有发生" ——
应用日志被重定向到文件而不在 journald 里,我曾据此误判"记账从未执行"并做了 3 次无谓部署。
全部验证套件:司法 9 套件 / 135 断言、犯罪成因 CC-1~8、户口 HK-1~10、
房产继承 HI-1~7、婚介所 B2-A~H、政府账本持久化 —— 全部通过;
判据 A 9018C2374EB44444 保持(所有新功能默认关,关时与改前逐字节相同)。
v1.4.0 历史
2026-10-11 发布 · 构建 202610111400
- 【数据基础 · 可验证性】本版最重要的方向是让城市的数字可以被外部核对:
- 公开数据集脱敏:新增
anon=1 导出 —— 每个个体只给一个
不可反推的匿名编号(哈希;固定盐下稳定、可被引用),
姓名与内部编号一律不导出;不传该参数时行为与从前完全一致。
- 固定盐:匿名编号用的盐由服务器环境变量决定,请求方无法用自己的盐改变编号
(否则同一人在不同导出里编号不同,数据集就无法对齐、无法引用)。
- 时序归档:引擎里所有日志原本都是"最近 N 条"的滚动缓冲
(出生/去世只覆盖约 100 个虚拟日,城市级指标只留 200 天),
问"五年前谁结婚了"无数据可答。本版新增追加式磁盘归档:
城市级指标 + 个体级关键事件(结婚/离婚/生育/去世/就业/失业/犯罪/破产等 19 类)
永久积累,并新增只读导出接口。
⚠ 归档只从建成之后开始积累(1 虚拟年 ≈ 14.6 真实小时)——
要得到"五年预测窗口"的数据集需要约 3 个真实日。
- ⚠ 归档从源头不记录事件文本(文本里含姓名),因此天然不存在姓名泄露,
而不是"导出时再剥离"。
- 【银行真正开始放贷】上一期银行只是"有账目",这一期贷款落地:
房贷按每户已有余额汇总进银行资产;企业按"留存够不够投资"决定借款或还款。
实测 1,200 人城市:45 户有房贷余额,银行资产端与逐户账目逐位对得上。
- 【信贷配给(数量约束)】放贷不是无限的:贷款规模受
上海贷存比 53% 约束(本地资金归集型中心,远低于全国 80%)。
触及上限时多出来的贷款需求会被拒绝(利率不变、数量受限)—— 这就是"配给"。
实测贷存比精确停在 0.5300。
- 【利息有了来源与去向】借款人付的利息 = 存款人收到的利息 + 银行的净息差。
实测(1,200 人城市):借款人每月付息 10.9 万元,其中 7.7 万元付给存款人、
3.2 万元是银行息差。⭐ 居民的财富收益终于有了对手方。
- 【房贷利率改用真实利率】月供利率由基准 + 利差决定(3.50%),
而不再是固定值(原 4.50%)。⚠ 仅金融层开启时生效。
- 【研究结论(本版新增三节报告)】
- 政策组合:生育补贴与住房调控的效果近似完全叠加(实测比值 1.01)
—— 两者走不同通道,可并行推进,互不浪费。
- 财政效率:由账目实测,每多出生 1 人的财政成本约 3,900 元(年均口径)。
- ⭐ 四道闸拆解:限制生育的不是婚姻、年龄或生育间隔(各只值约 5%),
而是「目标孩次」本身(放开后 +87.8%)—— 这解释了为什么补贴只带来约 +4.2%:
政策只能"帮人达到目标",改变不了"目标是多少"。
- 【引擎】仿真引擎现为 10,191 行(本版实测 · 约 70 万字节 · 非空行 10,020)。本版新增一项引擎能力(按指定资料注入一位新市民),并清除了若干处历史遗留的重复与占位代码;该新能力默认关闭,关闭时引擎行为与上一版逐字节一致。
- 【金融体系开工(第一期)】城市开始有银行。此前居民的财富是一个"悬空的数字":
它每年获得收益,但没有人支付这笔收益。现在补上了这个位置 ——
银行的资产是贷款、负债是居民存款,居民拿到的利息来自借款人付的利息。
- 【利率按真实口径】利率不再是一个拍出来的数,而是基准 + 利差:
基准取 1 年期 LPR 3.00%;房贷 3.06%、企业贷款约 3.10%、
存款利率 1.31%(均取自央行 2026 年一季度货币政策执行报告)。
另外纳入资本充足率 15.26%、存款准备金率 6.2%。
上海贷存比 51~53%(远低于全国 80%)也按上海口径取用。
- 【修正一处会计错误(开发中)】第一版把"居民财富的一部分当作银行存款",
结果资产负债表的权益为负——会计上不成立。根因是居民总财富里包含房产等实物资产,
这些并不是银行的负债。现已改为按"贷款创造存款"记账:
银行每放出 1 元贷款会派生出约 1.89 元存款,准备金由恒等式配平,权益恒为 0(纯中介)。
经合成数据核对,贷存比恒等于 53%、利息收支三角恒等。
- 【工资怎么定 —— 第一次接上真实机制】此前工资只是"随年代上调的一个系数"。
现在它由劳动的边际产出决定(即"多雇一个人能多产出多少",这是经济学里工资的本源),
并且叠加了名义工资粘性:现实中工资不会瞬间调到均衡,而是分批、滞后地调整
(依据 Calvo 粘性 0.33/季度 ⇒ 平均约 4~8 个月调一次)。
⇒ 工资因此系统地滞后于生产率,滞后幅度由粘性强度决定。
- 【企业的钱从哪来、到哪去】新增企业资金流账目:
产出 − 工资 − 税 = 留存;留存与投资(投资率 33%,世界银行口径)一比,
就能看出企业是否需要外部融资。实测(1,500 人城市):留存约占产出 37.6%、投资占 33.0%
⇒ 留存足够、企业不缺口(税率 20% 下);税率升到约 30% 才会出现融资需求。
资本存量按"投资 − 折旧"累积。
- 【通胀会抑制经济】此前物价只是个数字。现在通胀真的会起作用:
物价涨得快 ⇒ 企业减少投资、居民减少储蓄、提前消费(保值动机)。
两条通道都按可标定系数缩放,且通缩时方向自动相反(不抑制)。
- 【本期新增:系统已启用】技术增长、内生技术突破、工资决定、企业账目、通胀抑制、
银行 —— 现已全部开启并投入运行。城市会按这些机制真实演变:
收入上升、期望寿命延长、技术按研发积累跃升、月供按真实利率计算。
为避免重复计算,「资本深化」与「工资决定」只启用其一(二者数学上等价)。
- 【修正一处严重缺陷】启用过程中发现并修复了一个隐蔽但致命的问题:
服务启动时的参数桥接会把整套经济参数表覆盖成一个布尔值,
导致经济系统与银行系统整体静默失效 —— 表面「已启用」,实际一项都没生效。
该缺陷自上一版引入、潜伏数小时,在本次启用时被查出并修正。
同时增加可外部核对的接口:可直接查询每个机制的开关状态。
- 【版本号改为单一来源】此前版本号硬编码在至少 6 个文件里,改一处必漏一处。
现由引擎统一提供、页面直接读取,今后只改一处即可全站同步;
并修复「静态资源版本参数未更新导致浏览器一直使用旧文件」的问题。
v1.3.0 历史
2026-10-08 发布 · 构建 202610081100
- 【引擎】仿真引擎 7,148 行(v1.3.0 发布时实测)。
- 【修复】羁押逻辑:被抓捕候审或正在服刑的市民,此前仍会照常开始交往、约会、分手、婚外情
——因为“约会”这条支路从未检查在押状态,而档案里的日程也照样把约会条目拼在监室日程上。
修后两处同时加判据(模拟与显示各一处),在押者不再产生也不显示约会事件。
- 【财政】建设与维护此前用了两套价格:建设按硬编码(地铁 2.5 亿/级),
维护按真实资产值(地铁 180 亿/级)⇒ 两者相差 17~72 倍,
结果是“建一次太便宜 ⇒ 钱永远花不完”。本版统一按真实资产值,
并改为一处计算、三处读取(含对外探针,避免“探针与真算不一致”)。
- 【基建】“1 级 = 500 公顷绿地”对一座 2,500 人的城市是国标的 1,250 倍
(人均 10,000 ㎡,而标准是 8 ㎡)——规模越小越离谱。本版改为按人均指标缩放:
绿地锚定《国家园林城市标准》人均公园绿地 ≥8.00 ㎡/人,
医院锚定每千人 6 张床位;地铁与学校的锚无国标原文,已如实标注为模型假设。
- 【门禁】绿地补上最小人口门槛,与地铁/医院/学校三个领域保持一致
(此前绿地不设门槛,导致小城市也被要求建 500 公顷)。
- 【工具】新增逻辑自洽性检查器:检查时间线单调、在押期间不得约会、
死亡后无事件、事件不早于出生;并严格区分“通过”与“未执行”——
字段缺失时报“未执行”而不是“通过”(首版曾因此假通过)。
- 【说明】以上四项中,羁押修复默认生效;
财政、基建、门禁三项由开关控制(源码默认关闭)——
而本演示实例已【全部启用】,故城市行为已随之改变。
- 【已上线】政府层已在本演示实例上公开开启:这座城市现在会
收税 · 受预算约束 · 按缺口优先级决定基建 · 支付维护费 · 让设施随年限折旧。
需要说明的是,它的“财政紧不紧张”与真实世界一致——基建投资占财政收入的比例本来就不高
(对照:上海全部公园绿地存量 ≈ 0.17 年的财政收入),所以不必期待看到“财政吃紧”;
若人为让它吃紧,反而会把结论弄反。
- 【怎么看】要直接看到政府在算,打开
魔都视图顶部的 🏛️ 政府层 状态条:
本月税收 · 本月维护 · 财政结余 · 收支比,以及
🚇地铁 / 🏥医院 / 🏫学校 / 🌳绿地 四个领域的当前等级。
- 【注意】政府层只在虚拟月月末结账(
day % 30 == 0),
因此月初打开时金额可能显示「—」而等级仍可见——这是正常,不是故障。
v1.2.0 历史
2026-10-05 发布 · 构建 202610050030
- 【数据】48 项城市参数换成官方口径:房价 58,994→55,500(来源如实降级为平台)、
低保 1,500→1,690、退休金 3,200→5,542、最低工资 2,690→2,740、
岗位结构重标定(公务员目标占比原为官方 21.11 倍 ⇒ 项目自带判据首次达标)、
气温 12 个月全部换成气象局口径(年均 17.50→18.20℃)。
- 【修复】3 处会算错数的缺陷:分区学历分布(大学及以上原高 3.6~6.0 个百分点,
修后与七普表 2.13 的 16 个区逐位一致);家庭姓氏一致性(同一家人的孩子姓氏不一致,
而“同姓优先配对”建在错的姓上);统计报表把无子女率报成 100%。
- 【新能力】政策预判:可对同一初始状态做“做 vs 不做”的对照实验,
输出带 95% 置信区间的逐项差异(已用 10 条独立随机流验证)。
- 【运行】⚠ 线上城市时间流速已调慢(标称 3600→600,实测 ≈480:1),
以降低服务器 CPU 占用(实测 63.6%→约 16%);同时清理了 486MB 陈旧存档。
v1.1.1 历史
2026-10-01 发布 · 构建 202610012200
- 【引擎】仿真引擎 7,994 行(v1.1.1 实测),
引入功能开关体系与 111 项可标定参数(每项都带出处,或明确标注为模型假设)。
- 【婚配与生育】每位市民按第七次全国人口普查的孩次分布拥有自己的目标孩次
(无子女 10%(= 模型 parity[0] 4.5% + 同性取向 5.5% 两条来源) / 1 孩 48% / 2 孩 36% / 3 孩及以上 6%);
结婚按年龄别结婚风险与择偶评分匹配,形成真实的婚姻市场。
- 【医疗与医保】住院费用按医保分档报销、大病保险二次报销、自付封顶;
自付超出家庭承受力时,依次触发借债、破产与放弃治疗。
- 【家庭经济账本】每个家庭按「收入 − 生活消费 − 子女教育支出 − 房贷/房租 − 医疗自付」
逐月记账,可产生结余或负债;配套购房与按揭(首付、月供、断供处置)与遗产继承。
- 【钱的稀缺性】让"钱"成为真正稀缺的资源:
- 资产性消费:超出应急储备的资产按年率提取,对应自有住房的隐含租金、
耐用消费品、给子女的转移与自费医疗;
- 父母为子女购房出资:双方在世父母按需出资,设有出资上限与自留比例;
- 成年子女赡养父母:父母进入需要照护的年龄后,子女按月转移赡养费;
- 收支按月度流量计入:收入、消费、教育支出、房贷/房租、医疗自付统一按"每月一次"折算。
效果:人均财富回到与月收入相称的量级,买房、婚育重新受经济能力约束。
- 【家庭一等实体】居住与居住成本以户为单位、按现实规律结算:
- 与父母同住不承担房租:本地年轻人婚前(乃至婚后)通常与父母同住,
因而没有租房支出;只有收入足以支持独立租房或购房时才搬出去。
是否离家由房租与收入之比决定 —— 租不起就推迟离家,这就是"啃老"的真实机制。
- 合租分摊:没有父母可住、且收入不足以独租的年轻人(典型是刚到本地工作的外地青年)
选择合租房,按同住人数分摊房租 —— 房租占收入越高,合租人数越多(最多 4 人)。
- 有房者不再重复计租:住房成本只计一次。
- 户内结算:父母为子女购房出资、成年子女赡养父母、照护失能父母、隔代照料,
都在同一户内按等价规模折算。
标定后破产率 7.6%;22~35 岁有父母在世的年轻人中约 49% 与父母同住,与上海的现实结构吻合。
- 【家庭生命周期】家庭随成员年龄推进而演进:
- 照护失能父母:父母高龄且健康下滑后,成年子女按金钱与时间两条通道分担照护,
负担与兄弟姐妹数量、本人收入相关;
- 独居老人的超额风险:独居且健康不佳者死亡率高于同条件的同住者,心情也受负面影响;
- 隔代照料:祖辈参与照料孙辈,减轻中间一代的时间压力并提升祖辈心情。
- 【健康行为】市民从成年起按人群比例与年龄分布拥有自己的吸烟、饮酒、锻炼习惯,
并参加年度体检。这些行为通过三条通道作用于每个人:
- 健康衰减:吸烟与过量饮酒加快健康下滑,规律锻炼减缓;
- 死亡风险:按行为风险比缩放个人死亡风险;
- 慢病新发:行为影响高血压、糖尿病等慢病的发生。
体检有早发现效应:定期体检者更早发现疾病、治疗更及时,重症与放弃治疗的比例更低。
行为人群比例按全国调查口径标定(成年男性吸烟率约 36%、女性约 2%),并随年龄变化。
- 【人生里程碑】升学、就业、晋升、降级、跳槽、结婚、生育、离世等关键节点逐条留痕,
可在市民档案里追溯一生轨迹。
- 【治安与刑罚】刑事案件具备完整后果链:
立案 → 羁押候审 → 审判 → 缓刑 / 服刑 → 释放 → 前科。
- 重罪立案即羁押候审,轻罪取保候审。
- 在押者的「今日日程」为监室内的一天:羁押候审=监室教育学习与放风;
已判决服刑=劳动改造与技能培训,并显示罪名、刑期、已服月数与剩余天数。
- 市民档案显示在押状态、涉案罪名、案件阶段(待审判 / 已判决 / 已结案)与前科次数。
- 在押者不出现在城市地图上,在押期间没有工作、不能结婚;服刑对婚姻有冲击。
- 经济案件与刑事案件同样进入该链条。
- 【未成年人保护】刑事案件当事人限定 18~70 岁;
未成年人一律不羁押,按「责令监护人严加管教」处理并追究监护人责任(罚金 + 记入家庭记录);
18 岁以下不显示性取向(显示「未定」,成年后正常显示)。
- 【存档】住房、房贷、孩次、生育目标、案件记录、在押状态、前科、破产、消费、
教育支出等每人状态全部写入存档,服务器重启可完整续跑。
- 【今日日程】时刻严格按时间顺序排列,就寝随下班时间顺延(封顶 24:00,即午夜);
非整点时刻统一显示为 HH:MM(如 20:30、23:30)。
- 【环境与健康】空气质量按上海市生态环境局公布的 2024 年 PM2.5 年均值
28.4 微克/立方米标定;污染对死亡的影响采用覆盖 6,122 万例死亡的全国性研究
(PM2.5 每升高 10 微克/立方米,全因死亡风险上升 0.22%);
健康成为真实指标,随年龄、吸烟、饮酒、锻炼、加班与通勤分化;
启动限行、增建绿地、户外活动受限、呼吸系统疾病死因、空气质量影响心情等 5 条联动生效。
- 【收入与经济景气联动】居民收入随城市经济景气变化:
- 景气上行时工资水平随之提高,下行时相应回落 ——
此前收入与经济景气相互独立,经济类政策无法传导到居民收入;
- 创业收入同样随景气变化(高风险高回报,波动更大);
- 公务员工资保持稳定:仍受工资带约束,不随景气大幅波动(与现实一致);
- 收入按月结算,与经济景气、职级晋升、岗位匹配度共同决定。
- 【政策沙盘可用】经济类政策(经济刺激、景气波动等)现在能真实作用于市民收入:
- 可在不改变其他条件的前提下推演"若经济景气提高 X%,这座城市会怎样";
- 同一批市民在两种情形下的差异可以逐人对比(市民 ID 不变),
而不是"换一批人再看一遍";
- 与仿真调研平台联动时,可直接生成反事实问卷对比:同一份问卷、同一批人、两种政策。
- 【房贷账本】按揭按现实规则结算:
- 30 年等额偿还:贷款按 360 个月逐月摊还,本金与家庭现金同步结算;
- 按家庭收入判定可负担性:夫妻共同还贷,收入合并计算 ——
收入差距大的夫妻不再被误判为"买不起";
- 按收入比例分摊月供:收入高的一方多负担,两人负担率相同;
- 单身与离异者按本人收入独立判定。
- 【代际支持】三代之间的资金往来:
- 父母帮首付:双方在世父母按需出资(设有出资上限与自留比例);
- 父母帮月供:只在两口子收入不足以覆盖月供与家庭开销时才介入,
按缺口补足,并从父母财富中实际扣除;
- 父母自身也在还房贷时,资助能力大幅降低;
- 祖辈(爷奶/外公外婆)少量支持;父母资金特别宽裕时上限更高;
- 成年子女赡养父母:父母收入低于基本生活线时按月补足。
- 【住房体系】让"有没有房"成为真实的经济现实:
- 存量住房:建城时按上海城镇家庭住房自有率(约 60%)初始化房主结构,
含"已还部分房贷"的差异(越年轻剩余贷款越多);
- 住房四档:自有房(无贷)· 自有房(有贷)· 租房 · 与父母同住,
四档都由真实的经济能力与家庭结构决定;
- 离婚析产、断供处置、遗产处置均按所在区的房价结算。
- 【分区房价】16 个区各自定价,市中心与郊区拉开差距:
- 真实价格:黄浦 108,649 元/㎡ · 徐汇 80,248 · 普陀 59,185 ·
嘉定 37,265 · 金山 14,677 · 崇明 14,659(最高与最低相差 7.4 倍);
- 全市均价 58,994 元/㎡,租售比 2.05%(年),与官方口径一致;
- 租金按区结算:市中心与郊区的房租差距同步体现;
购房、断供、析产、继承全部按所在区取价。
- 【财富口径】新增含房净资产:
- 房产价值计入家庭净资产,与金融资产并列输出两个口径;
- 父母的资助能力按含房净资产评估 —— "房子已还清、现金不多"的家庭
不再被误判为无力帮衬子女。
v1.0.1 匹配度
2026-09-23 发布 · 构建 20260923-1226
- 匹配度系统:每位市民都有两项新指标——人岗匹配度(能力、学历、性格与岗位的契合程度)与伴侣匹配度(与配偶/恋人的性格与条件相容程度)。
人岗匹配度主导晋升与降级、影响同岗位内的收入高低、决定谁更容易失业与被调岗;伴侣匹配度影响夫妻吵架频率、离婚与出轨倾向、以及生育概率。
- 人口统计面板新增「匹配度」一块:全市平均人岗匹配度、低匹配(低于 0.5)在业人数占比、平均伴侣匹配度,以及两者的分档分布(表格 + 条形),
与年龄段 / 收入 / 外来人口三块并列,每个虚拟日刷新一次。
- 市民档案新增两项:查任意一位市民,在"职业 / 收入"旁即可看到本人的人岗匹配度与伴侣匹配度,并附一句中文释义
(例如"能力与岗位很匹配 / 比较匹配 / 一般 / 不太匹配",以及"与伴侣很合拍 / 比较合拍 / 仍在磨合 / 不太合拍")。
- 人口模型修正:用年龄别生命表取代原来"粗死亡率硬压"的做法;用目标总和生育率取代粗出生率锚定;
建城时换区改为档内重抽(区县分布更贴合七普);迁出按年龄加权(年轻劳动力流出更多)。
建城即刻的年龄结构:60 岁以上约 23.4%、65 岁以上约 16.2%,与统计公报基本对齐。
- 多城构建能力:同一套引擎可为不同城市生成各自的人口结构与经济档案(线上常驻:魔都、石家庄)。
- 活的城市:通勤耗时逐日浮动;晚间去向每天分岔(直接回家 / 加班晚归 / 吃饭逛街 / 去约会,约会接的是引擎里真实发生的那一场);
晚间外出在地图上按去处分色——🟣 粉紫=去约会、🟠 橙色=加班晚归、🔵 青色=吃饭逛街(原来只有一个"晚间外出"色,看不出去了哪儿);
地图白点每个虚拟日重新抽样,所以去世、成年、新迁入的人都会如实反映在地图上。
- 外来人口按正常能力与学历生成(旧版迁入者能力偏低是建模缺陷,已修正);迁入者收入对标本地人。
- 恋爱约会轨迹与完整婚恋史:交往、约会、分手、结婚、离婚、丧偶都会留痕,双方都能在档案里查到,并可持久化保存。
- 版本更新记录页(本页):城市页页脚与选择城市页都能进入。
- 单机演示版(
offline.html)同步到本版:此前它跑的是旧引擎,现已整包更新——
图例补上晚间三色、白点带上当晚真实去向(含"去约会"那一场真的约会)、📊 人口统计面板与档案里的
人岗 / 伴侣匹配度全部与线上城市页一致,并新增本页入口;页面完全在浏览器里跑,无需服务器。
- 【修订】地图图例:城市页的图例此前被每帧写死的旧文案覆盖,实际一直只写"金色=通勤中",
晚间三种去处分色(🟣 约会 / 🟠 加班 / 🔵 逛街)一个都没提;现在线上与单机版统一以同一份文案为准。
- 【修订】"去约会"的白点看得见了:全市每天真在发生几百到几千场约会,但地图是"每区 600 位"的
抽样(约 1%),而"晚间外出"还要先掷一次时段分岔(约会 8%),于是粉紫点在图上只剩 0~2 个。
现在当晚真的在约会的人一定出现在地图上(不占抽样名额),并在地图上标出约会的具体地点。
- 【修订】晚间外出的地点:原来把"区名"当成"区号"传给了地图,导致加班 / 逛街 / 约会的点
全部退回工作区(说好去外滩,点画在公司);现在按真实所在区落点。
- 【修订】单机演示版点「经济」页签会白屏卡死:经济页引用了只在另一个函数里声明的局部变量,
点下去即抛
ReferenceError;由于渲染循环的自我注册写在出错点之后,
地图与时钟会停在最后一帧(需刷新页面)。现已修正,五个页签逐一切换实测正常。
v1.0.0 启城
2026-09-18 发布 · 构建 20260920g
- 首版:100 万虚拟市民的自治城市仿真。
- 真实统计口径建城:行政区划、人口年龄与学历结构、产业结构与岗位、行业工资、房价房租、气候与班次,
均取自各城市自己的统计公报 / 年鉴 / 七普分区县数据。
- 7×24 常驻引擎:仿真在服务器上持续运行,虚拟时间 实测 ≈480:1(标称 600),页面只是客户端,所有人看到同一座城。
- 可查看任意市民:当日日程、一生轨迹、配偶与子女、班次(白班 / 中班 / 夜班 / 倒班)、收入与职级、居住与通勤;
地图上每个白点都是 1 位真实市民。
- 基础系统:四季气候与天气、经济景气、疫情、楼市、政策干预、留言板。