【RL】MC首次访问和MC每次访问+TD实例(随风行走)

【RL】MC首次访问和MC每次访问+TD实例(随风行走),第1张

【RL】MC首次访问和MC每次访问+TD实例(随风行走)

文章目录
    • 首次访问蒙特卡洛策略评估
    • 每次访问蒙特卡洛策略评估
    • TD
    • 实例:
    • MC与TD区别:

首次访问蒙特卡洛策略评估

每次访问蒙特卡洛策略评估



TD


实例:
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File    :   RandomWork.py
@Time    :   2021/12/12 16:57:13
@Author  :   zhangzhe 
@Version :   1.0
@Contact :   841121040@qq.com
@License :   (C)Copyright 2017-2018, Liugroup-NLPR-CASIA
@Desc    :   None
'''

# here put the import lib

# Algorithm: Temporal Difference——Policy evaluation
# Project  :Random Walking
# Author   : XD_MaoHai
# Reference: Jabes
# Date     : 2021/11/18
 
 
# 导入库函数
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
# 设置进度条
from tqdm import tqdm
 
 
# 初始化A-E的状态价值为0.5,右侧终点值为1,左侧终点值为0
# VALUES = [左侧终点 A B C D E 右侧终点]
VALUES = np.zeros(7)
VALUES[1:6] = 0.5
VALUES[6] = 1
# 各个状态真实价值
VALUES_TRUE = np.zeros(7)
VALUES_TRUE[1:7] = np.arange(1, 7)/6.0
# 定义向左向右走的动作
ACTION_LEFT = 0
ACTION_RIGHT = 1
# 状态转移收益为0
REWARD = 0
 
 
# 时序差分算法
def temporal_difference(values, alpha=0.1, batch_updating=False):
    """
    values: 状态价值矩阵
    alpha : 增量步长
    batch_updating: 是否批量更新
    return: 返回本幕序列
    """
    # 起始状态为C
    state = 3
    # 定义轨迹列表
    trajectory = [state]
    # 定义收益列表
    rewards = [0]
    # 生成幕序列
    while True:
        old_state = state
        # 以0.5的概率随机选择向左向右走
        if np.random.binomial(1, 0.5) == ACTION_LEFT:
            state -= 1
        else:
            state += 1
        # 更新轨迹列表
        trajectory.append(state)
        # 若非批量更新
        if not batch_updating:
            # TD更新
            values[old_state] += alpha * (REWARD + values[state] - values[old_state])
        # 判断该幕是否终止
        if state == 6 or state == 0:
            break
        rewards.append(REWARD)
    return trajectory, rewards
 
 
 
# 主函数
if __name__ == '__main__':
    # 在以下幕次序画图
    episodes = [0, 1, 10, 100]
    # 初始化价值矩阵
    current_values = np.copy(VALUES)
    plt.figure(1)
    # 开始迭代
    for i in range(episodes[-1] + 1):
        if i in episodes:
            plt.plot(current_values, label=str(i) + 'episodes')
        temporal_difference(current_values)
    plt.plot(VALUES_TRUE, label='True values')
    plt.xlabel('State')
    plt.ylabel('Values')
    plt.legend()
    plt.show()


    #运行程序后可得到各幕数量下状态估计价值函数
    #其中紫线表示真实状态价值,可见随着训练幕数的增多,各状态价值渐渐趋近真实价值。 

MC与TD区别:


自举对初始值要求高,非常敏感

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5658499.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-16
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存