《数学建模纸牌游戏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,重新计
3、算SUM2,并判断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,直接进行
4、第12步.第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=
5、21&UM221,则玩家赢,得分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);num
6、z,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(totw18)|(totw(2*pz(1)break;else numw,pw,a=choose(numw,pw,a);totw=totw+pw(numw);,endendwhile 1 if(totz=17)for i=1:numz,if pz(i)=11 pz(i)=1;totz=totz-10;
7、b=1;break;end end if b=0 break;end endend,fprintf(玩家总点数SUM1=%dn,totw);fprintf(玩家总点数SUM1=%dn,totz);SCORE=0;if(totw21,else if 21totw 保存为dian21.m,function 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 num21 n=11;end end,if n10 n=10;end p=
8、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玩家总点数SUM1=19玩家总点数SUM1=19玩家得分SCORE=0 dian21玩家总点数SUM1=14玩家总点数SUM1=18玩家得
9、分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;%庄家总点数totw=0;%玩家总点数,numz,pz,a=choose(numz,pz,a);totz=totz+pz(numz);numz,pz,a=choose(numz,pz,a);totz=totz+
10、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);endendwhile 1 if(totz=17)for i=1:numz,if pz(i)=11 pz(i)=1;totz=totz-10;b=1;break;end end if b=0 break;e
11、nd endend,%fprintf(玩家总点数=%d,,totw);%fprintf(庄家总点数=%dn,totz);SCORE=0;if(totw21,else if 21totw 保存为dian21.m,function 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 num21 n=11;end end,if n10 n=10;end p=p n;break;endend 保存为choose.m 然后在matlab
12、中输入dian21,dian21请输入局数:100000请输入决策数:21玩家得分平均值SCORE=-1.351880e+00 dian21请输入局数:100000请输入决策数: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就停止取牌,谢谢,