吴昊品游戏核心算法 Round 7(特刊)—— (转载)猜数字系列 第二弹 AI(启发式算法VS直觉算法)

小游戏“猜数字”及其拓展

一、 题目背景

  标准规则
 
通常由两个人玩,一方出数字,一方猜。出数字的人要想好一个没有重复数字的4
位数,不能让猜的人知道。猜的人就可以开始猜。每猜一个数字,出数者就要根据这个
数字给出几A几B,其中A前面的数字表示位置正确的数的个数,而B前的数字表示数
字正确而位置不对的数的个数。   
如正确答案为 5234,而猜的人猜 5346,则是 1A2B,其中有一个5的位置对了,
记为1A,而3和4这两个数字对了,而位置没对,因此记为 2B,合起来就是 1A2B。  
接着猜的人再根据出题者的几A几B继续猜,直到猜中(即 4A0B)为止。
 
ﹰ 猜测次数限制
 
猜数字游戏通常设有猜测次数的上限。根据计算机测算,如果采用严谨的猜测
 
 
策略,任何数字最多8次就可猜出(即达到 4A0B)。值得注意的是,在有些地方把
次数上限定义为最多几次猜测以后就可以肯定数字是几,但这时或还需要再猜一次
才能得到 4A0B 的结果。
 
ꓐ 数码与数位变化
 
标准的猜数字游戏由10个数码(0-9)和4个数位组成。可以通过变化数码或
数位来丰富游戏。例如,可以使用9个数码玩4个数位的游戏,或者也有玩儿6个
数位的游戏。
 
ꓐ 允许重复数字
 
猜数字游戏的一种变体允许重复的数码。这种规则的游戏被称为 Mastermind。其
规则大致为:   
除了上面的规则外,如果有出现重复的数字,则重复的数字每个可能被计算多次。
例如,如正确答案为5543,猜的人猜5255,两个比较后第一个5位置正确,记为1A;
第二个5位置错误,记为2B,第三个5位置错误,记为2B,故最终反馈为1A4B。
 
二、 算法分析
 
为了体现人工智能即使用计算机计算的优势,我在程序中设计了两种算法:模拟人
类猜数字模式的直觉算法和利用计算机强大计算功能的启发式算法。
 
ꓐ 直觉算法
 
直觉算法就是模拟人类在进行猜数字游戏时采用的策略,即逐次猜测并根据猜测结
果排除掉不合理的数字组合,并从依然可能的答案集合中随机选择一个继续进行猜测
(当然实际生活中的情况是,人们更倾向于在刚刚猜测过的那个数字的基础上加以改变,
用来当做下一次猜测的数字,但本质上这和随机选取一个可能答案并没有区别),直至
得到4A。
考虑到程序的简洁性,我们在程序中采用一种更直接的策略——每次都猜可能答案
中的第一个。例如,首先猜测1234,如果得到的反馈是 2A0B,那么可能的答案包括
1256,1257,5236,等等。根据简单策略,下一次就猜1256,因为1256是所有可能答
案中最小的数字。如前所述,每次都猜最小的和随机猜一个从本质上讲也是没有区别的,
而采用这样的策略可以避免因为使用随机数而带来的结果浮动。不难想象,如上所采用
的直觉算法就应当是无数次采用随机猜测算法得到的统计结果的极限值。
简单策略的优点是速度非常快,缺点是所需猜测次数很多。具体的情况会在后面介
绍。
 

  启发式算法
 
这类策略是猜数字算法中的主要优化算法,其基本步骤如下:
 
综上,启发式算法也可以有多种方案,而且主要的变化就在于评判一个数字“好坏”
的标准上。以目标不同,启发式算法可以衍生出如下一些子算法:
 
1) 减少最坏情况:如果猜这个数字,那么接下来的可能集至少会缩小多少?这一
指标越大,则该数字越好。这种算法相当于尽力的避免出现最糟糕情况;
2) 平均情况最优:如果猜这个数字,那么接下来的可能集平均会缩小多少?这一
指标越大,则该数字越好。这一算法相当于使得每一步的期望缩减率最大;
3) 预期步数最少:如果猜这个数字,那么接下来预期需要多少步才能达到答案?
这一指标越小,则该数字越好。容易知道,估计步数的函数应当是可能集元素
数目的对数函数,因此要用到加权对数值作为判断依据。事实上,这一定义和
信息熵的定义有异曲同工之妙,故又称为“熵算法”。
4) 反馈种类最多:如果猜这个数字,那么接下来可能得到多少种不同的反馈?显
然,反馈种类越多,那么我猜这个数字直觉上可以排除掉的数字也就越多,也
就是说这个数字越好。当然,我们能够感觉到这一方法有比较大的直觉成分在
其中。
 
