然后游戏规定:吃到豆子得10分,移动位置分数不变,执行吃豆的动作,但是格子里没有豆子,减1分,撞墙了减5分。限制吃豆人总共能做200次动作。理论上最高得分就是在不扣分的情况下把豆子全部吃掉,有50个豆子,最高得分就是500分。
吃豆人能观察到的,是前后左右和自己所在格子的状态。所以一共是5个格,每个格子有三种状态,总的状态数就是3的5次方,就是243种状态,然后再除去一些地图中不存在的状态;如三面是墙,左右是墙,最后共剩下128种状态。
那么在这个游戏中,我们怎样才能获得最高分呢?
如果采取最传统的方法,就是每种状态都试试,用穷举法列出所有可能性,然后再进行对比,找出得分最高的一组策略模式。
但是,如果要采取这种传统方法,那么总共要涉及到7128种策略组合,如果把每个生成的策略组合都去试试看得分多少的话,把这些策略都执行完,至少需要159亿年,这和宇宙大爆炸到现在的时间几乎差不多。
所以这是个计算量远远超过全球算力加和的计算任务。所以想要通过穷举法去计算,这个问题是无解的;
那么能不能用神经网络的算法来进行计算呢?当然可以,但是问题和使用穷举法一样,算力需要远远大于全球算力。
另外,由于豆子的出现是随机的,每一局豆子出现的位置并不是固定的,所以他们之间的关系是非线性的。
而神经网络模型却很难处理这样的非线性问题。比如模型用历史数据学习了很久,终于发现了一些规律,然后新的游戏开局,模型用这些规律去玩游戏,但却发现新的游戏中,这些规律变了。过去学习总结出的规律,几乎派不上太多用场了。对于这种尴尬的问题,基于神经网络只能用概率的猜测进行决策。
而这样的效果往往并不是很理想,甚至在最开始的阶段,其概率比人为主观判断低了很多很多。
……
但是遗传进化算法可以从另一个思路解决这个问题。
这种算法直接从策略规则自身开始入手;比如人为的设计甚至是随机生成100个策略,让每种策略都进行1000场吃豆挑战赛。
每场比赛让吃豆人行动200次,在1000场挑战赛中,每场比赛的50个豆子都是随机撒下的。最后评估在这1000场挑战赛中,平均每走200步,得到的分数是多少;
根据得分的高低从200个策略里随机选出2个策略,得分越高被选中的概率越高。然后用所选中的2个策略,生成出一个新的策略,新的策略的每一列有一半概率使用第一个策略的对应列,一半概率使用第二个策略的对应列。在生成新策略的过程中,会有小概率产生策略的变异;
用这种优胜劣汰、自然选择的方法不断生成新策略;用新生成的策略进行比赛,再按照分数再生成下一代的策略;
把每条吃豆策略进行数学编码后,可以将这些策略看成基因一样,重组生成下一代的过程,其实就是编码的一部分相互交叉替代,就有点像染色体的分裂和组合。
第一代成绩较高的吃豆人,就有更高的几率留下后代,后代还遗传了上一代的策略。得分低的也有几率生成后代,只是没有得分高的概率高。在生成下一代的过程中,下一代的策略还有非常低的几率产生遗传变异,有的策略位会随机变成其他数。
这就是遗传算法的基本原理,直接对原始的随机策略进行编码,然后让特定区域的编码来回交叉迭代,产生新一代的策略,然后再继续进行编码的交叉与变异迭代……下一代遗传了上一代的优点,也变异出了新一代的特点……就这样一代一代的进行下去;直到获得最高的分数。
……
在这个游戏中,计算机大约进来了1000多次迭代的时候,游戏分数达到了497分,这离满分500分仅仅差了三分,而且之后的游戏中,计算机的得分几乎稳定在了493——497分的区间。
而作为对照组,很多数学家、计算机专家、游戏高手也在靠着自己的经验与逻辑去玩这个游戏,大约1000个玩游戏的高手与高智商的人类,每人玩了大约200局,最终最高得分为431分,而且仅有一次;人类的精英代表平均得分仅为351分。
……
计算机利用遗传算法得到的策略,是人类所不能比拟的。尤其是在非线性的复杂系统中,遗传算法最后执行的很多策略,人们怎么也看不懂,逻辑上完全无法理解。但就是这样看上去很诡异的策略,却在最终变成了神来之笔,在游戏终止后,人们才恍然大悟。
而且从计算机得分的轨迹来看,更加的平滑,更加的连续…而人类对照组在游戏中的得分轨迹,则呈现出明显的波动性与随机性。
这个就是用计算机来模拟进化过程的研究,它逐渐掀起了进化论的主流观点的改变,这种遗传算法将突变式的进化用计算机模拟出来了。