强化学习-策略迭代代码实现

1. 前言

今天要重代码的角度给大家详细介绍下策略迭代的原理和实现方式。本节完整代码GitHub

我们开始介绍策略迭代前,先介绍一个蛇棋的游戏

它是我们后面学习的环境,介绍下它的规则:

  1. 玩家每人拥有一个棋子,出发点在图中标为“1”的格子处。
  2. 依次掷骰子,根据骰子的点数将自己的棋子向前行进相应的步数。假设笔者的棋子在“1”处,并且投掷出“4”,则笔者的棋子就可以到达“5”的位置。
  3. 棋盘上有一些梯子,它的两边与棋盘上的两个格子相连。如果棋子落在其中一个格子上,就会自动走到梯子对应的另一个格子中。以图5-5所示的棋盘为例,如果笔者的棋子在“1”处,并且投掷出“2”,那么棋子将到达“3”处,由于此处有梯子,棋子将直接前进到梯子的另一段——“20”的位置。
  4. 最终的目标是到达“100”处,如果在到达时投掷的数字加上当前的位置超过了100,那么棋子将首先到达100,剩余的步数将反向前进。

2. 蛇棋实现

我们实现蛇棋的逻辑,应该集成gym的env,然后分别重写env下面的几个重要的接口,这样使用起来就可以和gym里面封装的小游戏一样了。

class SnakeEnv(gym.Env):
    SIZE = 100

    def __init__(self, ladder_num, actions):
        """
        :param int ladder_num: 梯子的个数
        :param list actions: 可选择的行为
        """
        self.ladder_num = ladder_num
        self.actions = actions
        # 在整个范围内,随机生成梯子
        self.ladders = dict(np.random.randint(1, self.SIZE, size=(self.ladder_num, 2)))
        self.observation_space = Discrete(self.SIZE + 1)
        self.action_space = Discrete(len(actions))

        # 因为梯子是两个方向的,所以添加反方向的梯子
        new_ladders = {}
        for k, v in self.ladders.items():
            new_ladders[k] = v
            new_ladders[v] = k
        self.ladders = new_ladders
        self.pos = 1

    # 重置初始状态
    def reset(self):
        self.pos = 1
        return self.pos

    def step(self, action):
        """
        :param int action: 选择的行动
        :return: 下一个状态,奖励值,是否结束,其它内容
        """
        step = np.random.randint(1, self.actions[action] + 1)
        self.pos += step
        if self.pos == 100:
            return 100, 100, 1, {}
        elif self.pos > 100:
            self.pos = 200 - self.pos

        if self.pos in self.ladders:
            self.pos = self.ladders[self.pos]
        return self.pos, -1, 0, {}

    # 返回状态s的奖励值
    def reward(self, s):
        if s == 100:
            return 100
        else:
            return -1

然后再实现一个我们自己的智能体agent,里面包含的东西有状态的奖励、策略、行动状态转移矩阵、状态值函数、状态行动值函数等。

为了简单,我们用表格,或者矩阵的形式来表示各种变量。

class TableAgent(object):
    def __init__(self, env):
        # 状态个数
        self.s_len = env.observation_space.n
        # 行动个数
        self.a_len = env.action_space.n
        # 每个状态的奖励,shape=[1,self.s_len]
        self.r = [env.reward(s) for s in range(0, self.s_len)]
        # 每个状态的行动策略,默认为0,shape=[1,self.s_len]
        self.pi = np.array([0 for s in range(0, self.s_len)])
        # 行动状态转移矩阵,shape=[self.a_len, self.s_len, self.s_len]
        self.p = np.zeros([self.a_len, self.s_len, self.s_len], dtype=np.float)
        # 梯子
        ladder_move = np.vectorize(lambda x: env.ladders[x] if x in env.ladders else x)

        # 计算状态s和行动a确定,下一个状态s'的概率
        for i, action in enumerate(env.actions):
            prob = 1.0 / action
            for src in range(1, 100):
                step = np.arange(action)
                step += src
                step = np.piecewise(step, [step > 100, step <= 100],
                                    [lambda x: 200 - x, lambda x: x])
                step = ladder_move(step)
                for dst in step:
                    self.p[i, src, dst] += prob

        self.p[:, 100, 100] = 1
        # 状态值函数
        self.value_pi = np.zeros((self.s_len))
        # 状态行动值函数
        self.value_q = np.zeros((self.s_len, self.a_len))
        # 衰减因子
        self.gamma = 0.8

