文章目录(Table of Contents)
简介
最近自己在对照着UCL Course on RL的课程学习reinforcement learning的部分, 在第四课, Model-Free Prediction的部分, 进行蒙特卡洛实验的时候, 会使用到blackjack的环境, 所以就在这里介绍一下, 熟悉一下该环境.
关于这一部分的代码, 可以参考github的链接: RL BlackJack环境说明
参考资料
- 这个是按课时整理的, 对应每一课的代码, David-Silver-Reinforcement-learning
- 这个比上面更加详细一些, Implementation of Reinforcement Learning Algorithms.
Blackjack环境熟悉
BlackJack又叫21点, 基本规则就是谁的牌的和越大谁就获胜, 但是不能超过21点.
环境准备
首先我们下载上面两个代码中的一个, 其中有一个文件夹是lib, 关于BlackJack的环境在这个里面. 所以第一步我们需要把这个文件夹包含在路径中.
- import sys
- if "/content/drive/My Drive/Machine Learning/lib/" not in sys.path:
- sys.path.append("/content/drive/My Drive/Machine Learning/lib/")
接着就是一些常规的库的导入.
- from envs.blackjack import BlackjackEnv
- import gym
- import numpy as np
- import matplotlib.pyplot as plt
- %matplotlib inline
BlackJack环境熟悉
接着, 我们熟悉一下这个环境中的observation, action和reward.
在这个环境中, observation由一个三元组构成.
- the players current sum (目前手上牌的总和)
- the dealer's one showing card (1-10 where 1 is ace) (对手牌面的牌)
- whether or not the player holds a usable ace (0 or 1) (自己手上是否有A, 这个牌可以当做1或是11)
在这个环境中, 有两种action:
- request additional cards (hit=1), 1表示要牌
- stop (stick=0), 0表示不要牌
在这个环境中, reward如下:
- 获得胜利, reward=1
- 平局, reward=0
- 输掉比赛(或是超过21点), reward=-1
BlackJack环境试验
我们简单看一下输出的结果, 首先我们创建环境
- environment = BlackjackEnv()
接着开始一局, 并不要牌, 查看最后的结果.
- observation = environment._reset()
- action = 0
- observation, reward, done, info = environment._step(action)
- print(observation, reward, done, info)
- environment.close()
- >> (12, 10, False) -1 True {}
上面的输出部分, observastion=(12, 10, False), 分别表示手上牌和是12, 对方牌面是10, 自己没有A.
-1是获得的奖励, True是游戏结束, 这是因为我们执行了action=0, 表示不要牌, 于是游戏结束.
注意上面不管是reset还是step前面都有一个短横, 否则会出现NotImplementedError:的报错.
为了更好地查看结果, 我们在这里定义一个用于显示最终结果的函数.
- def print_observation(observation, reward=0):
- score, dealer_score, usable_ace = observation
- print("Player Score: {} (Usable Ace: {}), Dealer Score: {}, Reward:{}".format(score, usable_ace, dealer_score, reward))
简单的Policy测试
接下来, 我们设置一个简单的规则, 使其不是随便出牌(这个规则也是很简单). 这个规则就是当我们牌的和大于等于20的时候, 就不要牌, 其他情况都要.
- def strategy(observation):
- score, dealer_score, usable_ace = observation
- if score >= 20:
- return 0
- else:
- return 1
我们使用上面的policy进行一些简单的对局. 每一局是一个episode.
- for i_episode in range(7):
- observation = environment._reset()
- reward = 0
- for t in range(100):
- print_observation(observation, reward)
- action = strategy(observation) # 采取的措施
- print("Taking action: {}".format( ["Stick(不要)", "Hit(要)"][action]))
- observation, reward, done, _ = environment._step(action) # 环境的反馈
- if done: # 判断是否结束
- print_observation(observation, reward)
- if reward == 1:
- result = 'Win'
- elif reward == 0:
- result = 'Draw'
- else:
- result = 'Loss'
- print("Game end. Reward: {}, Result:{}\n".format(float(reward), result))
- break
他的输出的结果可能如下所示:
- Player Score: 15 (Usable Ace: False), Dealer Score: 8, Reward:0
- Taking action: Hit(要)
- Player Score: 25 (Usable Ace: False), Dealer Score: 8, Reward:-1
- Game end. Reward: -1.0, Result:Loss
- Player Score: 20 (Usable Ace: False), Dealer Score: 10, Reward:0
- Taking action: Stick(不要)
- Player Score: 20 (Usable Ace: False), Dealer Score: 10, Reward:1
- Game end. Reward: 1.0, Result:Win
第一把是第一轮手上牌是8, 要牌, 结果大于21. 第二轮是手上牌是20, 不要牌, 获胜.
- 微信公众号
- 关注微信公众号
- QQ群
- 我们的QQ群号
评论