vlambda博客
学习文章列表

人工智能——读心术实例(二分查找)

很多人认为,人工智能就是能够让我们觉得非常神奇的机器人,如果一个机器人能够使用读心术,相信大部分人都会认为这个机器人就是人工智能了。今天我们就来看看如何让EV3实现“读心术”,所谓“读心术”就是能够猜出我们人的心里想的是什么,比如我们心里想一个0~1000的数字,如果机器人能够很快猜出我们想的数字是多少,那么我们就说这个机器人会使用“读心术”。


在讲解程序之前,我们先来想想我们人是如何猜数字的,如果我们不假思索的猜,那么有可能一次就猜对,可是概率比千分之一还要小,如果我们从0开始一个一个猜,最少猜一次,最多要猜1001次,很明显这样碰运气的方法并不符合我们的要求,如何能够快速猜出对方心中想的数字呢?这就需要对方给我们一点提示,例如我们说500,然后对方告诉我们答案比这个数字大还是小,这样我们就可以缩小范围,从而快速找到答案。


要想最快的找到答案,我们可以使用二分查找算法。二分查找算法就是在一组按大小顺序排列的数字中,找到中间的那个数字与答案进行比较,如果相等就说明找到了,否则判断中间数与答案哪个比较大,如果中间数大我们就在比中间数小的那部分数字中找到新的中间数继续比较,进而不断缩小答案范围,从而找到答案,因为每次搜索都会使搜索范围缩小一半,因此这种查找的方法又称为折半查找。如图1所示,例如我们的答案是300,那么首先我们要比较300和500的大小,因为300比500小,说明答案在0~499的范围内,中间数为250。接下来要判断300和250谁大,由于300比250大,说明答案在251~499的范围内,中间数是375,接下来就比较375和300的大小,以此类推。因为2的十次方是1024,因此最多查找10次我们就能查找到我们要查的数。

人工智能——读心术实例(二分查找)

图1


程序中我们需要三个变量,分别是范围的最大值max、最小值min和中间值mid,例如我们答案的数字范围是0~1000,那么最大值max就是1000,最小值是min0,中间值mid就是最大值的一半等于500,程序如图2所示。

人工智能——读心术实例(二分查找)

图2


给三个数赋值以后我们来比较mid是否和答案相等。这里我们利用左、中、右三个按键分别代表比答案比mid小、与mid相同以及比mid大。这里我们还需要添加一个情况,就是如果什么都没按下那么变量就不会有变化。如果确认mid是我们要找的答案,那么就跳出循环,闪红灯,如果再次按下中间的按键就结束程序,如图3所示。

人工智能——读心术实例(二分查找)

图3


如果答案比mid小就按下左键,说明答案的范围在min和mid之间,这个时候mid就是最大值max,所以第一步我们先把mid的值写入到max,然后再求出新的mid。公式是mid=(mid-min)/2+min,因为可能出现小数,所以我们还需要舍去mid的小数部分,如果用四舍五入的话mid永远都不会等于0。为了防止出现按下左键mid不停的变小,我们需要在得到mid后对按键进行判断,松开按键才能继续对mid进行比较,否则在求出新mid后会一直等待,程序如图4所示。

人工智能——读心术实例(二分查找)

图4


如果答案比mid大就按下右键,说明答案的范围在mid和max之间,这个时候mid就是最小值min,所以第一步我们先把mid的值写入到min,然后再求出新的mid。公式是mid=(max-mid)/2+mid,同样可能会出现小数,这次我们可以用四舍五入,如果舍去小数部分mid就永远不可能等于1000。为了防止出现按下右键mid不停的变大我们同样需要在得到新mid后判断是否松开了右键,程序如图5所示。

人工智能——读心术实例(二分查找)

图5


猜数字可以作为一种游戏,那么二分查找有什么实际用途呢?我们知道如果x²=y,那么y的算数平方根就是x的绝对值,例如9的算数平方根是3,81的算数平方根是9。那么如何求出3的算数平方根呢?笔算求算数平方根既麻烦精度又不够,因此我们可以利用二分查找算法来求算数平方根。例如求3的算数平方根,我们让min=0,max=3,那么mid就是1.5,mid²=2.25比3小,说明我们要找的答案在1.5和3之间,我们把1.5写入min,利用公式mid=(max-mid)/2+mid,求出新的mid=2.25,这次mid²=5.0625大于3,说明答案在1.5~2.25之间,我们把2.25写入max,利用公式mid=(mid-min)/2+min求出mid=1.875,mid²=3.515625,依次类推。循环次数越多,得到的算术平方根就越精确。这个程序和上一次程序很像,区别一是读心术程序我们利用按键来比较mid与答案的大小,而求算数平方根我们是利用mid²与y(答案的平方)进行比较;另一个区别是,读心术我们求的是整数,因此需要四舍五入或者忽略小数部分,而求算术平方根不需要这个过程,求算术平方根的程序如图6所示。

图6


二分查找算法虽然查找速度很快,时间复杂度为logn,可是缺点也很明显,就是查找的数字必须要按顺序排列,下一期我们将讲解如何让一组无序排列的数字按照大小顺序排列,敬请期待!


作者简介:赵旭东

              国家级优秀机器人指导教师 

              中国青少年科技辅导员协会会员

              从事8年科技教育工作的科技辅导员

              全国百佳科技辅导员,获国家领导人表彰

              辅导数十名学生在国内外权威机器人赛事中获奖             

              内蒙古日报、东南快报等媒体先后报道其先进事迹

              获教育部、科技部、团中央、国家知识产权局等部委表彰 



长按二维码关注更多机器人教育技术信息