最佳算法的假设:
1.开局前所有已经发过了的牌都是已知的。
2.还没有发的牌的存放顺序是随机的。
算法的描述:
本算法用来判断玩家应该继续要求发牌还是停止发牌以获得最大的获胜概率。具体细节如下:
设还没有发的牌以及对手手中不透明的牌的集合为A;已经拥有的牌的集合为B;
情况1:玩家为庄家。对手手中有N张牌。N不小于2。
计算A的排序可能性,有如果对手手中有n张牌,并且A集合有M张牌,则A集合应该有f=(M,n)种可能。
初始化:将A集合的牌排序。并保证新的A序列在之前没有出现过。如果已经排序过f=(M,n)次,则跳转最终判断段。
发牌给对手:给对手发满N张牌,计算对手分数,如果大于等于21分,则重新初始化A。
发牌给自己:给自己发满5张牌。
判断发牌与不发牌哪种赢的概率大:比如,手中有2张牌,if 不发牌,win;发牌win的概率小于1,then不发牌的flag数字加一。如果两种概率相等,则不加任何一个flag。
重新初始化。
最终判断:如果不发牌的flag〉=发牌的flag,then选择不发牌;else发牌。
情况2:玩家为非庄家。
计算A排序的可能性。设最多有排序f种。
初始化:将A集合的牌排序。并保证新的A序列在之前没有出现过。如果已经排序过f次,则跳转最终判断段。
给对方发一张牌:作为庄家未知的那张牌。如果超过或者等于21点,则重新初始化。
计算:在不发牌直至发满牌的各种情况下,用情况1的办法计算庄家会采取的行动。判断相应的flag增减情况。
重新初始化。
最终判断:如果不发牌的flag〉=发牌的flag,then选择不发牌;else发牌。


类别:
标签: