试试这个小玩具:在你的电脑上运行 PyGAD,用遗传算法玩马里奥
最近编者突然对遗传算法产生了兴趣,这里的遗传算法指的是进化计算中的概念,并非是某个生物学实验室出来的东西。它把所有解的方式都看作是种群的一部分,最大的作用就是在无数次试错中,选择暂时最优解“繁殖后代”。后代被“繁殖”出来以后,就会继续缩小范围无数次试错,直到获得最接近解的分数。它并非是某疯狂科学家的科学设想,它实际被用于解决如“电网该多大功率才能确保大的同时安全”、“上学如何选择最短路径”等可模拟试错的问题。那既然是无数次随机总有一个中,那为什么非得需要一个算法呢?读者使用随机算法和遍历去计算,不是一样行得通吗?这恰恰是遗传算法和纯随机最爱的不同,遗传算法能记住错误的同时,继续下一轮最小化的随机。
那为什么上学问题不用洪水迷宫算法去实现呢?事实上遗传算法是一套十分通用的技术,不需要去思考如何用算法实现它,只需要给它一个操作方式、评分判定标准,那么遗传算法就能在学校地图上自己“繁殖”种群。如果说普通的算法是空间换时间,那么遗传算法就是纯纯的时间换空间。你当然可以在走迷宫的时候用洪水,当然可以在计算电网时用遍历模拟,但如果说你完全不想处理这些复杂事情,你可以把遗传算法挂在云服务器跑个一天一夜。你只用在 PyGAD 中规定你需要繁殖多少代、如何操作、如何记分、种群有多少,就能去做自己该做的事情了。遗传算法前十几代可能非常笨,但后十几代可能很精英,因为它正在不断试错的过程中不断进化,逼近合规则最优解。
当然本文前半段只是为了普及概念,并不真的是打算教会你遗传算法的概念及 PyGAD 用法。但你能通过真正的遗传算法小玩具,来体验遗传算法的好玩之处,编者推荐试试 commonLuke/mario-neural-network。这是一个开源在 GitHub 上的遗传算法玩《超级马里奥》项目,使用了 PyGAD 以及一个打包《超级马里奥》的库。程序会打开一个内置多窗口同时操作角色,在马里奥一代的第四大关第一小关里反复地、随机地进行尝试。程序并不知道马里奥是什么游戏来的,但是它最后能知道按照规则怎么样做能得最高分,这就是上文所说的“无限逼近正确答案”。需要编者提醒的是,这个小玩具需要你有一台强劲电脑,轻薄本还是建议氛围编程一个字符迷宫玩玩:
1 | 克隆项目 |
以上命令,需要读者的系统有 Python 的 3.0 及以上版本和 Git 才能跑起来,请各位读者自行准备好环境。当读者跟着教程运行起来后,会看到内置多窗口的慢放版马里奥游戏,屏幕上是一整个种群的马里奥。遗传算法进步是一个很慢的过程,可能持续几个小时乃至几天几夜,请确定自己不是真的着急用电脑,否则还是建议节假日的时候再玩。刚开始这群马里奥连路都不会走,卡在起点的管道处跳不上。经过第一轮后,所有的都会跳了。第 0 代基本上都在试错,到第 1 代的进步结果是最明显的,但后面几代复杂度提升了,可能进化曲线并没有开始那么明显,需要十几轮乃至几十轮试错以后,才能完整跳过那几处地方,甚至还能看到有马里奥过了后自杀。
因为程序的评分标准是最高分并且时间剩余多,所以这个误解了需求的算法会期望保分数活着;但很明显最后并不会通过评判,所以下一轮没继承到的算法还是可能无法跳过去。这就是为什么有时上轮过去了,下轮还在试错。这其实是设计得不够好导致的——它鼓励“保分活着”,算法就真的学会了苟着不动。算法不会理解你“真正想要什么”,它只会优化你“实际写了什么”。当然这只是程序化的评判标准,请不要将达尔文主义带入社会思考,社会科学可比社会达尔文丰富多了。遗传算法只是个会试错的小玩具,别让它替你做价值判断。虽然遗传算法能用时间无限逼近正确的值,但如果追求速度和效率,并且能力优秀,还是建议使用洪水迷宫这类的专精算法去处理问题。