3. 策略迭代实现

前面我们已经介绍过了,策略迭代的过程可以分为2个步骤

  • 策略评估:策略评估时计算当前策略下,收敛的数据状态值函数。
v^T_{\pi}(s_t)=\sum_{a_t}\pi^{T-1}(a_t|s_t)\sum_{s_{t+1}}p(s_{t+1}|s_t,a_t)[r_{a_t}^{s_{t+1}} + v^{T-1}_{\pi}(s_{t+1})]\;\;\;\;\;\;(1)

实现如下:

# 策略评估
def policy_evaluation(self, agent, max_iter=-1):
    """
    :param obj agent: 智能体
    :param int max_iter: 最大迭代数
    """
    iteration = 0

    while True:
        iteration += 1
        new_value_pi = agent.value_pi.copy()
        # 对每个state计算v(s)
        for i in range(1, agent.s_len):
            ac = agent.pi[i]
            transition = agent.p[ac, i, :]
            value_sa = np.dot(transition, agent.r + agent.gamma * agent.value_pi)
            new_value_pi[i] = value_sa

        # 前后2次值函数的变化小于一个阈值,结束
        diff = np.sqrt(np.sum(np.power(agent.value_pi - new_value_pi, 2)))
        if diff < 1e-6:
            break
        else:
            agent.value_pi = new_value_pi
        if iteration == max_iter:
            break
  • 策略提升:在计算出了收敛的状态值函数,再计算状态-行动值函数,再找出最好的策略。
v_{\pi}(s_t)=\sum_{a_t}\pi(a_t|s_t)q_{\pi}(s_t,a_t)
q_{\pi}(s_t,a_t)=\sum_{s_{t+1}}p(s_{t+1}|s_t,a_t)[r_{a_t}^{s_{t+1}} + v_{\pi}(s_{t+1})]

实现如下:

# 策略提升
def policy_improvement(self, agent):
    """
    :param obj agent: 智能体
    """

    # 初始化新策略
    new_policy = np.zeros_like(agent.pi)
    for i in range(1, agent.s_len):
        for j in range(0, agent.a_len):
            # 计算每一个状态行动值函数
            agent.value_q[i, j] = np.dot(agent.p[j, i, :], agent.r + agent.gamma * agent.value_pi)

        # 选出每个状态下的最优行动
        max_act = np.argmax(agent.value_q[i, :])
        new_policy[i] = max_act
    if np.all(np.equal(new_policy, agent.pi)):
        return False
    else:
        agent.pi = new_policy
        return True

# 策略迭代
def policy_iteration(self, agent):
    """
    :param obj agent: 智能体
    """
    iteration = 0
    while True:
        iteration += 1
        self.policy_evaluation(agent)
        ret = self.policy_improvement(agent)
        if not ret:
            break
    print('Iter {} rounds converge'.format(iteration))

4. 总结

我们通过学习了策略迭代的实现,能够比较清楚的看出强化学习的过程,策略迭代也是后面算法优化的一个基础。

原文地址:https://www.cnblogs.com/huangyc/p/10386466.html

时间: 2024-10-08 07:37:11

强化学习-策略迭代代码实现的相关文章

&lt;强化学习&gt;基于采样迭代优化agent

前面介绍了三种采样求均值的算法 ——MC ——TD ——TD(lamda) 下面我们基于这几种方法来 迭代优化agent 传统的强化学习算法 || ν ν 已经知道完整MDP——使用价值函数V(s) 没有给出完整MDP——使用价值函数Q(s,a) 可见我们的目标就是确定下来最优策略和最优价值函数 | |——有完整MDP &&  用DP解决复杂度较低 |     ====>  使用贝尔曼方程和贝尔曼最优方程求解 |——没有完整MDP(ENV未知) or 知道MDP但是硬解MDP问题复杂

C++强化学习规划表

第一阶段 C语言加强以及C++语言详解(29天) 课程名称 课程内容 学习目标 C语言强化 · C语言基础复习(数据类型.变量.内存布局.指针基础) · C语言基础强化提高(C语言中的字符串.一维数组.二维数组) · C语言基础强化提高(一级指针,二级指针,三级指针实战,N级指针概念,指针数组和数组指针) · C语言基础强化提高(结构体.文件的使用) · 动态库的封装和设计 · 函数指针回调函数 · C语言面试题强化与提高 在基础班C语言知识点之上,掌握C语言深入技巧,为日后 做更大的项目打下坚

