下一章 上一章 目录 设置
5、随机的智商 ...
-
林盏下面的实习生昨天并没有跟着去吃饭。他比邱衍还小两岁,用董驿的话讲就是年纪轻轻就上了贼船。邱衍和他一交流,发现两个人的算法能力竟然差不多。邱衍不知道实习生怎么想,他自己内心先叹了口气,觉得自己这几年也算是荒废得厉害,大学里究竟学了什么呢?他现在也回想不起来了。不过好在这边还是有学习的机会的,邱衍一边想,一边放下心,问实习生最近在做什么工作。实习生挠挠头,回答道:“最近在学用hadoop,做一些数据治理的工作。之前还没有现在这么多数据的时候,就随随便便写一些程序玩儿。比如随机生成人设组成啥的,再简单不过了。”邱衍立马就心塞了,两人刚刚聊天的时候这实习生还在藏拙吧,随便写一些人设生成程序,这该是有多难多复杂。
无怪邱衍把这事儿想得多复杂,本来这就是个难事儿。对于任何一个问题,都要对其加以限制。最简单不过的小学数学加减乘除,到了大学以后都要重学一遍。为何?因为数域。在大学以前,或者说在没有接触过数学竞赛的大学以前的数学学习中,数域的限制大大简化了计算和证明过程。若题目告诉你,现在的这个数域只有0到9,加法定义为,两个数字在整数域中的相加结果的个位数,减法定义为较大数字减去小数字的结果,在这样的设定下,加减法与我们所习惯的加减法完全不同,但它又是切实可行的。如果再把数域缩小到0到1,那就很像计算机的指令串啦。
对于人设这个问题也是这样的。以全球的人的人设为数据库建立样本来源,搜索得到一个令人喜欢的人设,要怎么分析呢?假如先入为主的,我们认为人设的组成是一组形容词,那么这个形容词词列构成的人设表该有多大呢?“世上没有完全相同的两片叶子”,也就没有完全相同的两个人,鉴于现在还没有克隆人,所以可以这样说。那么全球有多少人呢?大约75亿,这个量级是多少呢?将近10的10次方,如果搜索一个人设的时长花费是1毫秒,那么搜索一遍大约需要花费87天把所有的人设全都搜索一遍。时间就是金钱,并没有人愿意花在这个小小实验室上。但如果我们把问题加上限制呢?如果能让这个量级进一步缩小呢?或者并不穷举,不一个个扫过去,而只是通过某些方法,把这些形容词词列给分割开来,将形容词词列表变成形容词表,这样的话,岂不是可以直接从中挑选出我们感兴趣的那些人设?
原来的搜索形容词词列有很大的弊端。虽然一般可以保证任意两个人设各自的形容词词列不完全相同,但是它们也有很大可能会重合呀!就好比两个同是18岁同寝室同专业的大一学生,他们身上的共同标签就有很多了,性别、年龄、专业、年级,拥有共同的兴趣爱好的概率也非常高!搜索这样的特别标签就会非常吃亏。但如果对于特定的人设,先给一个18岁的限制,那就不得了了!如果在全球的年龄数据里,18岁的人占4%,那么搜索直接变为3亿,接下来再按照一条条检索,按照上面的算法只需要5天!根据人设里的特殊要求,这个搜索空间会进一步降低,搜索时间也会变得越来越短。这是很符合直觉的,当你需要做的工作量变少了,只要你保持着原有的工作速度,那你工作时间肯定不会长。
但也不是没有弊端。这样得出的“最优人设”必然只是一个局部最优。毕竟你能保证,18岁一定比35岁来得受欢迎吗?这就是局部最优和全局最优啦,当然全局最优还是没什么意思的,因为全局最优所对应的人设,不一定有人想买呀。又不是冤大头,为什么要买个最优?局部最优已经够好够吸引人的了。
邱衍没有经过这一套从分析复杂度到建模继而解决问题的系统化学习,就显得有些跟不上步子了。但实习生把这些分析给他听,他恍然大悟。这样的分析或许是很简单粗暴,但是路子走得是非常正确的,无论是什么专业的学习,都要形成一套科学的系统化学习方案。邱衍怀疑董驿的安排也是这样,所以他安排的第一个学习目标是林盏的实习生,而不是直接和林盏对上。
说起来今天林盏好像一直躲在办公室里没出来,刚上班见到的时候他也是一副懒散散的模样。邱衍稍微跑了会儿神,就把思绪拉回到眼前的问题上了。他就着这个分析思考下去,觉得自己也可以写出一套随机生成程序来。
每个程序都要考虑输入输出是什么。输入就是需要程序提供什么信息,程序将这些信息进行整合处理,删繁去简,整理得到一定格式再输出,相当于程序完成的是一个信息处理转换的过程。这个随机程序的输入数据很庞大,输出很简单。将这些输入数据分好行,一行表示一个人设,每行又有几列,形容词之间用空格隔开。实习生还在念念叨叨,考虑到每个人设的长度不一,C的数组不一定好使,vector还行,要不就换个python……邱衍接触过一点C,是在学校里的C++课上,也是很奇怪,号称C++,教的却是C,MFC老师是不讲的,就当做大作业放给同学们自学。
邱衍感叹:“不愧是科班出身,路子都这么正。”实习生摸摸了头,有些不好意思的说:“其实也不算特别科班吧,这套先分析复杂度的流程是游戏AI分析的常用手段,你看腾·讯新出的游戏白皮书,里面也是这样写。我就是参考了一下~”邱衍继续问道:“那你这个随机生成程序要怎么测试好坏呢?就产生出一套简单的人设形容词词列,总不能随随便便交给用户吧?”实习生想了想,说:“这个是最早提的想法,现在基本上是作为人设随机产生器,在各个方案里当一个小角色。我们大多把它作为一个baseline(基线),目标就是研究出比这个baseline更好的人设产生器。至于好坏,你说的也对,一个是怎么判定人设的好坏,这直接决定了我们以后的评判标准,怎么样的人设算是好的?怎么样的人设是符合用户要求的?这两个可能不一样。另一个是怎么判定生成人设程序的好坏,大多是看它的性能,一般占用内存越少,跑的时间越少,当然前提是没什么重大bug,结果也正确,那这个程序就算比较好的了。”
邱衍听下来,觉得他这套说法和老师上课的内容也算是一脉相承,上课的内容万变不离其宗,最重要的是思想,看来实习生学得不错,能活用老师教的知识了。但他对标准这个东西还是不甚清楚,到底是怎么个评判法呢?说到底人设生成这个领域还是太少人涉及,从大处来说,人设生成也算是程序内容生成(PCG)的部分了,但是那多的是生成游戏相关内容的,有生成地图的,有生成游戏背景故事的,有生成游戏对话的,这些对人设生成不是没有借鉴作用,就像是第一个吃螃蟹的人,他也是有了吃其他东西的经验,习得了吃这个动作。吃螃蟹好像也是吃,没什么大不了的,但毕竟是第一个吃螃蟹的人啊,螃蟹要怎么吃,哪些地方能吃哪些地方不能吃,都是要慢慢探索的。人设要怎么生成,哪些地方容易出错,哪些地方应该多加强一些,都是值得细细研究的。
邱衍别的不说,对思维方式变化的感触最深。大学里每个专业培养的都是一套思维方式,程序员培养算法的思维,物理培养逻辑推理思维,在遇到问题后,用什么方式来思考问题,并尝试解决问题,用什么方法来试探,每个人有不同思维方式,导向也不同。
邱衍心下感叹,对这个程序的表现却有些好奇,试着问了问实习生能不能运行一下给他看看结果。实习生一听,面上竟然有些尴尬,和他之前那副微有得意的神情差距太大,支支吾吾地说:“可能要跑一小会儿……结果嘛,你看随机程序也不要讲有很多逻辑,不要有太大期待了就……”
~~~~~~~~~~~在等程序跑完的波浪线~~~~~~~~~~
这一天过去的很快,和林盏基本上没碰面,关顾着向实习生学习他那套分析方法了。邱衍一想起之前跑程序跑出来的结果就有些好笑,也不知道用的是什么当输入,其中一条人设词列甚至是“傲娇、胆小、深柜、抖S、友善”,邱衍意味深长的看了实习生好几眼,看得他都毛了,还想着为自己辩解,说这些测试数据是卡伦妹子做的。邱衍面上了然笑笑,心里想的却是,不会吧,那妹子看上去这么可爱,怎么可能了解这些呢?而且你不是搞数据的吗,怎么还让人家算法部给你数据,骗鬼还行,骗我就骗不到了吧~
学习耗脑,饿得快,邱衍这人一饿起来就什么都不想,和实习生磨了一会儿,看他也累,就签了退,各回各家去了。
不能心急,总是要有个循序渐进的过程,会逐渐发挥作用的,好歹是不能辜负这份薪水呀。