Skip to content

Latest commit

 

History

18 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

文明模拟

简介

  Civilization Simulation

  这是我一个GitHub项目(Node.JS项目,暂时不做前台UI)的名字,地址在这里

  顾名思义,就是模拟文明。

  准确地说来,是模拟一个文明会被随机产生的宇宙中,各文明的演化情况。

  听着很有趣是不是?

规则

  这个宇宙的规则,是这样的:

  1. 宇宙是三维的,具有固定的长宽高,而且是循环的——也就是你走到左的头,再走,就从右的头冒出来了;
  2. 宇宙每个纪年都会以一定的概率产生一个新的文明;
  3. 新文明会具有唯一的ID号,以及随机出现在宇宙的一个固定位置上;
  4. 每个文明初始都会被赋予一定的属性,包括: a. 是否在遇到新文明时告知对方自己的存在; b. 是否对已探索到的文明发动攻击; c. 是否帮助比自己弱的文明; d. 遭到攻击后是否反击; e. 遭到攻击后是否隐藏自己。
  5. 每个文明都有文明值和已探索区域,且:
    1. 文明的发展速度依赖于当前即得文明值,以及距离文明最大值的差距;
    2. 文明已探索区域半径的增值,依赖于文明值和已探索区域半径平方的倒数(因为三维空间中,新增是以球面推进的);
  6. 当文明A探索到文明B,则文明B进入文明A的“已知文明列表”。如果文明A主动告诉文明B自己的存在,那么文明B进入文明A的“安全列表”,因此告知对方自己的存在也就意味着信任对方。此后,A会将B的存在告诉A所有信任的文明(这点其实很关键哦,扩大朋友圈,玩SNS和SEO的人都知道有多重要!);
  7. 如果文明A遭到文明B的攻击,那么文明A会遭受文明值的损失,损失程度相当于文明B的文明值乘上一个系数,并且A会将B从信任列表中取出;如果文明A受到文明B的援助,那么文明A会增加文明值,增加程度相当于两个文明的文明值的差,以及文明A距离文明最大值的差异,再乘上一个系数,并且A会将B加入到信任列表;
  8. 如果文明A遭到攻击,那么文明A会按照自己的政策决定是否反击或者隐藏自己。如果选择隐藏自己,那么将从所有已探索到A的文明的已知文明列表和安全列表中移除,当然别人可以再度发现他们;
  9. 如果A遭到B攻击,那么所有信任A的文明可以决定是否给予帮助,以及,是否攻击B作为复仇;
  10. 每个纪年的结束,所有文明都会根据这一个纪年遭到攻击和帮助的情况,决定自己政策的改变:如果遭到的攻击较多,则有一定的几率变成主动进攻型文明并不再宣告自己存在;如果受到的援助较多,则有一定的几率变成帮助弱者文明并主动宣告自己存在;如果帮助他人的程度比受到的帮助多,则有一定几率停止帮助他人。

分析命令

  上面是这个模拟的主要规则,下面是一些统计分析。

  在终端运行模拟程序的时候,每个纪元(默认是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:设置参数:
    1. era=x:设置统计时段为几个纪年
    2. evolute=x:设置演化多少个纪元
    3. step=x:设置一个纪元为多少纪年

简单分析

  上面就是可用的命令,下面是一些简单的分析。

  以200个纪元,每个纪元50个纪年这样的程度来做统计,我们发现,演化到最后,主动攻击者死光了,所有人几乎都结成同盟,也即相互信任。

  这个结果很让人兴奋是吧?

  但,如果认真分析上面的规则,我们发现这个结果是规则的必然,而规则是有问题的。

  在上述规则上,假定我们有三个攻击者ABC和三个非攻击者XYZ。

  我们发现,攻击者主动攻击,那么ABC就不可能和XYZ达成信任关系,ABC也不可能在内部达成信任关系——因为我们没有“战斗同盟”这个概念,也就是说,目前的不存在文明联盟,只存在较弱的文明邦联。

  而后,XYZ是非攻击者,他们之间有一定的概率形成信任关系,从而形成三人小团体——邦联。

  接着,ABC有一定的概率攻击XYZ,而XYZ会相互援助,最后的结果就是XYZ受到的攻击最多和受到的援助持平。而XYZ会反击,这就是说,ABC攻击任何一个人,都会遭到三个人的反击——而ABC还会相互攻击。更要命的是,ABC不会受到任何援助。

  这就是说,就平均来说,攻击者受到的攻击反而更大,而几乎不会得到援助。

  因此,主动攻击者所面对的,其实是和一个抱团的团伙伙并——

  XYZ说你是要单挑还是群殴?单挑是你一个单挑我们一伙,群殴是我们一伙群殴你一个。

  因此,主动攻击者被灭就很正常了。

  而对于新加入这M来说,一样的,受到的攻击比受到的援助要小——援助弱者嘛,新加入的M一定是弱者——所以M很快就和XYZ抱团取暖了。

  这就看到另一个更严重的问题——现在的规则中,不存在使文明主动变成攻击者的“激励机制”,只有被攻击后被迫转型的“被动机制”。而对援助弱者文明来说,正如上面所说,后者的动力是非常巨大的。

  所以,在现有规则下,黑暗森林的不会出现就是必然了。

  但,很显然,这样的规则是有问题的。

  在实际宇宙中,由于资源紧缺的压力,文明会掠夺他人,但这点在现有规则中无法被体现出来。而且文明之间的猜疑链也无法被体现——更不说科技爆炸对猜疑链的加成。文明之间复杂的政治博弈也无法被体现。甚至,现在的政策改变记住也和实际脱离很远。

  因此,现在的模拟,只能认为是不考虑资源压力,大家都不玩高级政治手腕也无猜疑心的弱智文明在天堂里的博弈——既然如此,出现攻击者被援助者团灭的情况也就很自然了。

  我会在下一个版本中逐步加入对上面提到的缺陷的修正,希望可以得到更好的文明博弈的模拟。

  目前打算做的,包括增加星球这个概念——每个星球上都是有资源的。

  而文明的文明最大值,则和他所占有的星球的资源总量相关。文明越是接近资源饱和,就越是呈现攻击性。

  另一个修正,就是会将探索范围分解为“探知文明存在范围”和“攻击范围”。而对于攻击的政策也会做出调整。

  政策方面,会适当引入更复杂的决策机制——不过这个要用算法表达出来其实很麻烦,关键是越复杂的政策,运行速度越慢,我会很不爽的。

  好吧,就这样了。

About

Civilization Simulation

Resources

Stars

15 stars

Watchers

9 watching

Forks

Releases

Packages

Contributors

Languages