Skip to main content

纸牌游戏中强化学习的工具包

项目描述

RLCard:纸牌游戏中强化学习的工具包

标识

测试 PyPI 版本 覆盖状态 下载 下载 执照:麻省理工学院

中文文档

RLCard 是纸牌游戏中用于强化学习 (RL) 的工具包。它支持多种卡片环境,具有易于使用的界面,用于实现各种强化学习和搜索算法。RLCard 的目标是架起强化学习和不完美信息博弈的桥梁。RLCard 由莱斯和德克萨斯 A&M 大学的DATA 实验室以及社区贡献者开发。

社区:

  • Slack:在我们的#rlcard-project slack 频道中讨论。
  • QQ群:加入我们的QQ群讨论。密码:rlcardqqgroup
    • 第一组:665647450
    • 第二组:117349516

消息:

  • 我们更新了 Jupyter Notebook 中的教程,以帮助您了解 RLCard!请查看RLCard 教程
  • 现在所有的算法都可以支持 PettingZoo。请在此处查看。感谢程逸飞的投稿
  • 请关注斗,强大的斗地主AI和ICML 2021论文此处提供在线演示。该算法也集成在 RLCard 中。参见《斗地主培训DMC》
  • 我们的包在PettingZoo中使用。请检查一下!
  • 我们已经发布了 RLCard-Showdown,RLCard 的 GUI 演示。请在这里查看
  • Jupyter Notebook 教程可用!我们在 R 中添加了一些示例,以使用 reticulate 调用 RLCard 的 Python 接口。看这里
  • 感谢@Clarit7支持二十一点的不同玩家数量的贡献。我们呼吁为逐渐使游戏更具可配置性做出贡献。有关更多详细信息,请参见此处
  • 感谢@Clarit7对二十一点和限注德州扑克人机界面的贡献。
  • 现在 RLCard 支持环境本地播种和多处理。感谢@weepingwillowben提供的测试脚本。
  • NoLimit Holdem 的人机界面可用。NoLimit Holdem 的动作空间已经被抽象出来。感谢@AdrianP-的贡献。
  • 新游戏 Gin Rummy 和人类 GUI 可用。感谢@billh0420的贡献。
  • PyTorch 实现可用。感谢@mjudell的贡献。

引用这项工作

如果你觉得这个 repo 有用,你可以引用:

查,道臣,等。“RLCard:纸牌游戏中的强化学习平台。” IJCAI。2020 年。

@inproceedings{zha2020rlcard,
  title={RLCard: A Platform for Reinforcement Learning in Card Games},
  author={Zha, Daochen and Lai, Kwei-Herng and Huang, Songyi and Cao, Yuanpu and Reddy, Keerthana and Vargas, Juan and Nguyen, Alex and Wei, Ruzhe and Guo, Junyu and Hu, Xia},
  booktitle={IJCAI},
  year={2020}
}

安装

确保您已安装Python 3.6+piprlcard我们建议安装with的稳定版本pip

pip3 install rlcard

默认安装将仅包括卡环境。要使用训练算法的 PyTorch 实现,请运行

pip3 install rlcard[torch]

如果你在国内,上面的命令太慢,可以使用清华大学提供的镜像:

pip3 install rlcard -i https://pypi.tuna.tsinghua.edu.cn/simple

或者,您可以使用以下方式克隆最新版本(如果您在中国并且Github很慢,您可以使用Gitee中的镜像):

git clone https://github.com/datamllab/rlcard.git

或者只克隆一个分支以使其更快:

git clone -b master --single-branch --depth=1 https://github.com/datamllab/rlcard.git

然后安装

cd rlcard
pip3 install -e .
pip3 install -e .[torch]

我们还提供conda安装方法

conda install -c toubun rlcard

Conda 安装仅提供卡片环境,您需要根据需要手动安装 Pytorch。

例子

一个简短的例子如下。

import rlcard
from rlcard.agents import RandomAgent

env = rlcard.make('blackjack')
env.set_agents([RandomAgent(num_actions=env.num_actions)])

print(env.num_actions) # 2
print(env.num_players) # 1
print(env.state_shape) # [[2]]
print(env.action_shape) # [None]

trajectories, payoffs = env.run()

RLCard 可以灵活连接各种算法。请参阅以下示例:

演示

跑来examples/human/leduc_holdem_human.py玩玩预先训练的 Leduc Hold'em 模型。Leduc Hold'em 是德州扑克的简化版本。规则可以在这里找到。

>> Leduc Hold'em pre-trained model

>> Start a new game!
>> Agent 1 chooses raise

=============== Community Card ===============
┌─────────┐
│░░░░░░░░░│
│░░░░░░░░░│
│░░░░░░░░░│
│░░░░░░░░░│
│░░░░░░░░░│
│░░░░░░░░░│
│░░░░░░░░░│
└─────────┘
===============   Your Hand    ===============
┌─────────┐
│J        │
│         │
│         │
│    ♥    │
│         │
│         │
│        J│
└─────────┘
===============     Chips      ===============
Yours:   +
Agent 1: +++
=========== Actions You Can Choose ===========
0: call, 1: raise, 2: fold

