斗地主之目前的问题

在具备了初始的入门级打牌能力,验证了系统的可行性之后,剩下的就应该是努力提高系统打牌的水平了。由于形成初始打牌能力只用了80多条规则,而且都是非常粗略的规则,所以提高打牌能力的思路似乎比较简单:只要提高规则的精细化程度,使之尽量覆盖到各种情况就好了。所以笔者之后就一直在重复:打牌、发现不够精细的地方、增加规则覆盖这种情况。

直到某一天我却很尴尬的从这种循环中发现了个现象:打牌规则从80多条,飞速增加到了160多条,最后增加到三四百条,打牌水平不但没有什么提高,反而出现了非常明显的颠簸现象,即上一手牌好精妙、下一手牌却臭狗屎,尤其是在能看到所有牌的调试模式下,看着明明有更好的选择却打了最烂的牌,简直撞墙的心都有啦:(

可是就算把楼撞塌了也解决不了问题啊!还是老老实实想想这到底是怎么回事吧。静下心来反复思量下,其实原因也很简单:人工智能最常见的组合爆炸而已啦:(

比如,被动出牌时,即其他玩家出了手牌轮到我出了,我们的规则涉及到谁(地主、下家、对家、门板)出了什么类型(单张、对子、三张、三带二、顺子、连对、飞机、飞机带翅膀、炸弹)的什么样的牌(非常大、大、有些大、一般、有些小、小、非常小),然后我是谁(地主、下家、对家、门板)该出什么样的牌来进行应对。

简单估算下,就最简单的覆盖这些情况至少就需要:4(玩家角色)×9(牌型)×7(大小)×3(我的角色)×3(我的选择,需要根据玩家出牌来选,所以按中值估计,这还没考虑是否有炸弹、是否用炸弹)=2268种组合,这还只是被动出牌,还有主动出牌,同时也没有考虑各玩家的出牌历史、也没有考虑各农民之间该如何配合、更没考虑出某手牌是否会出现拆牌、拆炸弹等等情况。

所以,规则越精细,即规则越是针对某些情况,则规则遗漏的情况就越多,相应的一手牌能被规则覆盖住的概率就越少、被覆盖的规则条数就越少,而本质上,我们就是对一手牌用多条规则进行多角度的考察来决定其价值的,这种情况下,当某手牌恰好符合某条规则所针对的情况时,就是好牌,而当某手牌没有被有针对性的规则所覆盖,而由某条作为最终防守性质的规则捕获时,就是臭牌了:(

除了这个问题,还发现了一个非常严重的问题:同样的规则在不同局面下所发挥的作用应该是动态的。也就是说,我们最终到底出什么牌或是不要,就是看各规则对待选牌手的价值评估的大小。可这些规则所指定的价值都是固定的,无法随牌局的不同能自动调整给出的价值判断:如果地主想走,我就要不惜代价的停住他;如果地主只是想顺牌,那就没必要用太大的牌。

问题在于:这些对牌局的判断,如果不引入,显然不可能提升打牌水平,而如果引入,再结合上面说的组合爆炸问题,简直就是一个巨大的灾难啊:(

针对第一个问题,解决办法其实比较简单,就是转变规则的应用方式,使之从单一规则同时对各种状态组合考察转变为多条规则的多角度、各状态分立综合考察。而针对第二个问题,则需要模拟人类思考解决问题的办法,引入短期目标系统:

  • 判断当前局面,比如根据连门板的顶牌都压判断地主有走的企图

  • 根据对当前局面的判断形成策略,比如地主想走,则应停住地主

  • 综合目前的各策略来拟定当前的短期目标,比如根据停住地主这个策略来筛选实施规则,同时根据之前所判断出的地主走的企图的强度,确定实施强度

  • 按拟定的短期目标实施策略,即用确定的实施强度调整所筛选出来的策略实施规则的权重,通过这些规则权重的变化从而影响对牌手的价值判断,最终落实策略的实现

需要理解的是策略是对某种情况的应对,而目标则是对多个策略的综合,比如:地主想走、而对家也想走,所以下家的目标是:既要停住地主又要放走对家。而门板因为无法越过地主放对家,所以门板的目标就是顶住或停住地主。

唉,所有的规则都要重写,又得进入打牌、调整规则的死循环啦:(

====================================================================================================

关注我的公众号及时获取推送的最新文章

公众号

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jxandrew/article/details/78199428
个人分类: 人工智能 斗地主
想对作者说点什么? 我来说一句

一个c++编写的斗地主游戏源码

2008年12月09日 1.74MB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