石头剪刀布的惩罚方法 统计思维——石头剪刀布获胜方法
本文共计约3000字,建议阅读时间3分钟
目录
统计思维——石头剪刀布结果并不完全随机
统计思维——石头剪刀布获胜算法
在前面的文章中,我们有提到石头剪刀布这个游戏是有一些策略可以设法提高胜率的,但这个前提是对手并不是完全随机出手。当你的对手不是完全随机出手的时候,就有一定规律可循。在本文中我们主要探讨一个话题,在石头剪刀布这个游戏中,可以有什么获胜的策略,在与人对战中提升胜率。如果在游戏中两位都选择最优策略的话,将会是两个人都随机出手势,形成一种纳什均衡。而如果你的对手就是一个没有感情的随机数发生器,那最好的应对策略也就是让自己成为一个随机数发生器,然后期待运气站在自己这一边。
但实际上,人类非常不擅长随机性,在石头剪刀布的游戏中,我们总是不可避免的受到心态的影响,比如已经连出了好多次石头是不是要换一个出,比如刚刚出剪刀输了,是不是要换成布来试图获胜呢。在上文中,我们介绍了在真实世界中,大概有哪些思路。本文将以石头剪刀布编程比赛为基础,探索如果要把策略具体化,该如何设计我们的策略。
本文各种方法主要来自于Rock Paper Scissors Programming Competition这个网站,不过很遗憾它已经在三年前由于入不敷出基本处于停止运营的状态了,但还能用,之前的结果也都还在。在网站中,参与者可以提交自己的代码,然后与其他人的代码进行比赛,并且真人也可以选择与相应的策略进行比拼。网站会自动匹配不同策略,并计算出相互之间的胜率,因此这里的胜率应该是在网站中有效策略池中随机匹配的结果,并不是与真人对战的结果。另外作为参考,2020年kaggle也有一场关于石头剪刀布的比赛, 这场比赛中冠军的获胜思路也差不太多,是一个基于历史信息匹配的多策略选择方法。
通过后面的分析,也可以知道,我们只要知道对手历史出手的所有信息,就能通过找规律的办法,提升自己的胜率。这里的隐藏假设就是人或者机器,很有可能会重复自己之前的操作,而不是真正随机。
算法策略
石头剪刀布是一款预测对手的游戏。这是一个难题。刚接触这个的人可能会问:“为什么不随机玩呢?” 众所周知,连续击败随机玩家是不可能的。那又何苦呢?事实证明,随机策略只能赢得 50% 的比赛。然而,一个好的预测算法可以利用不那么随机的对手(包括人类)的模式并更频繁地击败他们。事实上,排行榜上一些最强的引擎的胜率超过 80%。假设你有 10 个对手,其中 9 个随机玩,1 个总是玩摇滚。如果你也随机玩,你赢的几率是 50%。然而,如果你总是玩纸牌,那么你的胜率是 55%,因为你总是会击败总是玩石头的人,同时与随机玩家的表现仍然相同。55% 的胜率比 50% 的胜率要好。重要的是,只要池中只有一个非随机玩家,利用这些模式的算法总是会做得更好。在本小节中,我们介绍一下不同的策略,主要基于石头剪刀布网站上的数据,该网站当前已经处于半停止运行的状态了。作为一个简单的游戏,石头剪刀布并没有用到高深的算法来学习,基于规律的方法总结就基本上是终极方案了。
策略0:随机策略
随机是最稳妥保守的策略,没有任何一种策略可以绝对战胜随机策略,但遗憾的是人类需要很大的努力才有可能使自己每次出招都是随机的。在机器上,使用随机数生成器可以做到基本随机,在不同策略中比赛的胜率也刚好在50%左右。
策略1:固定策略
永远只出石头,这个策略如果对手是随机的,那其实胜率也是能到50%的,但是很容易被人看穿然后输掉比赛。在实际线上跟各个策略比较时,胜率只有16.62。不过个人感觉这是因为程序对抗的过程中比赛的周期都比较长,如果你就是比个三局两胜你出三个一样的估计问题也不大。只要你跟对手没有那么熟悉,不被对手知道你每次都出一样的这件事情就好了。
策略2:周期策略
石头剪刀布循环,在实际生活中,可能也有人会采用这样的策略,比如石头->剪刀->布,或者石头->布->剪刀这种有周期性的模式,或者更复杂的周期性模式。这种模式跟固定策略其实差不太多,固定策略可以看作是每次+0的循环,周期策略可以每次+1或者每次+2。当然,这种策略需要更长的时间才有可能被看穿,因此胜率相比固定策略还是有了大幅提升。下面是一个每次出手都是相比上一次+1的策略取得的分数。这一策略在网站上匹配了5000多局,胜率为39.58%,相比于固定策略,已经有很大提升了。
策略3:反周期策略
这个算法假设对手是在使用循环策略,然后尝试识别对手的循环模式,然后自己选择领先对手一步的循环模式。下面这个例子保留了前两次出手的模式然后试图出一个更超前的手势,不过看起来它只是比单纯的周期策略更复杂,因此胜率也稍有提升,但依然不到50%。一共匹配了7000多局,胜率为41.52%
策略4:胜过对手的上一次出手
按照上面所描述的,如果上一局赢了,则出能赢自己的手势,如果上一局输了,则出能赢对手的手势。如果平局,则出随机的手势。这部分暂时没有找到现成的策略,所以没有得分数据。这个策略有一个稍微类似的策略,即在每次对手出完之后,出能胜过对手之前的手势,但这个策略对于机器来说,依然是相对容易被猜到的,所以胜率还是40.36%。跟反周期策略差不多
策略5:计算出手频率
在之前的策略中,基本上都只考虑非常短期内的出手结果,而为了更好的获胜,一般都需要相对长一点时间的对战中对手出了哪些手势。首先一个方法就是基于出手频率的方法,该算法计算对手之前的动作,以确定对手是否更喜欢使用一种动作而不是其他动作。本质上,它为石头、剪刀、布保留了一个“分数”。每次出手后,对手出手的相应分数都会增加。这样的算法很容易击败固定算法,包括一直出石头或者一直循环,因为这些策略对应的出手频率都有比较严格的数值,容易通过。
可以对该策略进行更复杂的变体,比如在算法中让分数会递减,使它更容易受到最近结果的影响,并使其能够适应缓慢变化的对手。举例来说,如果对手最近出石头比较多,则布的分数会增加,但剪刀的分数会减少。使用这一策略的胜率会随着具体实现的变化而变化,最简单的基于频率的方法就是预期对少哪个手势出的最少就预期下一个手势会出哪个,这种方法胜率为30%,而加入了递减等策略之后,胜率可以超过50%。
策略6:历史模式匹配
这种策略就是前面提到的kaggle在2020年比赛依然有效的模式,主要的想法就是某一个出招顺序历史上出现过,那么历史上的下一招很有可能跟下一招是一样的。例如,如果对手的出手历史如下所示:
image.png
这时候,就可以预测下一次对手很有可能要出剪刀。那我们对应出石头就能提升获胜的概率。使用这一策略之后,胜率来到了64.06%。当然在历史匹配的时候还是有很多小技巧,比如匹配的长度,遗忘速率等等,这个方法应该是胜率最高的单一策略了。后面就是考虑如何将各种策略组合起来。所以如果是真实的比赛中,你能够记住对手曾经出过的所有手势,对获胜其实应该是有帮助的。
策略7:组合策略
如果每个策略有六种可能的元策略,我们如何选择使用哪一种?如果我们一开始就有多个策略怎么办?做到这一点的方法是根据过去的表现进行选择。如果一项策略成功,我们就会使用该策略。如果一种策略总是失败,我们就不会使用它。比如我们可以使用打分的方法用来评价不同的策略,然后选择得分最高的一个策略作为真实的出手方法。朴素评分(胜率67.1%):为每个预测变量存储一个数字。每轮结束后,如果预测器成功预测对手的动作,则其得分加一。
如果预测输给了对手的棋步,则其得分减一。衰减评分(胜率78.2%):这就像朴素评分一样,只不过每轮之后所有分数都乘以 0 到 1 之间的数字(通常在 0.9 左右),这样它就会逐渐“忘记”每个预测器很久以前的表现。因此,如果对手偶尔改变策略,这应该可以应对。这里大概就是不同策略最终的样子了,当然可以做一些更复杂的逻辑来选择更多的基础策略,但总体思路大体都差不多。最后就是需要有退出机制,当算法发现所有的策略都不好使的时候,也就是对应我们人被对手猜透的情况,要回退成随机出招的形式。
小结
从策略分析来看,就石头剪刀布这个游戏而言,对手的出手顺序也是有可能重复的。这说明只要我们能够记住对手的历史出手风格,就有增加胜率的机会,这个结论也比较好理解。
通过上述描述,我们可以看出灵活多变的优化策略可能取得更好的效果,对于真实的情况也大致如此。在面对石头剪刀布这个游戏时,先根据自己掌握的信息选择一种方案,当没有好的方案时,就真的随机出手。在其他事情上其实也是如此,有些看似随机的东西,依然可以通过努力获取信息差和认知优势,来提升一点自己取胜的几率。
往期推荐
-如果喜欢这篇文章,请关注我
我是永远向上的百灵
点击“赞”和“在看”
您的认可是对百灵最大的鼓励
调
本文使用 文章同步助手 同步
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权本站发表,未经许可,不得转载。