Reinforcement Learning(强化学习)-BlackJack环境介绍

  • A+
所属分类:深度学习
摘要这一篇是对于BlackJack环境的介绍, 介绍了里面observation, reward和action分别是什么, 以及一个可能会出现的报错NotImplementedError:和他的解决方法.

简介

最近自己在对照着UCL Course on RL的课程学习reinforcement learning的部分, 在第四课, Model-Free Prediction的部分, 进行蒙特卡洛实验的时候, 会使用到blackjack的环境, 所以就在这里介绍一下, 熟悉一下该环境.

关于这一部分的代码, 可以参考github的链接: RL BlackJack环境说明

参考资料

 

Blackjack环境熟悉

BlackJack又叫21点, 基本规则就是谁的牌的和越大谁就获胜, 但是不能超过21点.

环境准备

首先我们下载上面两个代码中的一个, 其中有一个文件夹是lib, 关于BlackJack的环境在这个里面. 所以第一步我们需要把这个文件夹包含在路径中.

  1. import sys
  2. if "/content/drive/My Drive/Machine Learning/lib/" not in sys.path:
  3.     sys.path.append("/content/drive/My Drive/Machine Learning/lib/")

接着就是一些常规的库的导入.

  1. from envs.blackjack import BlackjackEnv
  2. import gym
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. %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环境试验

我们简单看一下输出的结果, 首先我们创建环境

  1. environment = BlackjackEnv()

接着开始一局, 并不要牌, 查看最后的结果.

  1. observation = environment._reset()
  2. action = 0
  3. observation, reward, done, info = environment._step(action)
  4. print(observation, reward, done, info)
  5. environment.close()
  6. >> (12, 10, False) -1 True {}

上面的输出部分, observastion=(12, 10, False), 分别表示手上牌和是12, 对方牌面是10, 自己没有A.

-1是获得的奖励, True是游戏结束, 这是因为我们执行了action=0, 表示不要牌, 于是游戏结束.

注意上面不管是reset还是step前面都有一个短横, 否则会出现NotImplementedError:的报错.

为了更好地查看结果, 我们在这里定义一个用于显示最终结果的函数.

  1. def print_observation(observation, reward=0):
  2.     score, dealer_score, usable_ace = observation
  3.     print("Player Score: {} (Usable Ace: {}), Dealer Score: {}, Reward:{}".format(score, usable_ace, dealer_score, reward))

 

简单的Policy测试

接下来, 我们设置一个简单的规则, 使其不是随便出牌(这个规则也是很简单). 这个规则就是当我们牌的和大于等于20的时候, 就不要牌, 其他情况都要.

  1. def strategy(observation):
  2.     score, dealer_score, usable_ace = observation
  3.     if score >= 20:
  4.         return 0
  5.     else:
  6.         return 1

我们使用上面的policy进行一些简单的对局. 每一局是一个episode.

  1. for i_episode in range(7):
  2.     observation = environment._reset()
  3.     reward = 0
  4.     for t in range(100):
  5.         print_observation(observation, reward)
  6.         action = strategy(observation) # 采取的措施
  7.         print("Taking action: {}".format( ["Stick(不要)", "Hit(要)"][action]))
  8.         observation, reward, done, _ = environment._step(action) # 环境的反馈
  9.         if done: # 判断是否结束
  10.             print_observation(observation, reward)
  11.             if reward == 1:
  12.                 result = 'Win'
  13.             elif reward == 0:
  14.                 result = 'Draw'
  15.             else:
  16.                 result = 'Loss'
  17.             print("Game end. Reward: {}, Result:{}\n".format(float(reward), result))
  18.             break

他的输出的结果可能如下所示:

  1. Player Score: 15 (Usable Ace: False), Dealer Score: 8, Reward:0
  2. Taking action: Hit(要)
  3. Player Score: 25 (Usable Ace: False), Dealer Score: 8, Reward:-1
  4. Game end. Reward: -1.0, Result:Loss
  5. Player Score: 20 (Usable Ace: False), Dealer Score: 10, Reward:0
  6. Taking action: Stick(不要)
  7. Player Score: 20 (Usable Ace: False), Dealer Score: 10, Reward:1
  8. Game end. Reward: 1.0, Result:Win

第一把是第一轮手上牌是8, 要牌, 结果大于21. 第二轮是手上牌是20, 不要牌, 获胜.

 

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: