sunshm 发表于 2013-7-3 21:54

程序模拟宇宙生存法则——黑暗森林

相信看过三体的朋友,不会忘记黑暗森林法则,我是个程序员,一时心血来潮,花了3个小时做了如下程序来模拟黑暗森林法则,由于很多细节无法使用简单的程序模拟加之时间仓促,所以结果仅供娱乐讨论。不过经过反复运算,还是发现如下结果:
1、不论是延长宇宙时间或者是增加接触机会,剩余文明总数始终保持在50以下
2、剩余文明等级达到80以上的基本在10左右
3、出现越早的文明生存的概率越大,前提是没有被人发现。
下面是代码部分,欢迎补充建议:
class Civilization
    {
      //文明程度
      private int level;
      public int Level
      {
            get { return level; }
            set
            {
                if (value > 100)
                  level = 100;
                else
                  level = value;
                if (level > 80)
                {
                  this.consume = Convert.ToInt64(Math.Pow(2, level - 80));
                }
            }
      }
      //能量物质消耗
      private long consume;
      public long Consume
      {
            get { return consume; }
      }
      public bool IsSpite { get; set; }//是否恶意,默认善意
      public bool IsLive { get; set; }//是否存在
      public bool IsMember { get; set; }//和平成员
      public Civilization(int level)
      {
            this.Level = level;
            this.IsLive = true;
            this.IsMember = false;
      }
      /// <summary>
      /// 判断对方是否善意
      /// </summary>
      /// <param name="civ"></param>
      /// <param name="i">猜疑链层级</param>
      /// <returns>true 恶意,false善意</returns>
      public bool Judge(Civilization civ,int i)
      {
            i++;
            if (i >= 10)
            {
                return true;//如果猜疑链超过10级,认为对方是恶意的
            }
            if (civ.IsSpite == true)//对方是恶意的
            {
                return true;
            }
            else//对方是善意的
            {
                return civ.Judge(this,i);
            }
      }

      /// <summary>
      /// 我知道了对方的存在
      /// </summary>
      /// <param name="civ"></param>
      public void Touch(Civilization civ)
      {
            if (Judge(civ, 0))//如果对方恶意
            {
                Console.WriteLine("尝试攻击对方");
                Attack(civ);
            }
            else
            {
                Console.WriteLine("共建和平");
                Peace(civ);
            }
      }
      public void Peace(Civilization civ)
      {
            this.IsMember = true;
            civ.IsMember = true;
      }
      public void Attack(Civilization civ)
      {
            if (this.Level >= 95)
                civ.IsLive = false;//消灭对方
      }
    }

static void Main(string[] args)
      {
            int iCivNum = 100;//文明总数初始值100
            const long Matter = 20000000000000;//宇宙中物质总量
            //初始化文明总量
            List<Civilization> list = new List<Civilization>();
            Random r = new Random();
            for (int j = 0; j < iCivNum; j++)
            {
                list.Add(new Civilization(r.Next(1, 100)));
            }
            int iCount = list.Count;//文明总数
            long mat = 0;
            //模拟时间
            for (int i = 1; i < 100000; i++)
            {
                //时间推移,文明级别提升
                if (i % 10 == 0)
                {
                  //新的文明出现
                  list.Add(new Civilization(r.Next(1, 100)));
                  iCount++;
                  //文明进化
                  foreach (Civilization c in list)
                  {
                        c.Level ++;//每过10年,文明级别+1
                        mat += c.Consume;
                  }
                  //文明接触
                  for (int j = 0; j < 2; j++)
                  {
                        int flag = 0;
                        if (list.Count <= 1)//如果仅剩一个文明不再接触
                            break;
                        int a = r.Next(0, list.Count);
                        while (list.Level < 80)//如果文明级别不到80,无法接触
                        {
                            if (flag > list.Count)//如果文明集合中的没有级别超过80的会造成死循环,所以随机数达到集合总数,就退出
                              break;
                            flag++;
                            a = r.Next(0, list.Count);
                        }
                        int b = r.Next(0, list.Count);
                        flag = 0;
                        while (list.Level < 80)
                        {
                            if (flag > list.Count)
                              break;
                            flag++;
                            b = r.Next(0, list.Count);
                        }
                        list.Touch(list);
                        if (list.IsLive == false)
                            list.RemoveAt(b);//死亡的文明移出
                  }
                }
                if (mat >= Matter)
                  Console.WriteLine("宇宙毁灭");
            }
            int y = 0;
            int x = 0;
            foreach (Civilization c in list)
            {
                if (c.IsLive)
                {
                  x++;
                }
                if (c.Level >= 80)
                  y++;
            }
            Console.WriteLine("存在过的文明总数"+iCount);
            Console.WriteLine("剩余文明数量:"+x);
            Console.WriteLine("文明级别达到80的总数是"+y);
            x = 0;
            foreach (Civilization c in list)
            {
                x++;
                Console.WriteLine("文明{0}的级别是{1}",x,c.Level);
            }
                Console.ReadKey();
      }

北科天文协会 发表于 2013-7-3 22:03

看起来很厉害的样子

Overlord 发表于 2013-7-3 23:02

高端啊
话说这是C sharp?

hhbb 发表于 2013-7-4 06:20

其实我不太认同三体的黑暗森林观点。

sunshm 发表于 2013-7-4 12:29

Overlord 发表于 2013-7-3 23:02 static/image/common/back.gif
高端啊
话说这是C sharp?

没错,是c#

sunshm 发表于 2013-7-4 12:32

