Civilization Simulation
这是我一个GitHub项目(Node.JS项目,暂时不做前台UI)的名字,地址在:https://github.com/LostAbaddon/Civilization。
顾名思义,就是模拟文明。
准确地说来,是模拟一个文明会被随机产生的宇宙中,各文明的演化情况。
听着很有趣是不是?
这个宇宙的规则,是这样的:
0,宇宙是三维的,具有固定的长宽高,而且是循环的——也就是你走到左的头,再走,就从右的头冒出来了;
1,宇宙每个纪年都会以一定的概率产生一个新的文明;
2,新文明会具有唯一的ID号,以及随机出现在宇宙的一个固定位置上;
3,每个文明初始都会被赋予一定的属性,包括:
a,是否在遇到新文明时告知对方自己的存在;
b,是否对已探索到的文明发动攻击;
c,是否帮助比自己弱的文明;
d,遭到攻击后是否反击;
e,遭到攻击后是否隐藏自己。
4,每个文明都有文明值和已探索区域,且:
4.1,文明的发展速度依赖于当前即得文明值,以及距离文明最大值的差距;
4.2,文明已探索区域半径的增值,依赖于文明值和已探索区域半径平方的倒数(因为三维空间中,新增是以球面推进的);
5,当文明A探索到文明B,则文明B进入文明A的“已知文明列表”。如果文明A主动告诉文明B自己的存在,那么文明B进入文明A的“安全列表”,因此告知对方自己的存在也就意味着信任对方。此后,A会将B的存在告诉A所有信任的文明(这点其实很关键哦,扩大朋友圈,玩SNS和SEO的人都知道有多重要!);
6,如果文明A遭到文明B的攻击,那么文明A会遭受文明值的损失,损失程度相当于文明B的文明值乘上一个系数,并且A会将B从信任列表中取出;如果文明A受到文明B的援助,那么文明A会增加文明值,增加程度相当于两个文明的文明值的差,以及文明A距离文明最大值的差异,再乘上一个系数,并且A会将B加入到信任列表;
7,如果文明A遭到攻击,那么文明A会按照自己的政策决定是否反击或者隐藏自己。如果选择隐藏自己,那么将从所有已探索到A的文明的已知文明列表和安全列表中移除,当然别人可以再度发现他们;
8,如果A遭到B攻击,那么所有信任A的文明可以决定是否给予帮助,以及,是否攻击B作为复仇;
9,每个纪年的结束,所有文明都会根据这一个纪年遭到攻击和帮助的情况,决定自己政策的改变:如果遭到的攻击较多,则有一定的几率变成主动进攻型文明并不再宣告自己存在;如果受到的援助较多,则有一定的几率变成帮助弱者文明并主动宣告自己存在;如果帮助他人的程度比受到的帮助多,则有一定几率停止帮助他人。
上面是这个模拟的主要规则,下面是一些统计分析。
在终端运行模拟程序的时候,每个纪元(默认是25个纪年为一个纪元)都会有一行显示(建议在Win下把终端的宽度拉到很大),X表示所有文明的平均探索范围,0表示所有文明的平均文明值。尾数第一个是当前纪元,第二组数字是存活文明数/总文明数,第三组是平均信任文明数/平均探知文明数,第四组是主动进攻者、帮助弱小者和主动宣示者的数量,最后一组是纪元最后一年的战斗次数和援助次数。
在运行结束后,会有>>提示符,此下可以输入命令,包括:
1,quit:退出
2,dead:显示死亡文明统计信息
3,new:显示每个统计时段新生文明数图
4,die:显示每个统计时段死亡文明数图
5,live:显示每个统计时段存活文明数图
6,civ:显示每个统计时段平均文明值数图
7,exp:显示每个统计时段平均探索半径数图
8,found:显示每个统计时段平均探知文明数数图
9,ally:显示每个统计时段平均信任文明数数图
10,atck:显示每个统计时段平均主动攻击者数数图
11,help:显示每个统计时段平均帮助弱者数数图
12,show:显示每个统计时段平均主动宣示者数数图
13,war:显示每个统计时段平均战斗数数图
14,warP:显示每个统计时段平均战斗总伤害值数图
15,hlp:显示每个统计时段平均援助数数图
16,hlpP:显示每个统计时段平均援助总值数图
17,restart:重新开始一次模拟
18,set xxx=xxx:设置参数:
18.1, era=x:设置统计时段为几个纪年
上面就是可用的命令,下面是一些简单的分析。
以200个纪元,每个纪元50个纪年这样的程度来做统计,我们发现,演化到最后,主动攻击者死光了,所有人几乎都结成同盟,也即相互信任。
这个结果很让人兴奋是吧?
但,如果认真分析上面的规则,我们发现这个结果是规则的必然,而规则是有问题的。
在上述规则上,假定我们有三个攻击者ABC和三个非攻击者XYZ。
我们发现,攻击者主动攻击,那么ABC就不可能和XYZ达成信任关系,ABC也不可能在内部达成信任关系——因为我们没有“战斗同盟”这个概念,也就是说,目前的不存在文明联盟,只存在较弱的文明邦联。
而后,XYZ是非攻击者,他们之间有一定的概率形成信任关系,从而形成三人小团体——邦联。
接着,ABC有一定的概率攻击XYZ,而XYZ会相互援助,最后的结果就是XYZ受到的攻击最多和受到的援助持平。而XYZ会反击,这就是说,ABC攻击任何一个人,都会遭到三个人的反击——而ABC还会相互攻击。更要命的是,ABC不会受到任何援助。
这就是说,就平均来说,攻击者受到的攻击反而更大,而几乎不会得到援助。
因此,主动攻击者所面对的,其实是和一个抱团的团伙伙并——
XYZ说你是要单挑还是群殴?单挑是你一个单挑我们一伙,群殴是我们一伙群殴你一个。
因此,主动攻击者被灭就很正常了。
而对于新加入这M来说,一样的,受到的攻击比受到的援助要小——援助弱者嘛,新加入的M一定是弱者——所以M很快就和XYZ抱团取暖了。
这就看到另一个更严重的问题——现在的规则中,不存在使文明主动变成攻击者的“激励机制”,只有被攻击后被迫转型的“被动机制”。而对援助弱者文明来说,正如上面所说,后者的动力是非常巨大的。
所以,在现有规则下,黑暗森林的不会出现就是必然了。
但,很显然,这样的规则是有问题的。
在实际宇宙中,由于资源紧缺的压力,文明会掠夺他人,但这点在现有规则中无法被体现出来。而且文明之间的猜疑链也无法被体现——更不说科技爆炸对猜疑链的加成。文明之间复杂的政治博弈也无法被体现。甚至,现在的政策改变记住也和实际脱离很远。
因此,现在的模拟,只能认为是不考虑资源压力,大家都不玩高级政治手腕也无猜疑心的弱智文明在天堂里的博弈——既然如此,出现攻击者被援助者团灭的情况也就很自然了。
我会在下一个版本中逐步加入对上面提到的缺陷的修正,希望可以得到更好的文明博弈的模拟。
目前打算做的,包括增加星球这个概念——每个星球上都是有资源的。
而文明的文明最大值,则和他所占有的星球的资源总量相关。文明越是接近资源饱和,就越是呈现攻击性。
另一个修正,就是会将探索范围分解为“探知文明存在范围”和“攻击范围”。而对于攻击的政策也会做出调整。
政策方面,会适当引入更复杂的决策机制——不过这个要用算法表达出来其实很麻烦,关键是越复杂的政策,运行速度越慢,我会很不爽的。
好吧,就这样了。