呵呵,上学期学的数据挖掘里面讲到关于信息量的方法,小试了一下:
猜数字游戏:
? 即有四位十进制数字,一般可猜8次
? 每次返回aAbB(A表示数字正确并且位置正确,B表示数字正确但位置不正确)
? 如:假设要猜的数字是1234,如果游戏者猜0134即返回2A1B(3、4为A,1为B)
思路:
? 模拟人猜数字的过程,先构造一个集合包括所有可能的数字(10*9*8*7=5040种),先乱猜一个,根据返回xAxB来把原来集合里面的不符合的都删掉,然后根据选取下一个。选下一个的原则是:选最能区分剩下的集合的那个数,即:被选择的那个数得到的返回值为xAxB中任意一种的概率差不多。
? 我使用信息量的方法,即:
?? 对集合set(size个)中每一个数字n,用n的每一种返回值(从0a0b到4a0b,共有15种)做删减,看各剩下多少个,用pi表示第i种返回值得情况,然后根据信息量公式:info(n) = ∑(pi/size) * log(pi/size)计算,然后取max(info(i)) i=0..size;最大的那个info(n)对应的数字就是被选择的数字。
http://www.blogbus.com/blogbus/blog/userfiles/16192/1089196646.rar
压缩包中包括源码和经过VC6.0编译生成的可执行文件
GuessNumGame.dsw:简易的猜数字游戏
GuessNum.dsw:由计算机来猜数字,基本上6-7次就可以了
GuessNumAll.cpp:尚未编好,打算用来使用决策树方法猜数字,并可以算出对所有的数最多需要多少次
思路简单,但是计算起来很慢,做成Release版还勉强可以忍受有没有其他方法比较快啊?
本文地址:http://com.8s8s.com/it/it28466.htm