- 一个关于算法的游戏
在开始之前我想起了一个古老的windows自带的游戏“扫雷”。只不过这个游戏与一个编程竞赛结合之后变成了一个更有趣的思维训练游戏。
游戏内容是这样的:
一个大正方形被划分为64x64的小正方形,大正方形区域内随机的散布着64x3颗地雷和64x3块石头。参与游戏的者不是拥有上帝视角的人,而是一辆扫雷车。每辆扫雷车都从区域的右下角进入雷区。
扫雷车拥有“探查”,清除,移动,转向四个功能。
探查:对正前方的3个小方格继续分析,通过探查可以确定探查区域内的是地雷,石块,还是空地。每次探查耗时3个单位时间.
移动:向正前方移动,每次移动花费1个单位时间。如果移动进入区域内有石块,则扫雷测会被损坏,需要10个单位时间进行修理。如果移动进入的是未清楚的地雷区域则Game Over。
清除:清除正前方的小方块区域,如果清除方块内是地雷,则将清除区域重置为空地。如果清除区域为石块则清除失败,清除区域依然为石块。对于空地清除方法则不做任何事。不光清除区域内有什么,都花费1个单位时间。
转向:扫雷车在原地将车头转到上下左右四个方向中的一个,每一步转向都花费1个单位时间。转向必须按顺序进行。例如:掉头这个动作,必须先用一个单位时间转到←或者→,然后再花费1单位时间从左或者右将扫雷车的屁股和脑袋对调。
- 程序要怎么实现呢?
定义一个小方格的土地类,属性为:size1x1, 位置x,y,x/y(1~64)
定义空地继承土地类,自有属性空。
定义石块继承土地类,自有属性破坏,不可被清除。
定义地雷继承土地类,自有属性爆炸,爆炸属性可被清除。
定义扫雷车,方法探查,清除,移动,转向。
属性状态:正常/待修理/损坏。位置:x,y;方向:前后左右
- 棋盘布置好了,现在由玩家拿着遥控器控制这辆扫雷车进入雷区执行扫雷任务,最快将雷区内的所有地雷清理干净或者标记出来的玩家获胜。
- 第一阶段
有“头铁”的玩家把扫雷车当一级方程式,管你有没有雷,冲鸭。其中运气最好的冲过了四分之一的地图,最差出发既游戏结束。
有谨慎的玩家每块前方区域都必探查,一步一挪。小蜗牛一呀一点点的挪,一蛄蛹一蛄蛹真勤奋……
最稳健外加强迫症外加运气极差的玩家在在所有区域都扫过一遍后完成了游戏,用时10086*10086个单位时间。但不是所有玩家中最慢完成游戏的,有的玩家花了超过探查所用的时间去猜测前方区域的空地内是否有地雷了石块。单细胞脑回路的玩家的操作基本是公式化的,虽然速度慢,但是安全可控,非常适合规范化之后代码化。最后他的执行过程编程后称为第一版自动扫雷车的控制程序。
- 第二阶段
恰逢此时这时候游戏比赛加入和新得规则:每个玩家有三台扫雷车但只能有一台在雷区内进行扫雷,空闲的扫雷车可以用于更换当前在雷区被摧毁或者被损坏的扫雷车,而且替换过程无时间损耗。损坏的扫雷车可以瞬间移动至雷区外进行修理,雷区外损坏扫雷车的修理可以与雷区内的扫雷车作业同时进行。当没有完好的扫雷车在雷区内时,则需等待至少一台损坏扫雷车修理完后再进行扫雷,修理时间记入游戏时间。如果三辆扫雷车都被炸毁则游戏结束。
为扫雷车添加自动化功能,可以根据玩家预先设置的策略自动扫雷。
这一规则改变勾动了各位编程,算法大佬们的神经。各位程序员们蠢蠢欲动。只不过这些数学,编程大佬们更感兴趣的是修改扫雷车的自动化程序。
新规则下的比赛结果在刚开始的时候让众大佬们气馁。他们冥思苦想出来的算法并没有打败那些 “幸运的莽汉”。最直接的原因是地图是随机生成的,固定算法在某一张地图上取得较好的成绩,但是在其他随机生成的地图上则一败涂地。但是大佬们并不气馁,不断的修改算法的适配性,算法也越来越复杂。
渐渐的大佬们发现固定算法在随机图集上运行结果的平均值无限接近原始“单细胞玩家“算法的效果。
沮丧开始在大佬之间蔓延……
游戏也成为一种纯粹的消磨时间的娱乐。
- 第三阶段
一个应用数学的导师将历年扫雷游戏玩家们的算法和结果扔给一群学生,让他们用来实践统计学理论。其中一个学生在对算法结果进行统计计算的时候对算法产生了兴趣。他将大神们贡献的海量算法进行了提炼,将连续多次探查后的结果进行统计后得出一个分布公式。例如:当连续探查出两颗地雷后第三次探查区域是地雷的概率为46%,当两次探查出三颗地雷后,第四次探查出是地雷的概率为12%。于是他以此为基础,将大神们的寻路算法进行整合。例如:A寻路算法在密集雷区内的扫雷效率较高,那么当连续探查两颗地雷时使用A寻路算法。B寻路算法对于松散雷区的扫雷效率较高,那么当连续探查为空地时调用B算法。
到此扫雷游戏就从一个操作扫雷车的游戏变成了一个选择算法的游戏。为了做到更广泛的适应性,在做了大量统计工作后,他为探查结果建立了一个复杂的计算公式,用以判断何种情况下适配哪种算法。这个公式的输出结果为当前已知条件下,对每种算法的选择权值。
于是一种对算法进行计算的算法出现了,被称为遗传学算法。而且这位学生发现,算法的种类越多,经过公式复合计算后得出的综合选择方案效率越高。
最终遗传学算法终结了扫雷游戏的算法比赛。
- 第四阶段
遗传学的出现让人们意识到一种可能性,计算机程序具备了通过已知推导未知问题答案的可能。
计算机程序具备了根据实际情况进行动态调整自身以适应环境变化的能力。
人们开始寻找将这种方法,思路应用到更多领域的实践。
笨的办法总是最容易被最先想到的,不就是一个64x64的雷区吗?穷举法将所有可能的64x3的地雷和石头的分布场,在被探查出一定数量区域的结果后的特征值(地雷,石块的分布情况)保存在一个巨大数组之中,然后将不同特征地形下不同寻路算法的权值与地形特征一同存入表格。
至此一个高效,快速的检索,优选系统就完成了。这个系统虽然还不具备通用性,但已经在某些方面展现出了独特的优势。
某个策略完备的优选系统在一场棋类对抗比赛中打败了此棋类对抗比赛的冠军,从而轰动一时。
更高效的数据库检索方法和硬件成为了制约计算机程序做出最优判断的瓶颈。同时人们发现似乎离“预测未来”和“适应环境”以及“广泛应用”的目标需要新的思路。
- 第五阶段
第四阶段需要大量的人工搜集素材,提取素材中的“特征”,计算并为素材添加权值。这哪里智能了?一点也不智能好不好。
在面对问题的时候,一些计算机技术人员开始思考人类是如何产生智能的,于是将目光投向了生物学家。
生物学(实际上是一个心理学家定义的)上对于神经元的定义是一个多个输入,单个输出,内含算法的计算单位。
每个神经元可以是不同的算法,也可以是相同的算法,将某类型问题的多种可能场景投入到不同的神经元组成的网络中进行计算,不同的样本会根据特征经由必要的神经元计算后输出结果。而没有必要像数据库查询那样遍历足够的元素后才能得到想要的最优结果。
而由神经元聚集起来的系统则被称为神经网络。这个网络是多种算法聚集体的同时还拥有最优化的效率。
高效,灵活的网络有了。如何让网络实现某项功能呢?回到扫雷游戏,我们需要算法来填充神经元,我们需要为每个神经元制定特征标签。
可以很容易发现,为一个神经网络进行初始化是一个非常耗时,费力的工作。这个过程需要大量的样本来填充神经元,和对神经元打标签。其过程就像交一个未成年的孩子学习一样,提供基础的理论,大量的练习,让孩子灵活应用其中的规律用于未来的计算。
到此一门新的计算机应用学科----机械学习就产生了。
机器学习的概念,基础理论和技术一经提出,就出现了两种基本类型。
监督式机器学习模型和非监督式机器学习模型。
监督式机器学习模型在回归算法的加持之下,可以通过数据的相关性“预测”结果。
非监督式机器学习模型中集中了多种功能迥异的算法和原始样本分析工具,可以在大量样本的加持下,从样本中提取出多种“特征”。我们可以利用这些自动识别出来的特征对样本进行分类。
当监督式机器学习与非监督式机器学习模型逐步成熟的时候,财大气粗的人开始搭建更复杂的,将监督式和非监督式学习模型结合起来,构建多层神经网络系统。
一个容器,一个快速搭建神经网络的工具被好事的工程师们建立起来。其中封装了具备基本算法的神经元,向神经网络注入学习样本的工具,将多层网络中神经元的输入输出连接起来的结构。这些多事的工程师成这些为搭建机器学习模型的平台。
经过大量样本完成了学习的多层神经网络系统可以做什么呢?
它可以提取文本/图像中的特征,并对特征进行自动分类。根据分类特征通过网络或者已有样本/特征元素寻找与这些特征匹配度最高的结果,将这些结果二次组合/排序/转化/编码生成一个新的样本。Transformer真是一种天才的取巧。
例如:回答人们的问题。由文字生成图像,视频,音乐。
至此生成式大模型应运而生。这个模型根据功能设计,经过学习之后(训练),它可以听取你的需求(特征理解和语义分析),最后给出满足你需求的答案(答案是否符合需求,取决于你的成长学习环境与模型学习时使用的样本数据有多相似)。它甚至可以在概率加持下给出模糊的答案和预测某种趋势,甚至创造性的给一些意外(当然大多数情况是因为个体视角的局限看不到某些可能性)。
第六阶段
我不知道机器学习将来的样子,也不知道在人工智能获取了自我训练和自我迭代的能力后能多快拥有人类的智力水平。他们是否会产生伦理的观念,是否受到法律的约束。
对于我们普通人来说,柴米油盐才是当下最重要的问题。
将来?关我什么事?
热门跟贴