斗地主之目前的问题

原创 2017年10月11日 08:21:16

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

公众号

版权声明:本文为博主原创文章,未经博主允许不得转载。

斗地主AI算法——第十三章の主动出牌(2)

上一章我们已经搭好了出牌算法的基本框架,本章主要实现优先处理的三带、飞机等牌型。 首先定义一些基本变量: //暂存最佳的价值 HandCardValue BestHandCardValue; B...
  • sm9sun
  • sm9sun
  • 2017年04月27日 16:26
  • 1665

斗地主AI算法——第五章の总值计算

本章算是比较重点的一章,前一章已经对各个牌型做出了价值定义,本章主要实现计算手牌总价值模块函数。 根据之前的思路,我们设定一下输入输出: 输入:手牌数据类(主要用手牌个数nHandCardCount以...
  • sm9sun
  • sm9sun
  • 2017年04月26日 19:48
  • 2217

斗地主AI算法——第二章の数据结构

上一章我们已经确立了进本的业务逻辑处理流程。从本章开始,我们便进入开发阶段。 首先就是明确我们都需要哪些数据,且它们以怎样的形式存储。 首先从上一章反复提到的手牌权值结构说起,也就是F()的返回值...
  • sm9sun
  • sm9sun
  • 2017年04月26日 16:00
  • 3398

java 写一个可以给斗地主玩家随机发牌的程序。

需求:写一个可以给斗地主玩家随机发牌的程序。a:牌可以随机发给三个玩家b:在控制台打印每个玩家的牌。c:对每个玩家手中的牌按照大小排序。 牌的花色:"♠", "♥", "♣", "♦" 思路:创...

[NOIP2015]斗地主 搜索+贪心

4325: NOIP2015 斗地主 Time Limit: 30 Sec  Memory Limit: 1024 MB [Submit][Status][Discuss] Description ...

Java四人网络斗地主游戏《客户端》swing界面

这是本人把一个三人斗地主改成四人的 河南南阳地区的玩法 下载本游戏代码http://www.crazyit.org/viewthread.php?tid=9375&page=1&extra=#pid1...
  • zwyjg
  • zwyjg
  • 2013年05月18日 18:17
  • 2615

NOIP2015 斗地主 解题报告(搜索)

在线评测: http://codevs.cn/problem/4610/ 整体思路: 首先我们明确一件事,如果手里的牌不打龙的话,那么通过贪心,最优解是固定的。那么我们可以只去搜索龙...

java基础7:map集合原理详解及斗地主游戏案例

第1章 Map接口 1.1 Map接口概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图。 l Collection中的集...

已上线运营的斗地主APP项目源码,出售(超低价)----(Android商业项目客户端)

超级斗地主APP商业项目源码,低价售于热爱学习的同行。您只需支付167元,即可拥有这套商业源码,提高您的技术开发能力、增色您的项目经历、增长您的工资收入。 此款斗地主最大的亮点是拥有强大的AI以及智...

斗地主AI算法——第四章の权值定义

第一章业务逻辑结尾部分我提到了权值的计算方法: ①每个单牌都有一个基础价值②组合牌型的整体价值与这个基础价值有关,但显然计算规则不完全一样。③整手牌可以分成若干个组合牌,但分法不唯一。 当时,我说了...
  • sm9sun
  • sm9sun
  • 2017年04月26日 18:04
  • 2555
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:斗地主之目前的问题
举报原因:
原因补充:

(最多只允许输入30个字)