第2关:有模型策略迭代参考

任务描述

本关任务:编写一个能实现有模型策略迭代的小程序。

相关知识

为了完成本关任务,你需要掌握:1.策略评估,2.策略改进,3.策略迭代。

给定动力系统的情况下的策略评估、策略改进和策略迭代。策略评估、策略改进和策略迭代分别指以下操作。

  • 策略评估(policy evaluation):对于给定的策略π,估计策略的价值,包括动作价值和状态价值;

  • 策略改进(policy improvement):对于给定的策略π,在已知其价值函数的情况下,找到一个更优的策略;

  • 策略迭代(policy iteration):综合利用策略评估和策略改进,找到最优策略。

策略评估

如何用迭代方法评估给定策略的价值函数。如果能求得状态价值函数,那么就能很容易地求出动作价值函数。由于状态价值函数只有∣S∣个自变量,而动作价值函数有∣S∣∗∣A∣个自变量,所以存储状态价值函数比较节约空间。 用迭代的方法评估给定策略的价值函数的算法。算法一开始初始化状态价值函数v0,并在后续的迭代中用Bellman期望方程的表达式更新一轮所有状态的状态价值函数。这样对所有状态价值函数的一次更新又称为一次扫描(sweep)。在第k次扫描时,用Vk−1​的值来更新Vk​的值,最终得到一系列的v0​,v1​,v2​,.... 。

有模型策略评估迭代算法

输入:动力系统 p ,策略 π 。 输出:状态价值函数vπ​的估计值。 参数:控制迭代次数的参数(如误差容忍度 ϑmax​ 或最大迭代次数kmax​)。

  • (初始化)对于s∈S,将v0​(s)初始化为任意值(比如0)。如果有终止状态,将终止态度初始化为0,即v0​(S终止​)←0。

  • (迭代)对于k←0,1,2,3,...,迭代执行以下步骤。

    • 对于s∈S,逐一更新vk+1​(s)←r(s,a)+γ∑s′​p(s′∣s,a)vk​(s′),其中qk​(s,a)←r(s,a)+γ∑s′​p(s′∣s,a)vk​(s′)
    • 如果满足迭代终止条件(如对s∈S均有∣vk+1​(s)−vk​(s)∣<ϑmax​,或达到最大迭代次数k=kmax​),则跳出循环。
策略改进

对于一个确定性策略 π,如果存在着s∈S,a∈A, 使得qπ​(s,a)>vπ​(s),那么我们可以构造一个新的确定策略π',它在状态 s 做动作 a ,而在除状态 s 以外的状态的动作都和策略 π 一样。可以验证,策略 π 和 π' 满足策略改进定理的条件。这样,我们就得到了一个比策略 π 更好的策略 π'。

有模型策略改进算法

输入:动力系统p,策略π及其状态价值函数vπ​。 输出:改进的策略π',或策略π已经达到最优的标志。

  • 对于每一个状态s∈S,执行以下步骤:

    • 为每一个动作a∈A, 求得动作价值函数qπ​(s,a)←r(s,a)+γ∑s′​p(s′∣s,a)vk​(s′);
    • 找到使得qπ​(s,a)最大的动作a,即π′(s)=argmaxa​q(s,a)。
  • 如果新策略π'和旧策略π相同,则说明旧策略已是最优;否则,输出改进的新策略π'。

 
  1. env = gym.make('FrozenLake-v0')
  2. env = env.unwrapped
  3. gamma = 1
  4. optimal = True
  5. for s in range(env.unwrapped.nS):
  6. q = v2q(env, v, s, gamma)
  7. a = np.argmax(q)
  8. if policy[s][a] != 1.:
  9. optimal = False
  10. policy[s] = 0
  11. policy[s][a] = 1.
  12. print(optimal)
策略迭代

策略迭代是一种综合利用策略评估和策略改进求解最优策略的迭代方法。

策略迭代从一个任意的确定性策略策略迭代从一个任意的确定性策略 π0​ 开始,交替进行策略评估和策略改进。

有模型策略迭代

