本文主要针对来自“西西河”论坛的名帖“大糖帝国(知乎链接)”进行实现,西西河的原文链接目前404了。大糖帝国这篇文章内容是由淮夷”提取自《The Origin of Wealth》书中的一个章节中提及的一个简单的经济学模型,并且淮夷追加了一些自己的观点。文章翻译了这本书中的Sugarscape这个章节,我个人觉得中文翻译要比原书的英文内容描述的更加精彩。这个著名游戏是1996年美国布鲁金斯研究所的Epstein和Axtell设计的,这两位号称是用计算机程序模拟经济演化的先驱。非常遗憾书的原作者和西西河的翻译者都没有提供模型的源代码,因为模型很简洁并且看起来非常具有可玩性,所以我决定使用Python自己实现这个模型,对文章数据进行验证,并简单记录实现方案。
运行规则说明
大糖帝国的地图如下图所示,含糖量在[0, 4]之间取值,糖人根据出生所在位置标记颜色,方便运行时判断出身不同的糖人所在位置的变化情况,糖人的出生地与天赋(消化能力和视力)无关。糖人的属性包含,ID,出生位置,出生等级[0-4],含糖财富值,以及视力和消化能力。糖人含糖值低于0时,糖人死亡。游戏设置开关,可以选择将糖人清除出地图,还是尸体留在原地。地图有3个属性,位置坐标,坐标对应的含糖量以及被消耗的糖的恢复速度。糖人根据利益最大化原则,搜索其东南西北四个方向上视力所及的含糖量最高点,并移动过去,吃掉该点所有的糖。当地图上存活的所有糖人都被调度一次,算是一轮结束,Round计数增加1,可以认为是帝国中1天结束。此时,地图上被吃掉的糖根据地图设定的恢复速度,自行恢复,恢复上限为初始数值。
根据可调整参数运行
根据运行规则可以看到,可调整参数包括地图和糖人自身参数两个方面。
调整Sugarscape Map参数
地图含糖恢复速度设定为最慢,每一轮(1Round)恢复糖量为1。由于资源的恢复速度很低,导致糖人不得不离开自己的所在位置去寻找更好的目标位置,所以糖人并不会完全聚集在糖山,而是流动起来,分散到了糖山的各个位置,这种状态下的中高含糖区的糖人非常活跃,低糖区的糖人,或者找到一个较合适的位置后就会安于现状,或者被饿死。贫富分化由于人员的位置迁移非常活跃,最终会出现,但是分化较慢,差距不会非常大。
视频演示链接(由于Github不支持iframe标签和大视频文件上传,只能留链接了)
地图含糖恢复速度设定适中,每一轮(1Round)恢复糖量为3。由于糖的速度恢复较快,糖人们不再进行频繁的迁移,只有糖山顶端的糖人能够看到更优质的资源而导致其活动频繁。而处于含糖量中低区域的糖人停止了活动。
地图资源瞬时恢复,每一轮(1Round)恢复糖量为4。由于糖的速度恢复达到峰值,大糖帝国经济繁荣,糖人们只要不是具有超强的食欲,停留在原地就会得到最多的资源,此时糖人们停止任何寻找糖的活动。可以观察到,这种情况下贫富分化的速度加快,很快呈现出幂律分布的趋势。
地图不恢复,地图恢复能力设置为0,糖被吃掉后不再恢复,导致所有的糖被瞬间消耗掉,大糖帝国资源枯竭,最终所有糖人在饥饿中死去。
调整Agent参数
以下情况Sugarscape的恢复速度设置为3。
糖人数量翻倍
人口数量设置为500,其他参数不变。这种情况只是人口死亡会多一些,财富分布规律不变。
糖人基因变好
糖人视力设置为10-20,食欲设置为1,此时糖人视野好,消耗能量少,可以无限存活并发现更好的资源。此时糖人大部分都能发现资源多的位置,只有运气极差的会在低糖区饿死。
作为糖人,不可能生下来就是顶级的视力和极好的消化能力,所以这种情况是不应该存在的。处于低糖区的糖人,由于视力范围有限,很难跨越阶层,只有哪些出生在阶层边缘才能跨越阶层的可能。出生在低糖区,因为看不到更好的资源位置,也只能安于现状,混吃等死。有的糖人可能生下来财富就多于其他人,可惜出生在了0含糖区中,随机选择路线的过程中有因为随机选择方向不对,一只被困在其中,最后也只能死去。在实现过程中,被使用最多的库函数是random。与大糖帝国类似,random决定了我们在这个世界中的生活方式与最终的命运,正如美剧Heros里Haitian说的那句话“The Universe decides our destiny”。