纸牌游戏中强化学习的工具包
项目描述
RLCard:纸牌游戏中强化学习的工具包
RLCard 是纸牌游戏中用于强化学习 (RL) 的工具包。它支持多种卡片环境,具有易于使用的界面,用于实现各种强化学习和搜索算法。RLCard 的目标是架起强化学习和不完美信息博弈的桥梁。RLCard 由莱斯和德克萨斯 A&M 大学的DATA 实验室以及社区贡献者开发。
- 官网:https ://www.rlcard.org
- Jupyter Notebook 教程:https ://github.com/datamllab/rlcard-tutorial
- 论文:https ://arxiv.org/abs/1910.04376
- 图形用户界面:RLCard-摊牌
- 斗地主Demo:Demo
- 资源:Awesome-Game-AI
- 相关项目:斗零项目
- 知乎:https ://zhuanlan.zhihu.com/p/526723604
社区:
- 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+和pip。rlcard我们建议安装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 可以灵活连接各种算法。请参阅以下示例:
- 玩随机代理
- 二十一点上的深度 Q 学习
- 在 Leduc Hold'em 上训练 CFR(机会抽样)
- 使用预训练的 Leduc 模型玩得开心
- 在斗地主上训练DMC
- 评估代理
- PettingZoo 上的培训代理
演示
跑来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 | 麻将 | 文档,示例 |
| 无限德州扑克(wiki,baike) | 10^162 | 10^3 | 10^4 | 无限德州扑克 | 文档,示例 |
| UNO(维基,拜科) | 10^163 | 10^10 | 10^1 | 一诺 | 文档,示例 |
| 杜松子酒 ( wiki , baike ) | 10^52 | - | - | 杜松子酒 | 文档,示例 |
| 桥(wiki,baike) | - | - | 桥 | 文档,示例 |
支持的算法
| 算法 | 例子 | 参考 |
|---|---|---|
| 深蒙特卡洛 (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:默认False。True如果允许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_training是True,它将使用step代理中的函数来玩游戏。如果is_training是False,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():(目前只支持部分游戏)获取当前状态下的完美信息。
库结构
主要模块的用途如下:
- /examples:使用 RLCard 的示例。
- /docs : RLCard 的文档。
- /tests : RLCard 的测试脚本。
- /rlcard/agents:强化学习算法和人工代理。
- /rlcard/envs:环境包装器(状态表示,动作编码等)
- /rlcard/games:各种游戏引擎。
- /rlcard/models:模型动物园,包括预训练模型和规则模型。
更多文件
更多文档请参考文档进行一般介绍。API 文档可在我们的网站上找到。
贡献
非常感谢您对这个项目的贡献!请为反馈/错误创建一个问题。如果您想贡献代码,请参阅贡献指南。如有任何问题,请通过daochen.zha@rice.edu联系查道辰。
致谢
我们要感谢 JJ World Network Technology Co.,LTD 的慷慨支持和社区贡献者的所有贡献。