输入:动力系统 p。 输出:最优策略。

  • (初始化)将策略 π0​ 初始化为一个任意的确定性策略。
  • (迭代)k←0,1,2,3,...,迭代执行以下步骤。
    • (策略评估)使用策略评估算法,计算策略πk​的状态价值函数vπk​​。
    • (策略更新)利用状态价值函数vπk​​改进确定性策略πk​,得到改进的确定性策略πk+1​。如果πk+1​=πk​(即对任意的s∈S均有πk+1​(s)=πk​(S)),则迭代完成,返回策略πk​为最终的最优策略。
 
  1. env = gym.make('FrozenLake-v0')
  2. env = env.unwrapped
  3. gamma = 1
  4. tolerant = 1e-6
  5. policy = np.ones((env.unwrapped.nS, env.unwrapped.nA))/env.unwrapped.nA
  6. while True:
  7. v = evaluate_policy(env, policy, gamma, tolerant)
  8. if improve_policy(env, v, policy):
  9. break
  10. print(policy, v)

evaluate_policy() 为策略评估函数。 improve_policy() 为策略更新函数。

参考资料:《强化学习:原理与Python实现》 肖智清 著

编程要求

根据提示,在右侧编辑器补充代码,实现案例:冰面滑行,冰面滑行问题(FrozenLake-v0)是扩展库 Gym 里内置的一个文本环境任务。该问题的背景是这样的:在一个大小为的湖面上,有些地方结冰了,有些地方没有结冰。这个环境的状态空间有 16 个不同的状态{s0​,s1​,s2​,...,s15​},表示当前处在哪一个位置;动作空间有 4 个不同的动作{a0​,a1​,a2​,a3​}。

import numpy as np
import gym
env = gym.make('FrozenLake-v0')
env = env.unwrapped


# 用策略执行一个回合
def play_policy(env, policy, render=False):
    total_reward = 0.
    observation = env.reset()
    while True:
        if render:
            env.render()
        action = np.random.choice(env.action_space.n, p=policy[observation])
        observation, reward, done, _=env.step(action)
        total_reward += reward
        if done:
            break
    return total_reward

# 求随机策略的期望奖励
random_policy = np.ones((env.unwrapped.nS, env.unwrapped.nA))/env.unwrapped.nA
episode_rewards = [play_policy(env, random_policy) for _ in range(100)]
print('随机策略 平均奖励:{}'.format(np.mean(episode_rewards)))

# 策略评估的实现
def v2q(env, v, s=None, gamma=1.):
    if s is not None:
        q = np.zeros(env.unwrapped.nA)
        for a in range(env.unwrapped.nA):
            for prob, next_state,reward,done in env.unwrapped.P[s][a]:
                q[a] += prob * (reward + gamma * v[next_state] * (1. - done))
    else:
        q = np.zeros((env.unwrapped.nS, env.unwrapped.nA))
        for s in range((env.unwrapped.nS)):
            q[s] = v2q(env, v, s, gamma)
    return q

def evaluate_policy(env, policy, gamma=1., tolerant=1e-6):
    v = np.zeros(env.unwrapped.nS)
    while True:
        delta = 0
        for s in range(env.unwrapped.nS):
            vs = sum(policy[s] * v2q(env, v, s, gamma))
            delta = max(delta, abs(v[s]-vs))
            v[s] = vs
        if delta < tolerant:
            break
    return v

# 对随机策略进行策略评估
print('状态价值函数:')
v_random = evaluate_policy(env, random_policy)
print(v_random.reshape(4, 4))

print('动作价值函数:')
q_random = v2q(env, v_random)
print(q_random)

# 策略改进函数的实现
###### Begin ######
def improve_policy(env, v, policy, gamma=1.):
    stable = True
    for s in range(env.unwrapped.nS):
        old_action = np.argmax(policy[s])
        action_values = v2q(env, v, s, gamma)
        best_action = np.argmax(action_values)
        if old_action != best_action:
            stable = False
        new_policy = np.eye(env.unwrapped.nA)[best_action]
        policy[s] = new_policy
    return stable


###### End ######


# 对随机策略进行策略改进
policy = random_policy.copy()
optimal = improve_policy(env, v_random, policy)
if optimal:
    print('无更新,最优策略为:')
else:
    print('有更新,更新后的策略为:')
print(policy)

# 策略迭代函数的实现
###### Begin ######
def iterate_policy(env, gamma=1., tolerant=1e-6):
    policy = np.ones((env.unwrapped.nS, env.unwrapped.nA)) / env.unwrapped.nA
    while True:
        v = evaluate_policy(env, policy, gamma, tolerant)
        stable = improve_policy(env, v, policy)
        if stable:
            break
    return policy, v    



###### End ######


# 利用策略迭代求解最优策略
policy_pi, v_pi = iterate_policy(env)
print('状态价值函数 =')
print(v_pi.reshape(4, 4))
print('最优策略 =')
print(np.argmax(policy_pi, axis=1).reshape(4, 4))

  • 28
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值