如何模拟世界 -- 一个奇怪的想法
过年在家休息,脑袋里面冒出一个奇怪的想法。如何使用程序来模拟整个世界。
从小就是模拟经营类游戏的粉丝,所以对于模拟程序特别感兴趣。玩过很多模拟城市类似的东西,总是觉得游戏虽然好,但是不过瘾。大部分游戏都是围绕着建筑物展开的,物理特性的模拟为主,我希望看到一个以模拟人物为主,以人为中心的,人文的模拟类程序。如果可以的话,希望给每个人物设定独特的性格,每个人物都可以有自己独立的行为和思想。如果允许的话,为每个人物开一个独立的线程。
当然,产生这个念头的另一个原因是,很多网络游戏和网页游戏,到后期都容易变成死服。既然是死服了,我们能不能设计这样一个单机游戏,依靠模拟人的行为,将一个单机游戏模拟成为一个多人游戏呢?如果能够做到模拟每个用户的行为,加上一些AI的元素,理论上可以做到模拟一个多用户的环境。
实现这样的一个东西,难度很大,不过,真的可以实现出来,用处也很多。当这个模型做到高度成熟的时候,可以模拟和预测很多东西: 如果一个商品涨价后,多少用户还会继续购买商品;电影的主角选择谁,会具有最多的票房。当然,这个系统和天气预报一样,由于复杂度太高,精确度很难得到保障。
如何来建立这样的一个模型,这个模型是建立在海量统计数据上的。有很多统计数据,用户倾向,都沉睡在Facebook,开心,人人的历史数据里面。每年调查公司都会做很多问卷调查。这些数据如果可以用到这个模型中,将会起很大作用。例如,18-35岁的人,每周会看多少部电影,分别喜欢看什么题材的电影,天气对于出门看电影的影响等等,每个独立的调查可能不能产生很大的作用,不过,当几万个这样的调查结果用于模型的时候,我认为可以在某些方面模拟出真实的用户行为了。
这个模型,如果要做到极致,出路只有一条,将所有的东西,所有的对象都模拟出来。虚拟的人,喝了一瓶虚拟的可乐,增加了快乐度,同时增加了卡路里。可乐又增加了饮料公司的销售额,同时增加了垃圾量,增加了可回收的垃圾数目。只有将小到一瓶可乐都定义为一个Object(里面的可乐,外面的瓶子其实也可以是两个对象),都仔细的去管理,才能将模拟做到极致。
真的动手写这样的东西,其实已经超出了程序员的能力了。就算做一个大粒度的模拟,牵涉到的类,模型的数量就很惊人。然后就是为了真实性,还需要大量的统计数据作为随机函数的支持。生成1000个Person对象,性别的话,0.5/0.5这样的比例就可以了。但是血型呢?全世界人,A,B,AB,O,其他血型的比例是多少,这个必须要查资料,平均化处理肯定不对。每个人的生日可以平均分布在365天里面,不过每个人喜欢的颜色,每种颜色的比例也必须查资料。
做这个东西的另一个意义是挑战思维。这个东西比大部分人在工作中写的代码难上很多很多。
1.多线程:如果有1000个人,都要进行一些社交活动,线程是必须使用的。
2.海量数据的处理,1000个人将生成很多数据,模拟越复杂,数据越多
3.模型的设计,UML等等的功力的挑战。
4.另外的一些编程的Sense
5.将资料,信息转化为代码的能力。怎么将手头上的文字转化为代码。怎么将现实生活中的行为,转化为代码。
6.耐性:这个东西,在没有成型前,一点都不好玩,一点都看不到前途和钱途。但是一旦完成后,将会产生巨大的效果。这个东西在中国开源,按照过去的经验,基本上没有人肯贡献代码,一定要有单打独斗的准备。
不知道这个东西能够做到什么程度,不过,真的能够在开发这个东西的时候,收集到很多资料,有很多想法,也是不错的。