强化学习(八)价值函数的近似表示与Deep Q-Learning

在强化学习系列的前七篇里,我们主要讨论的都是规模比较小的强化学习问题求解算法.今天开始我们步入深度强化学习.这一篇关注于价值函数的近似表示和Deep Q-Learning算法. Deep Q-Learning这一篇对应Sutton书的第11章部分和UCL强化学习课程的第六讲. 1. 为何需要价值函数的近似表示 在之前讲到了强化学习求解方法,无论是动态规划DP,蒙特卡罗方法MC,还是时序差分TD,使用的状态都是离散的有限个状态集合$\mathbb{S}$.此时问题的规模比较小,比较容易求解.但是假

复现深度强化学习论文经验之谈

近期深度强化学习领域日新月异,其中最酷的一件事情莫过于 OpenAI 和 DeepMind 训练智能体接收人类的反馈而不是传统的奖励信号.本文作者认为复现论文是提升机器学习技能的最好方式之一,所以选择了 OpenAI 论文<Deep Reinforcement Learning from Human Preferences>作为 target,虽获得最后成功,却未实现初衷.如果你也打算复现强化学习论文,那么本文经验也许是你想要的.此外,本文虽对强化学习模型的训练提供了宝贵经验,同时也映射出另外

复现一篇深度强化学习论文之前请先看了这篇文章!

去年,OpenAI和DeepMind联手做了当时最酷的实验,不用经典的奖励信号来训练智能体,而是根据人类反馈进行强化学习的新方法.有篇博客专门讲了这个实验 Learning from Human Preferences,原始论文是< Deep Reinforcement Learning from Human Preferences>(根据人类偏好进行的深度增强学习). 链接:https://arxiv.org/pdf/1706.03741.pdf 过一些深度强化学习,你也可以训练木棍做后空翻

强化学习杂谈

目录 强化学习从入门到放弃 杂谈 MDP MP MRP MDP Planning by Dynamic Programming iterative policy evaluation policy iteration value iteration 蒙特卡洛 and TD Monte-Carlo Policy Evaluation TD:Temporal-Difference Learning MODEL FREE control GLIE MC Control Updating Action-

【基础知识十六】强化学习

一.任务与奖赏 我们执行某个操作a时,仅能得到一个当前的反馈r(可以假设服从某种分布),这个过程抽象出来就是“强化学习”. 强化学习任务通常用马尔可夫决策过程MDP来描述: 强化学习任务的四要素 E = <X, A, P, R> E:机器处于的环境 X:状态空间 A:动作空间 P:状态转移概率 R:奖赏函数 学习目的: “策略”:机器要做的是不断尝试学得一个“策略” π,根据状态x就能得到要执行的动作 a = π(x) 策略的评价: 长期累积奖赏,常用的有“T步累积奖赏” 强化学习与监督学习的

深度强化学习(Deep Reinforcement Learning)入门:RL base &amp; DQN-DDPG-A3C introduction

转自https://zhuanlan.zhihu.com/p/25239682 过去的一段时间在深度强化学习领域投入了不少精力,工作中也在应用DRL解决业务问题.子曰:温故而知新,在进一步深入研究和应用DRL前,阶段性的整理下相关知识点.本文集中在DRL的model-free方法的Value-based和Policy-base方法,详细介绍下RL的基本概念和Value-based DQN,Policy-based DDPG两个主要算法,对目前state-of-art的算法(A3C)详细介绍,其他

强化学习之智能出租车项目总结

项目介绍 这是优达学院机器学习课程的第4个实习项目,需要训练智能出租车学习交通规则,然后安全可靠地到达目的地.项目通过循序渐进的方式展开,从熟悉基本的领域知识开始,再以随机动作来直观感受智能车的状态,也是在这一步,让初学者有了心潮澎湃的感觉,"车终于动了!",是的,从0开始一路走来,以游戏闯关的方式,终于来到了4级,第一次体验了传说中的"智能"了,也许是"眼见为实"吧,小车在自己算法的控制之下行动,是一种很美好的感受.然后项目通过引导,让大家开始