人机对弈取火柴游戏先解开取胜的奥秘

前面说过,当你还没有掌握取火柴游戏的取胜奥秘之前,恐怕与计算机对赛10回,人都是要输掉的。这个游戏规定,总共有100根火柴,人与计算机轮流着取,第一次总是让人先取,接着计算机取。每次可以取1-10根火柴,谁最后取走剩下的最后一批火柴,谁就取胜。规则是定为人先取,人或许还有一线希望取胜。如果将程序设计为计算机先取,那么人就没有一丝机会取胜了。细细分析可以发现,在每一轮的取火柴的对弈中必定有九个“来回”,每一个来回都是人先取,然后计算机接着取。如果人希望获胜,那么从第一个“来回”就需要是“正确”的,任何一次的错误都会让计算机“占领”住“得胜点”。计算机一旦占领“得胜点”,人就绝对没有翻盘获胜的机会了。编写程序的“算法”保证计算机能够像非常有耐心的猫死死盯住老鼠洞口那样,等待老鼠犯错误,任何一次老鼠的错误,都将导致猫必定能够逮住老鼠。
由于最后把火柴取完的一方可以取 1至
10根,所以如果对手取完后余下火柴为1至10根,则他就输了反之若某方取后余下11根火柴,则对方不论如何取,都不可能取完,但不论如何取,余下火柴数都不会超过10根。所以谁要想获胜就必须保证自己在取完后余下11根火柴。而为了保证在自己取完后余下11根火柴,应在此前一次取时留下
22根火柴,以便对方取走 1至 10根中的某一种后,自己再取成11根,依次类推,谁先抢到“11”谁就取胜,据此可得解法:
由于
100=11×9+1,所以第一个取的人只要先取 1根,余下 99根.当对方取走 K根后,自己取
11-K根(K=1,2,3…,10)就可保证获胜.
而如果先取者第一次取时超过1根,那么后取者可抢到11,此时后者可获胜。这里讲“谁一定胜?”指的是在不犯错误给对方以可乘之机的前提下取胜。
只要某方第一次取1根,以后每次已取K根后,他再取11-K根即可保证获胜(K=1,2,3…,10)。
简单些说,如果你要取胜,你必须给对方留下99、88、77、66、55、44、33、22、11根火柴。这样子最后一次无论对方取多少根火柴,必定会留下您一次就能最后取光的根数。而计算机呢则是紧紧盯住99、88、77、66、55、44、33、22、11这9个关键点,只要您有一次失误,关键点一旦被计算机夺取,您就再也没有取胜的可能了。计算机就是依靠make "j
:n-11*(int(:n/11))这一条命令顽强地寻找每一次可能取胜的机会。
现在您明白了吗
这个计算机小游戏展示的是初级的计算机人工智能。如果人从开始就一次都不犯错,则有可能取胜。而计算机则是顽强地盯住99、88、77、66、55、44、33、22、11根火柴这些“得胜点”,一旦人有一次疏忽,被计算机占据了“得胜点”,人就必定会输。更高级的人工智能还包括“学习”功能——这太厉害了。那个make
"j
:n-11*(int(:n/11))算法其实是人教给计算机的。更先进的算法是计算机自我学习,自己找新的算法。像战胜所有人类围棋手的计算机程序“阿尔法go",它会自己摸索着自己跟自己下棋,积累经验,探索出前所未有新的下法——这些计算机棋手的围棋下法是连“九段”棋手都目瞪口呆的违反“老常识”的套路——经典的围棋谱绝对不会这样下的呀。至今人类围棋手已经基本不是计算机的对手!但是要明白一点:计算机人工智能的自我学习方法,其实也是人类教给它的。当下我国在计算机人工智能方面的发展已经走在世界的前列。
我们这个取火彩LOGO游戏只是“小小玩意”。有志学习计算机编程的爱好者好好努力吧。





加载中,请稍候......