本项目中我对以上这四种策略都进行了尝试,并最终选择第三种函数作为启发函数。
a.首先任猜一个数(例如
1234),得到第一个反馈(xAxB)
b.从所有数字中,筛选出满足
已知反馈的所有可能数字,
称之为“可能集”。
c.对于可能集中的数字,逐一
评估每个数字的“好坏”,并给
其打分。选取得分最高的那
个数字猜。如果有多个数字
的评分一样高,则随意选取
一个
d.重复上面b-c,直至猜出4A
为止
 
因为我感觉第三种方法的理论依据最为牢固,实验效果也比较稳定。
 
三、 程序介绍
 
本程序结构比较简洁,主要思路一目了然。功能上,本程序可以进行:
1. 针对4位标准规则、4位Mastermind可以选择直觉算法或启发式算法,由人工输入
进行测试;
2. 针对4位标准规则、4位Mastermind可以选择直觉算法或启发式算法,有计算机自
动进行所有四位数的测试,并实时显示测试进度及测试结果;
 
四、 效果展示
 


 
五、 思考总结
 
촠 直觉算法VS启发式算法
1) 标准规则
步数
方法
1 2 3 4 5 6 7 8 9 平均
直觉 1 13 108 596 1668 1768 752 129 5 5.56032
启发 1 13 109 647 2077 1904 284 5 0 5.31329
 
根据上述表格,我们不难发现,采用启发式算法要比直觉算法优越一些。特别的,
启发式算法大大减少了较高的猜测步数(7,8,9),这对于“实战”中玩儿游戏是很有意
义的,因为实际游戏设计中通常以步数为主要的评判指标。
但另一方面,我们不得不承认对于标准规则,启发式算法并不能够比直觉算法在统
计意义上取得太大的领先。就平均猜测次数而言,双方相差无几。这主要是由于规则限
制比较简单导致的。
 
2) Mastermind
 
步数
方法
1 2 3 4 5 6 7
直觉 1 4 25 108 305 602 1022
启发 1 14 252 1628 4010 3363 712
 
 
步数
方法
8 9 10 11 12 13 平均
直觉 1601 2359 3321 565 81 6 8.7321
启发 20 0 0 0 0 0 5.2669
 
由这张表格,我们可以发现在Mastermind规则下启发式算法全面大大优于直觉算
法。不仅平均猜测次数减少了3.5次,而且启发式算法也将最大的猜测次数限制在了8
次以内,而用直觉算法则可能要猜测多达13次。由此我们可以想象,当问题进一步复
杂化之后,启发式算法可以和直觉算法拉开更大的差距。
 
䊰 总结
 
综上,我们可以看出,使用启发式搜索的方式会比直接搜索要优化不少,这也和课
上讲过的A算法和宽度优先的不同有相似之处。显然随着待搜索集合的扩大话,搜索
规则的复杂化,使用带有启发函数的搜索方式比简单的按某种方向或者是直觉来搜索要
来的更有效率。
另一方面,在我的这个项目中我也注意到这样一个有趣的现象:使用启发式算法的
运算速度要远远低于直觉算法。很明显的,在本问题中,计算启发函数的值占用了大量
的资源,而且其时间复杂度是超越了指数的级数级别,这也是我没有对更多数字位数进
行测试的原因。事实上,本问题已经被证明是NP-hard问题,因此目前为止还不存在多
项式复杂度的运算方法。
总而言之,通过的这次作业我在一个比较简单的问题上尝试了多种解决方案,得出
了比人更优的策略,也验证了不同搜索模式之间的优劣关系,体会了他们的优缺点。这
次作业对我深入理解人工智能有很大的帮助。
 
 




posted on 2013-02-27 22:07  吴昊系列  阅读(1196)  评论(0编辑  收藏  举报

导航