hhbb 发表于 2013-7-4 06:20 static/image/common/back.gif
其实我不太认同三体的黑暗森林观点。

我比较认同这个观点,当然前提是文明发展轨迹确实存在爆炸式的,这是很可怕的,因为达到一定程度的文明,首先自身消耗能量很大,所以他们会急速的扩张,其次对其他落后于其的文明存在着一种敌视,如果对方是恶意的,就会威胁到自身的安全,也就是猜疑链,最后的结果有可能是这样的。

sunshm 发表于 2013-7-4 12:32

后期,我会将这个程序制作成桌面应用,很多参数通过界面设置,这样可以供大家下载使用

张紫恒 发表于 2013-7-4 14:22

sunshm 发表于 2013-7-4 12:32 static/image/common/back.gif
后期,我会将这个程序制作成桌面应用,很多参数通过界面设置,这样可以供大家下载使用 ...

好想法!

hhbb 发表于 2013-7-5 08:11

sunshm 发表于 2013-7-4 12:32 static/image/common/back.gif
我比较认同这个观点,当然前提是文明发展轨迹确实存在爆炸式的,这是很可怕的,因为达到一定程度的文明, ...

其实在人类社会发展过程中也有相当一部分与自然和谐万物共存的思想,不是每个人都认同黑暗森林法则。

redstar 发表于 2013-7-6 19:31

记得以前大刘曾经说自己编过模拟文明进化的程序,楼主也可以参考下啊

sunshm 发表于 2013-7-7 17:46

redstar 发表于 2013-7-6 19:31 static/image/common/back.gif
记得以前大刘曾经说自己编过模拟文明进化的程序,楼主也可以参考下啊

呵呵,想参考,但是哪里有呢

ytwiger 发表于 2013-7-8 07:52

我也不认同黑暗森林法则,我认为生命和文明现象远远超出人类估计的数量,只是由于认知限制,无法理解而已。
比如地球有没有思想?它是不是一个生物,人类作为它的脚气菌存在?
很多文明可能是共生的,就像你我作为个体存在,但体内又有数不清的活体细胞支持着你我的生命。
还有细胞有没有思维?不要用人的大脑模式去揣测,那实在是太局限了,把人类牢牢的固定在自己的小圈子里。
星系的运行结构和原子的结构如此类似,星系会不会是一个超级生物结构的原子呢.........哈哈,从科学的实证本质来说,这些永远都拿不到答案,转向宗教和哲学吧...

天狼星666 发表于 2013-7-8 10:46

人类经历了两次世界大战,局部战争更是不断。
人类以这样的心态,去演绎和推测地外文明的善恶,似乎也在情理之中,见怪不怪。
古人云:天行有常,道法自然。
人类还是先处理好自己的事情吧。

sunshm 发表于 2013-7-8 13:28

ytwiger 发表于 2013-7-8 07:52 static/image/common/back.gif
我也不认同黑暗森林法则,我认为生命和文明现象远远超出人类估计的数量,只是由于认知限制,无法理解而已。 ...

思路很开阔,我也认为生命的形式可以是多种多样的,而不像科幻电影中的样子,所有智慧生命都是类人体,不过这个法则本身倒是挺有意思。

OKEY 发表于 2013-7-10 03:35

三体人自己内部也是有秩序的,没有秩序就是一片混乱,如果把这种内部协同适用到到外部世界,就好像,以前是白人,后来是白加黑,:lol

sunshm 发表于 2013-7-11 09:28

OKEY 发表于 2013-7-10 03:35 static/image/common/back.gif
三体人自己内部也是有秩序的,没有秩序就是一片混乱,如果把这种内部协同适用到到外部世界,就好像,以前是白人 ...

我相信三体内部绝对有秩序,否则文明无法发展

cliusn 发表于 2014-4-20 22:41

本帖最后由 cliusn 于 2014-4-21 09:28 编辑

挖坟,做个标记慢慢看。 我也是三体迷,买了正版书,但对于这个黑暗森林法则,我持保留意见。我的不完整的意见是:把人类基于局部的知识和逻辑,外推到整个宇宙,很可能不适用。如果是自然科学,普适性会更强,这种基于人类社会和人类逻辑思维的东西,普适性就比较有限。 但为了保险起见,我也不赞同主动联系外星智慧。 考虑到宇宙时空距离的极端广阔,即使存在非常多的高端智慧生命,它们也很难互相发现和相遇。假设一个场景:外星人舰队现在经过太阳系外围的奥特星云带,他们也很难发现地球上有人类,除非他们预先得到了某种指示信息。 如果是1千万年前,他们经过太阳系外围,当时地球上存在生命,但没有智慧生命;如果1千万年后,地球上是否还有智慧生命,也很难确定,或者太阳系周围很多光年都是人类的势力范围了。

cliusn 发表于 2014-4-21 09:15

楼主用电脑程序模拟,是很好的做法,很多生物进化论、博弈论等学者,也是这么做的。

sunshm 发表于 2014-4-21 13:12

cliusn 发表于 2014-4-21 09:15
楼主用电脑程序模拟,是很好的做法,很多生物进化论、博弈论等学者,也是这么做的。 ...

工作一忙,顾不上更新了,本来还想再完善一下这个程序的。

cliusn 发表于 2014-4-21 22:25

sunshm 发表于 2014-4-21 13:12
工作一忙,顾不上更新了,本来还想再完善一下这个程序的。

楼主有空完善一下,就好了。很多三体迷会有兴趣的。
页: [1] 2
查看完整版本: 程序模拟宇宙生存法则——黑暗森林