Skip to content

zotin/Civilization

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 100.0%