
猜数字的解法
求解猜数字游戏的策略通常有两个目标:一是保证在猜测次数限制下赢得游戏,二是使用尽量少的猜测次数。第一个目标追求的是最坏情况下的猜测次数最少,第二个目标追求的是平均情况下猜测次数最少。对于某些数码和数位的规则组合,这两个目标不能同时实现。例如,对于4个数位、6个数码的 Mastermind 游戏,平均猜测次数最少的策略需要平均 4.340 次,但最坏需要6次猜测;如果限制猜测次数最多为5次,则平均猜测次数最少的策略需要平均 4.341 次。
目前解法最少需要7次猜测,平均次数最少的解法由田中哲朗与1996年提出,平均次数为5.213次。
系统的猜测策略可分为三类:简单策略、启发式策略和最优策略。下面以标准规则(10个数码,4个数位,不含重复数字)为例,介绍这几类策略。这些策略也适用于其它规则变体。
这种策略非常直接——每次都猜可能答案中的第一个。例如,首先猜测1234,如果得到的反馈是 2A0B,那么可能的答案包括1256,1257,5236,等等。根据简单策略,下一次就猜1256,因为1256是所有可能答案中最小的数字。
简单策略的优点是速度非常快,缺点是所需猜测次数很多。对于标准规则,简单策略最多需要9次猜测,而平均需要5.560次。
这类策略是猜数字游戏最常用的解法。其算法步骤如下:
a. 首先猜 1234,得到第一个反馈(xAyB)。
b. 从所有数字中,筛选出满足已知反馈的所有可能数字,称之为“可能集”。
c. 对于所有数字(而不仅限于筛选出来的可能集),逐一评估每个数字的“好坏”,并给其打分。选取得分最高的那个数字猜。如果有多个数字的评分一样高,则优先选取可能集中的数字。
d. 重复步骤 b-c,直到猜出 4A0B 为止。
显然,启发式策略的重点在于如何评估一个数字的“好坏”?人们提出了多种直观的评价指标。简介如下:
最坏情况指标(Knuth, 1977) :这是最早出现在文献中的策略,在 Mastermind 规则下效果很好。给定一个数字,如果猜这个数字,那么接下来我的“可能集”至少会缩小多少?选取使可能集在最坏情况下最小的那个猜测。对于标准规则,这一评价指标最多需要7次猜测,平均需要 5.385 次。
平均情况指标(Irving, 1978):这是一个相当直观的指标,在各种规则变体下均有较好的效果。给定一个数字,如果猜这个数字,那么接下来我的“可能集”平均会缩小到多大?选取使可能集的预期大小最小的那个猜测。对于标准规则,这一评价指标最多需要7次猜测,平均需要 5.268 次。
预期步数指标(Neuwirth, 1982):又称“熵”指标。给定一个数字,这个指标计算如果猜测这个数字,那么接下来估计还需要多少步才能猜到答案。当然,这个步数只是一个粗略的估计,它假设每次猜测可以将可能集缩小一半(或缩小某一个常数倍k),于是估计步数就是可能集大小的对数函数,即估计步数=log(可能集中元素的个数)。对于标准规则,这一评价指标最多需要7次猜测,平均需要 5.265 次。
反馈个数指标(Kooi, 2005) :给定一个数字,这个指标计算该数字所可能带来的不同反馈的个数。反馈越多的越好。对于标准规则,这一评价指标最多需要8次猜测,平均需要 5.308 次。
此外,值得注意的是,启发式策略的效果也经常取决于所有数字的排列。不过影响一般不大。
猜数字游戏的最优策略需要由计算机用穷举法获得。其思路是,由于每次猜测的选择是有限的(因为总共的数字组合个数有限),并且我们知道一定可以在有限次数内猜出所有答案,那么计算机可以穷举所有猜法,从中找出最佳的策略。
此外,也有一些文献采用遗传算法等求解猜数字问题,在此不详述。