我从事棋牌开发工作已经6年了,我一直喜欢玩斗地主,腾讯上面的我经常玩,别人的也经常玩,对于斗地主机器人智能效果,一直都未发现那个平台做得比较令我满意,所谓的好,我觉得机器人常见牌要打得有点水准,拆牌,顶牌必须要有,还要比较接近人的出牌逻辑,这样玩家的体验感会好很多,我内心其实一直都有一个好的想法去实现更加智能斗地主机器人,趁着最近工作也比较空闲,为此对斗地主机器人算法进行深度研究,算是略有成效,效果当然远比现在公司的斗地主机器人要好。

第一步:

如何判断一手牌的好坏,那就必须要对牌型进行计算分数这样你才能计算出来,这是一个基础定义。牌型的总数有如下这么多种

如果每种的牌型得分如下:const int CARD_TYPE_SCORE[CT_TYPE_COUNT] = { 0, 10, 20, 30, 40, 50, 60, 70, 80, 100, 110, 140, 150 };

牌型里面牌有大小之分,这样其实还可以针对牌值进行加分,这样牌的分数就比较细腻,牌值的分数就是加上他的牌的逻辑值就可以了

,还有一点要注意,牌的手数少的话,也应该适当加分,何为手数?就是以最快的出牌方法,手上的牌可以多少次出完,一般情况下手牌数少,牌应该要适当加分,加分策略如下:

第二步:

斗地主有叫分过程,这个也是有讲究,我的定义是这样

可分数低于370分时,不会进行第二次叫分,这个也是保守叫分法,如下

第三步:

出牌总共分为6个大的策略分支:

比较重要的出牌策略,是地主压牌和地主上家出牌,和地主上家压牌策略,

先说地主压牌策略:

上面是所有出牌的基本策略就是只剩下火箭带一手牌,或者炸弹带一手牌,或者是最后一手牌,那是必须要出的,这是6种出牌策略里面都要有的,下面是细分

地主下家出牌时,如果最快的速度出牌策略(CommonTypeTrunCard里面是不包含火箭压牌,火箭压牌必须是特别处理的)里面没有牌能压下家牌时,可下家手牌只有一张了,那么这时必须启动搜索牌面最大炸弹(手上的炸弹是否是最大炸弹),或者是火箭去拦截,

当上面的小策略失效时,那么必须启动拆牌策略(一般只有在单牌,双牌时才会拆牌):

上面的策略都失效了,那么后面还有一条非常体现智能效果的策略,就是前面的策略都失效了,那么要尝试一下最后一条策略

那就是其他两家有人只剩下两个牌时,一般这时地主要考虑拆牌了,

vecMinTypeCardResult这个结果里面包含的是最快出牌的牌型数据,CardTypeResult这个结果里面包含的是所有可组成的牌型数据,前者是提供常用策略来使用的,后者是借硬性策略使用的。常见策略失效了,那么就不能那么死板按照最快出牌策略那样按兵不动了。这个举个例子你就明白了,地主手上有2,AAA,99,88,66,5,有人出了一对KK,他手上剩下10张牌,这时按照最快出牌策略的话,是不应该拆AAA去打的,因为出牌者手上还有可能有其他牌型,可以守株待兔,可要是出牌者手上牌只剩下2张以后了,那么AAA就必须拆了。

地主上家出牌相当重要,优先出不是单牌的牌。(当然有人会说出自己能收得回来的牌不更加好吗?这个就是更加高一级的策略了,更加精细的做法了,这个可以留到以后来优化)

地主上家压牌,就要看是压队友的牌还是地主的牌,地主的牌一般是能压都会压,队友牌一般情况下小于K跟牌就行了,大于k不要跟了

当然大策略就是基本上是上面这些了,小策略就不再去详细说了,,详细说1万字都说不完。

这些是根据我自己的打牌经验的策略来写的,当然斗地主高手还会有更加好的策略可以加进去,这样效果会更加好。

上面这个FindCardKindMinNum搜索算法也相当关键,才是核心,如果要从20张牌里面所有的组合算出来,然后进行牌型分比较,进行筛选出牌最快,牌型的最好的牌,那么最复杂的情况有5000万种组合,现在普通的计算机是顶不住的,就算是1000万种组合的我在

这个(没有采用多线程的方案)处理器下跑出来也要40多秒,所以我对很多牌型进行了剪枝,这样一般最差的情况是30秒就算出来了,效果算是打了个折扣吧,但也不至于出牌效果很差,这个真正要运营的话,得用阿里云计算型的服务器来跑,这样效果会好很多。后来想到了采用多线程并行计算,这样会节省时间,1000多万的组合,我开4个线程算,基本上7,8秒就搞定了,完全达到了常规的出牌时间要求,效果非常棒.

现在我的剪枝过后的算法,一般情况下不会超时,出牌效果如下

如果你的斗地主按照这种牌,能以这样的方式出完,那么效果也是不错的了,

