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 = bool
Reward = float
StateValue = 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
文章插图
策略的蒙特卡洛值预测Monte Carlo Prediction 解决如下问题:当给定 Agent 策略时 , 反复试验来预估策略的 值 。 具体来说 , 产生一系列的episode数据之后 , 对于出现了的所有状态分别计算其Return , 再通过 average 某一状态 s 的 Return 来估计, 理论上 , 依据大数定理(Law of large numbers) , 在可以无限模拟的情况下 , Monte Carlo prediction 一定会收敛到真实的。 算法实现上有两个略微不同的版本 , 一个版本称为 First-visit , 另一个版本称为 Every-visit , 区别在于如何计算出现的状态 s 的 Return 值 。
推荐阅读
- 计算机专业大一下学期,该选择学习Java还是Python
- 假期弯道超车 国美学习“神器”助孩子变身“学霸”
- 想自学Python来开发爬虫,需要按照哪几个阶段制定学习计划
- 未来想进入AI领域,该学习Python还是Java大数据开发
- Google AI建立了一个能够分析烘焙食谱的机器学习模型
- 学习大数据是否需要学习JavaEE
- 学习“时代楷模”精神 信息科技创新助跑5G智慧港口
- 非计算机专业的本科生,想利用寒假学习Python,该怎么入手
- ?优学天下带着学习机冲刺上市,智能教育硬件有多烧钱?
- 数据分析与机器学习:侦测应用内机器人作弊关键