>> You choose action (integer):

我们还提供了一个易于调试的 GUI。请在此处查看。一些演示:

斗地主重播 引导重放

可用环境

我们在几个方面为游戏提供了复杂性估计。InfoSet Number:信息集的数量;InfoSet Size:单个信息集中的平均状态数;Action Size:动作空间的大小。名称:应该传递rlcard.make给创建游戏环境的名称。我们还提供了文档和随机示例的链接。

游戏 信息集编号 信息集大小 行动规模 姓名 用法
二十一点 ( wiki , baike ) 10^3 10^1 10^0 二十一点 文档示例
Leduc Hold'em () 10^2 10^2 10^0 德州扑克 文档示例
限制德州扑克 ( wiki , baike ) 10^14 10^3 10^0 限注 文档示例
斗地主(维基百客 10^53 ~ 10^83 10^23 10^4 豆滴珠 文档示例
麻将 ( wiki , baike ) 10^121 10^48 10^2 麻将 文档示例
无限德州扑克(wikibaike 10^162 10^3 10^4 无限德州扑克 文档示例
UNO(维基拜科 10^163 10^10 10^1 一诺 文档示例
杜松子酒 ( wiki , baike ) 10^52 - - 杜松子酒 文档示例
桥(wikibaike - - 文档示例

支持的算法

算法 例子 参考
深蒙特卡洛 (DMC) 示例/run_dmc.py [纸]
深度 Q 学习 (DQN) 示例/run_rl.py [纸]
神经虚拟自我游戏 (NFSP) 示例/run_rl.py [纸]
反事实遗憾最小化 (CFR) 示例/run_cfr.py [纸]

预训练和基于规则的模型

我们提供了一个模型动物园作为基线。

模型 解释
leduc-holdem-cfr Leduc Hold'em 上的预训练 CFR(机会抽样)模型
leduc-holdem-rule-v1 Leduc Hold'em 的基于规则的模型,v1
leduc-holdem-rule-v2 Leduc Hold'em 的基于规则的模型,v2
uno-rule-v1 UNO 的基于规则的模型,v1
限制持有规则-v1 限注德州扑克的基于规则的模型,v1
斗地主规则-v1 斗地主的基于规则的模型,v1
杜松子酒新手规则 Gin Rummy 新手规则模型

API备忘单

如何营造环境

您可以使用以下界面来制作环境。您可以选择使用字典指定一些配置。

  • env = rlcard.make(env_id, config={}):创建一个环境。env_id是一串环境;config是一个字典,指定了一些环境配置,如下。
    • seed:默认None。设置环境本地随机种子以重现结果。
    • allow_step_back:默认FalseTrue如果允许step_back函数在树中向后遍历。
    • 游戏特定配置:这些字段以game_. 目前,我们只支持game_num_players二十一点,.

一旦环境建立,我们就可以访问游戏的一些信息。

  • env.num_actions:动作的数量。
  • env.num_players:玩家数量。
  • env.state_shape:观察的状态空间的形状。
  • env.action_shape:动作特征的形状(斗地主的动作可以编码为特征)

RLCard 中的状态是什么

State 是一个 Python 字典。它由观察state['obs']、法律行为state['legal_actions']、原始观察state['raw_obs']和原始法律行为组成state['raw_legal_actions']

基本接口

以下接口提供了基本用法。它易于使用,但它对代理有假设。代理必须遵循代理模板

  • env.set_agents(agents)agents是一个Agent对象列表。列表的长度应该等于游戏中玩家的数量。
  • env.run(is_training=False):运行一个完整的游戏并返回轨迹和收益。该函数可以在set_agents调用后使用。如果is_trainingTrue,它将使用step代理中的函数来玩游戏。如果is_trainingFalse,eval_step将被调用。

高级接口

对于高级用法,以下接口允许对游戏树进行灵活操作。这些接口不对代理做任何假设。

  • env.reset():初始化游戏。返回状态和第一个玩家 ID。
  • env.step(action, raw_action=False):在环境中迈出一步。action可以是原始动作或整数;如果动作是原始动作(字符串),raw_action应该是。True
  • env.step_back():仅当allow_step_backis时可用True。退一步。这可用于在博弈树上运行的算法,例如 CFR(机会抽样)。
  • env.is_over()True如果当前游戏结束则返回。否则,返回False
  • env.get_player_id() : 返回当前玩家的玩家 ID。
  • env.get_state(player_id):返回对应的状态player_id
  • env.get_payoffs():在游戏结束时,返回所有玩家的收益列表。
  • env.get_perfect_information():(目前只支持部分游戏)获取当前状态下的完美信息。

库结构

主要模块的用途如下:

更多文件

更多文档请参考文档进行一般介绍。API 文档可在我们的网站上找到

贡献

非常感谢您对这个项目的贡献!请为反馈/错误创建一个问题。如果您想贡献代码,请参阅贡献指南。如有任何问题,请通过daochen.zha@rice.edu联系道辰。

致谢

我们要感谢 JJ World Network Technology Co.,LTD 的慷慨支持和社区贡献者的所有贡献。

项目详情