强化学习实战之蒙特卡洛算法

Monte Carlo

本次代码实战使用“21点”游戏作为环境。首先导入必要的包并熟悉环境。

import gym
import numpy as np
from collections import defaultdict
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
env = gym.make('Blackjack-v0')
observation = env.reset()
print(env.action_space, env.observation_space, sep='\n')
Discrete(2)
Tuple(Discrete(32), Discrete(11), Discrete(2))

本次实现的是基于 ϵ − g r e e d y \epsilon-greedy ϵgreedy 同轨策略的首次访问型MC算法,回忆其算法:

在这里插入图片描述

在这里插入图片描述

因此我们需要定义 $\epsilon-greedy \quad policy $ 。注意这里采用的是嵌套函数。

def make_epsilon_greedy_policy(Q_table, nA, epsilon):
    def generate_policy(observation):
        prob_A = np.ones(nA)*epsilon / nA
        optimal_a = np.argmax(Q_table[observation])
        prob_A[optimal_a] += (1.0 - epsilon)
        return prob_A
    return generate_policy

MC算法是逐幕进行的,所以我们要根据策略来生成一幕数据。

这里要注意:generate_policy是一个函数即make_epsilon_greedy_policy的返回值。generate_policy的返回值是 π \pi π 。这里循环了1000次只是为了确保能获得完整的一幕。

def generate_one_episode(env, generate_policy):
    trajectory = []
    state = env.reset()
    for i in range(1000):
        Pi_table = generate_policy(state)
        action = np.random.choice(np.arange(len(Pi_table)), p=Pi_table)
        next_state, reward, done, _ = env.step(action)
        trajectory.append((next_state, action, reward))
        if done:
            break
        state = next_state
    return trajectory

接下来是MC控制的主体部分,我们要循环足够多的次数使得价值函数收敛,每次循环都首先根据策略生成一幕样本序列,然后遍历每个“状态—价值”二元组,并用所有首次访问的回报的平均值作为估计.

这里要注意: ReturnCount是字典,每个“状态—价值”二元组是一个key,该二元组每一幕的回报是它的value,随着越来越多的迭代,根据大数定律,它的平均值会收敛到它的期望值。并且在下一轮迭代生成另外一幕样本序列的时候,generate_policy函数会根据Q_table更新!

def MC_control(env, iteration_times=500000, epsilon=0.1, discount_factor= 1.0):
    Return, Count, Q_table = defaultdict(float), defaultdict(float), defaultdict(lambda: np.zeros(env.action_space.n))
    policy = make_epsilon_greedy_policy(Q_table, env.action_space.n, epsilon)
    for i in range(iteration_times):
        trajectory = generate_one_episode(env, policy)
        s_a_pairs = set([(x[0], x[1]) for x in trajectory])
        for state, action in s_a_pairs:
            s_a = (state, action)
            first_visit_id = next(i for i, x in enumerate(trajectory) if x[0] == state and x[1] == action)
            G = sum([x[2]*(discount_factor**i) for i, x in enumerate(trajectory[first_visit_id:])])
            Return[s_a] += G
            Count[s_a] += 1.
            Q_table[state][action] = Return[s_a] / Count[s_a]
    return policy, Q_table

接下来是将价值函数可视化。

def plot_value_function(Q_table):
    x = np.arange(12, 21)
    y = np.arange(1, 10)
    X, Y = np.meshgrid(x, y)
    Z_noace = np.apply_along_axis(lambda x: Q_table[(x[0], x[1], False)], 2, np.dstack([X, Y]))
    Z_ace = np.apply_along_axis(lambda x: Q_table[(x[0], x[1], True)], 2, np.dstack([X, Y]))
    def plot_surface(X, Y, Z, title):
        fig = plt.figure(figsize=(20, 12))
        ax = fig.add_subplot(111, projection='3d')
        surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1,cmap=matplotlib.cm.coolwarm, vmin=-1.0, vmax=1.0)
        ax.set_xlabel('\nPlayer Sum', fontsize=25)
        ax.set_ylabel('\nDealer Showing', fontsize=25)
        ax.set_zlabel('\nValue', fontsize=25)
        ax.set_title('\n\n' + title, fontsize=25)
        ax.view_init(ax.elev, -120)
        fig.colorbar(surf)
        plt.savefig('../RL/%s.png'%title)
        plt.show()
    plot_surface(X, Y, Z_noace, '{}(not use Ace)'.format('optimal value function'))
    plot_surface(X, Y, Z_ace, '{}(use Ace)'.format('optimal Value function'))
optimal_policy, Q_table = MC_control(env)
V = defaultdict(float)
for state, action_value in Q_table.items():
    V[state] = np.max(action_value)
plot_value_function(V)

在这里插入图片描述

在这里插入图片描述

参考资料

《强化学习原理与Python实现》肖智清

github参考代码

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
强化学习中的蒙特卡洛方法是一种model-free的学习方法,它不需要对环境的动态进行建模。蒙特卡洛方法是根据与环境进行交互的样本序列来估计值函数或者策略函数。 简单来说,蒙特卡洛方法通过多次实验得到在不同状态下的回报样本,然后利用这些样本来估计值函数或者策略函数。蒙特卡洛方法的核心思想是根据样本的平均回报来近似真实的值函数。 蒙特卡洛方法有多种算法,其中最简单的是MC Basic算法。MC Basic算法的核心步骤包括: 1. 首先,通过与环境进行交互来生成样本序列。在每个样本序列中,采取一系列的动作,并观察环境的反馈,包括奖励和下一个状态。 2. 接下来,根据样本序列计算每个状态的回报。回报是从当前状态开始,经历一系列的动作和环境的反馈后所获得的累计奖励。 3. 然后,利用回报样本来估计值函数。对于每个状态,将其对应的回报样本求平均值作为值函数的估计。 4. 最后,根据值函数来改进策略。根据估计的值函数,选择在每个状态下具有最高值的动作作为最优策略。 这样,通过多次实验和样本的平均回报,MC Basic算法可以逐渐学习到值函数和策略函数,并不断优化策略来实现更好的决策。 除了MC Basic算法,还有其他蒙特卡洛方法,如MC Exploring Starts和ϵ-Greedy算法。这些算法在具体实现上有所差异,但都基于蒙特卡洛方法的核心思想。 综上所述,蒙特卡洛方法是一种model-free的强化学习算法,通过样本序列来估计值函数或策略函数,从而实现更好的决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值