《数学建模纸牌游戏21点(蒙特卡罗法).ppt》由会员分享,可在线阅读,更多相关《数学建模纸牌游戏21点(蒙特卡罗法).ppt(28页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数学建模 纸牌游戏21点一.21点的蒙特卡罗算法第1步 初始化:COUNTER=0.第2步 得到1,13内的随机数x1,x2,y1,y2 计算x1,x2的和SUM1(玩家总点数),的和SUM2(庄家总点数);同时庄家现出自己的第一张牌.第3步 判断x1的值,若10,则将其值改为10,并重新计算SUM1.第4步 判断x2的值,若10,则将其值改为10,并重新计算SUM1.第5步 判断y1的值,若10,则将其值改为10,并重新计算SUM2.第6步 判断y2的值,若10,则将其值改为10,并重新计算SUM2.第7步 判断x1的值是否为1,若等于1将其值改为11,重新计算SUM1,并判断SUM1是否大
2、于21,若大于21则将x1改为1,并重新计算SUM1,若没有大于21则继续第9步;若x1不为1,直接进行第9步.第8步 判断x2的值是否为1,若等于1将其值改为11,重新计算SUM1,并判断SUM1是否大于21,若大于21则将x2改为1,并重新计算SUM1,若没有大于21则继续第10步;若x2不为1,直接进行第10步.第9步 判断y1的值是否为1,若等于1将其值改为11,重新计算SUM2,并判断SUM2是否大于21,若大于21则将y1改为1,并重新计算SUM2,若没有大于21则继续第11步;若y1不为1,直接进行第11步.第10步 判断y2的值是否为1,若等于1将其值改为11,重新计算SUM2
3、,并判断SUM2是否大于21,若大于21则将y2改为1,并重新计算SUM2,若没有大于21则继续第12步;若y2不为1,直接进行第12步.第11步 玩家判断SUM1是否大于等于18或大于庄家第一张牌y1的两倍,若是则玩家停止取牌,跳到第14步;若没有则继续取牌,得到1,13内的随机数xi,进行第13步.第12步 同第4步和第8步,判断xi的值,若10,则将其值改为10,并将其值加到SUM1;接着判断xi的值是否为1,若等于1将其值改为11,重新计算SUM1,并判断SUM1是否大于21,若大于21则将xi改为1,并重新计算SUM1,若没有大于21则回到第12步;若xi不为1,直接进行第12步.第
4、13步 庄家判断SUM2是否大于16,若是则庄家不取牌,则跳到第16步;否则庄家取牌,得到1,13内的随机数yi,进行第15步.第14步 同第6步和第10步,判断yi的值,若10,则将其值改为10,并将其值加到SUM2;接着判断yi的值是否为1,若等于1将其值改为11,重新计算SUM1,并判断SUM2是否大于21,若大于21则将yi改为1,并重新计算SUM2,若没有大于21则回到第14步;若yi不为1,直接回到第14步.第15步 比较SUM1和SUM2的大小,If (SUM121&SUM221)or(SUM1=21&SUM2=21),则为平局,得分SCORE=0;If SUM1=21&UM22
5、1,则玩家赢,得分SCORE=3;If (SUM2=21&SUM221)or (21SUM2SUM1),则庄家赢,得分SCORE=-2;If 21SUM1SUM2 则玩家赢,得分SCORE=2;If 21SUM1=SUM2 则为平局,SCORE=0.第16步 输出得分SCORE.停止.二Matlab程序function y=dian21()a=ones(8,13);%产生8*13的矩阵numz=0;numw=0;pz=;pw=;totz=0;%庄家总点数totw=0;%玩家总点数numz,pz,a=choose(numz,pz,a);totz=totz+pz(numz);numz,pz,a=c
6、hoose(numz,pz,a);totz=totz+pz(numz);numw,pw,a=choose(numw,pw,a);totw=totw+pw(numw);numw,pw,a=choose(numw,pw,a);totw=totw+pw(numw);while 1 if(totw18)|(totw(2*pz(1)break;else numw,pw,a=choose(numw,pw,a);totw=totw+pw(numw);endendwhile 1 if(totz=17)&(totz=21)break;end if totz21&totz21)|(totz=21&totw=21)
7、SCORE=0;else if(totw=21&totz=21)SCORE=3;else if(totz=21&totw=21)|(21totz&totztotw)SCORE=-2;else if 21totw&totwtotz SCORE=2;else if 21totw&totw=totz SCORE=0;end end end endendfprintf(玩家得分SCORE=%dn,SCORE);保存为dian21.mfunction num,p,a=choose(num,p,a)while 1 m=fix(rand(1)*8)+1;n=fix(rand(1)*13)+1;if a(m,
8、n)=1 a(m,n)=0;num=num+1;if n=1 if num10 n=10;end p=p n;break;endend保存为choose.m 然后在然后在matlab中输入中输入dian21,就可以得到如,就可以得到如下数据下数据 dian21玩家总点数SUM1=20玩家总点数SUM1=17玩家得分SCORE=2 dian21玩家总点数SUM1=20玩家总点数SUM1=22玩家得分SCORE=0 dian21玩家总点数SUM1=20玩家总点数SUM1=19玩家得分SCORE=2 dian21玩家总点数SUM1=15玩家总点数SUM1=22玩家得分SCORE=0 dian21玩家
9、总点数SUM1=19玩家总点数SUM1=19玩家得分SCORE=0 dian21玩家总点数SUM1=14玩家总点数SUM1=18玩家得分SCORE=-2这些数据都是随机出现的。这些数据都是随机出现的。这种方法并不是很好,下面对上述游戏策略进这种方法并不是很好,下面对上述游戏策略进行该进。行该进。function y=dian21()n=input(请输入局数:);SUM=0;flag=input(请输入决策数:);%这是一个决策数,我们可以改变其值,测试哪一个值最优for i=1:na=ones(8,13);%产生8*13的矩阵numz=0;numw=0;pz=;pw=;totz=0;%庄家总
10、点数totw=0;%玩家总点数numz,pz,a=choose(numz,pz,a);totz=totz+pz(numz);numz,pz,a=choose(numz,pz,a);totz=totz+pz(numz);numw,pw,a=choose(numw,pw,a);totw=totw+pw(numw);numw,pw,a=choose(numw,pw,a);totw=totw+pw(numw);while 1 if(totwflag)%|(totw(2*pz(1)break;else numw,pw,a=choose(numw,pw,a);totw=totw+pw(numw);ende
11、ndwhile 1 if(totz=17)&(totz=21)break;end if totz21&totz21)|(totz=21&totw=21)SCORE=0;else if(totw=21&totz=21)SCORE=3;else if(totz=21&totw=21)|(21totz&totztotw)|(totw21&totztotw&totwtotz)|(totz21&totwtotw&totw=totz SCORE=0;end end end endendSUM=SUM+SCORE;%fprintf(玩家得分SCORE=%dn,SCORE);end fprintf(玩家得分平
12、均值SCORE=%dn,SUM/n);保存为dian21.mfunction num,p,a=choose(num,p,a)while 1 m=fix(rand(1)*8)+1;n=fix(rand(1)*13)+1;if a(m,n)=1 a(m,n)=0;num=num+1;if n=1 if num10 n=10;end p=p n;break;endend 保存为保存为choose.m 然后在然后在matlab中输入中输入dian21 dian21请输入局数:100000请输入决策数:21玩家得分平均值SCORE=-1.351880e+00 dian21请输入局数:100000请输入决
13、策数:20玩家得分平均值SCORE=-9.434000e-01 dian21请输入局数:100000请输入决策数:19玩家得分平均值SCORE=-3.226500e-01 dian21请输入局数:100000请输入决策数:18玩家得分平均值SCORE=-1.038300e-01 dian21请输入局数:100000请输入决策数:17玩家得分平均值SCORE=3.641000e-02 dian21请输入局数:100000请输入决策数:16玩家得分平均值SCORE=5.810000e-02 dian21请输入局数:100000请输入决策数:15玩家得分平均值SCORE=3.657000e-02 dian21请输入局数:100000请输入决策数:14玩家得分平均值SCORE=2.397000e-02 dian21请输入局数:100000请输入决策数:13玩家得分平均值SCORE=-1.116000e-02 dian21请输入局数:100000请输入决策数:12玩家得分平均值SCORE=-3.628000e-02 可见,在决策数可见,在决策数16时玩家的平均得分最高。时玩家的平均得分最高。所以最终决策是:玩家的总点数大于所以最终决策是:玩家的总点数大于16就就停止取牌停止取牌
限制150内