
- 首次访问蒙特卡洛策略评估
- 每次访问蒙特卡洛策略评估
- TD
- 实例:
- MC与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区别:
自举对初始值要求高,非常敏感
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)