Sutton 强化学习,21 点游戏的策略蒙特卡洛值预测( 二 )


Sutton 强化学习,21 点游戏的策略蒙特卡洛值预测文章插图
21点游戏 OpenAI Gym环境OpenAI Gym 已经实现了 Sutton 版本的21点游戏环境 , 并按上述规则来进行 。 在安装完 OpenAI Gym 包之后 import BlackjackEnv 即可使用 。
from gym.envs.toy_text import BlackjackEnv根据这个游戏环境 , 我们先来定义一些类型 , 可以令代码更具可读性和抽象化 。 State 上文说过是由三个分量组成的Tuple 。 Action 为 bool 类型 表示是否继续要牌 。 Reward 为+1或者-1 , 玩家叫牌过程中为0 。 StateValue 为书中的, 实现上是一个 Dict 。 DeterministicPolicy 为一个函数 , 输入是某一状态 , 输出是唯一的决策动作 。
State = Tuple[int, int, bool]Action = boolReward = floatStateValue = http://kandian.youth.cn/index/Dict[State, float]DeterministicPolicy = Callable[[State], Action]以下代码是 BlackjackEnv 核心代码 , step 方法的输入为玩家的决策动作(叫牌还是结束) , 并输出 State, Reward, is_done 。 简单解释一下代码逻辑 , 当玩家继续加牌时 , 需要判断是否超21点 , 如果没有超过的话 , 返回下一状态 , 同时 reward 为0 , 等待下一 step 方法 。 若玩家停止叫牌 , 则按照庄家策略:小于17时叫牌 。 游戏终局时产生+1表示玩家获胜 , -1表示庄家获胜 。
class BlackjackEnv(gym.Env): def step(self, action): assert self.action_space.contains(action) if action: # hit: add a card to players hand and return self.player.append(draw_card(self.np_random)) if is_bust(self.player): done = True reward = -1. else: done = False reward = 0. else: # stick: play out the dealers hand, and score done = True while sum_hand(self.dealer) < 17: self.dealer.append(draw_card(self.np_random)) reward = cmp(score(self.player), score(self.dealer)) if self.natural and is_natural(self.player) and reward == 1.: reward = 1.5 return self._get_obs, reward, done, {} def _get_obs(self): return (sum_hand(self.player), self.dealer[0], usable_ace(self.player))下面示例如何调用 step 方法生成一个 episode 的数据集 。 数据集的类型为 List[Tuple[State, Action, Reward]] 。
def gen_episode_data(policy: DeterministicPolicy, env: BlackjackEnv) -> List[Tuple[State, Action, Reward]]: episode_history = state = env.reset done = False while not done: action = policy(state) next_state, reward, done, _ = env.step(action) episode_history.append((state, action, reward)) state = next_state return episode_history
Sutton 强化学习,21 点游戏的策略蒙特卡洛值预测文章插图
策略的蒙特卡洛值预测Monte Carlo Prediction 解决如下问题:当给定 Agent 策略时 , 反复试验来预估策略的 值 。 具体来说 , 产生一系列的episode数据之后 , 对于出现了的所有状态分别计算其Return , 再通过 average 某一状态 s 的 Return 来估计, 理论上 , 依据大数定理(Law of large numbers) , 在可以无限模拟的情况下 , Monte Carlo prediction 一定会收敛到真实的。 算法实现上有两个略微不同的版本 , 一个版本称为 First-visit , 另一个版本称为 Every-visit , 区别在于如何计算出现的状态 s 的 Return 值 。


推荐阅读