这个是我利用工作空闲时间,研究了20天的效果,过程非常辛苦。

如果有朋友有更加好的想法,欢迎一起留言交流,敬请踢教。Q:460000713

斗地主机器人智能算法深度研究相关推荐

  1. 超强跑得快机器人智能算法深度研究与设计

    上一篇斗地主机器人算法的设计是自主研究学习的,没有做细节上的优化,但最近公司刚好要上线跑得快,也需要我编写跑得快ai算法.于是我直接采用斗地主的算法框架来写这个ai,可以说主体设计没有变,但是呢细节上 ...

  2. 斗地主机器人AI算法和策略(个人思路总结)

    一.规则和权值定义 1.斗地主中存在很多种的牌型,比如:单张,对子,三带,顺子,连队,飞机,炸弹等 ,我的机器人主要根据权重去设计的,我给每一种牌型都制定了一个权重,比如3权重是多少,其他牌型的权重有 ...

  3. 智能算法的研究与实现

    目前计算机中的搜索算法有哪些? 深度优先,广度优先(源自于数据结构) 穷举法(列出所有可能),回溯法(深度优先思想加上返回式搜索)源自于算法设计与分析 爬山法,模拟退火,遗传算法(智能化算法)都是一些 ...

  4. 【券商报告】信息服务行业海通AI产业链深度研究(一):百度智能驾驶深度研究——附下载链接

    来源 | 海通证券 百度智能汽车业务发展至今已有七年, 2017 年 Apollo 面世,自此开启高速发展时期.根据盖世大 v 说援引汽车之心消 息,2017 年 3 月,百度整合自动驾驶事业部.智能 ...

  5. 论坛报名 | 从捉迷藏、星际争霸到新一代人工智能:多智能体深度强化学习的理论与实践...

    与6位图灵奖得主和100多位专家 共同探讨人工智能的下一个十年 长按图片或点击阅读原文,内行盛会,首次免费注册 2020年6月21-24日,第二届北京智源大会(官网:https://2020.baai ...

  6. 2018-3-13 目标改动---智能算法

    早上去了办公室,汇报.----------------------------结论就是自己跑偏了.------------------------------非结构化数据的研究 现在的自己要开始智能算 ...

  7. 基于优化智能算法(粒子群灰狼)的非侵入式负荷识别(NILM)建模(提供代码下载)

    基于优化智能算法(粒子群&灰狼)的非侵入式负荷识别(NILM)建模 本文主要从智能算法入手,介绍非侵入式识别的代码具体应用思路和场景,如有瑕疵,请海涵. 1.1 优化智能算法概述 智能算法的研 ...

  8. 邓力、何晓冬深度解读:多模态智能未来的研究热点

    2020-06-13 01:21:01 作者 | 邓力.何晓冬 编辑 | 丛末 基于深度学习的机器学习方法已经在语音.文本.图像等单一模态领域取得了巨大的成功,而同时涉及到多种输入模态的多模态机器学习 ...

  9. c语言五子棋人工智能算法,五子棋人工智能算法实现研究,优化五子棋智能算法的思路...

    五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一.现代五子棋日文称之为"连珠",英译为"Renju",英文称之为"Goban ...

最新文章

  1. 一文读懂如何通过设计模式学习创建对象?
  2. suse11.3下samba服务的配置
  3. 面向过程与面向对象编程的区别和优缺点
  4. Jmeter-获取响应结果中参数出现的次数
  5. 数据结构与算法一 - 二叉树基础
  6. 蓝桥杯 试题 基础练习 龟龟龟龟龟兔赛跑预测——18行代码AC
  7. Akamai “三驾马车”,如何应对疫情后新场景形态下的新考验?
  8. 解决“终端服务器超过了最大允许连接数”
  9. Redis-数据结构04-整数集合(intset)
  10. GAN诞生记:最火的AI模型,来自一群博士的酒后争吵
  11. 添加icon_(icon)冬季检查保养篇
  12. [转+]C语言复杂声明
  13. 施乐s2110进入维修模式,富士施乐s2110恢复出厂
  14. web网站制作的实例(大学生期末作业)集合
  15. flash倒计时制作
  16. 腾讯2021校园招聘全球启动
  17. 十大游戏开发引擎优缺点对比
  18. 亲身经历!4个月写完硕士毕业论文一稿过,我是如何做到的?
  19. 最大子段和之M子段和
  20. python电路仿真_蔡氏电路仿真实验

热门文章

  1. Python爬虫: 单网页 所有静态网页 动态网页爬取
  2. SAP 凭证跳号分析
  3. 公纵号发送提示信息(用户微服务--消息微服务)
  4. golang从channel读数据的各种情况
  5. Excel 2010 VBA 入门 066 读取其他工作簿的数据
  6. 你了解吗?一对一直播软件开发它们才能实现音视频传播
  7. 一文弄懂责任链设计模式
  8. struts中文乱码解决方法详解
  9. java项目——人机猜拳
  10. 如何将图片文字转换成可修改的文本