【蘑菇书】Sarsa算法

目录

1、定义算法

2、定义训练

3、定义环境

4、设置参数

5、开始训练


1、定义算法

在阅读该教程之前,请先阅读Q learning教程。Sarsa算法跟Q learning算法基本模式相同,但是根本的区别在于,Sarsa是先做出动作然后拿这个做的动作去更新,而Q learning是假定下一步最大奖励对应的动作拿去更新,然后再使用\varepsilon-greedy策略,也就是说Sarsa是on-policy的,而Q learning是off-policy的。如下方代码所示,只有在更新的地方Sarsa与Q learning有着细微的区别。

import numpy as np
from collections import defaultdict
import torch
import math
class Sarsa(object):
    def __init__(self,
                 n_actions,cfg):
        self.n_actions = n_actions  
        self.lr = cfg.lr  
        self.gamma = cfg.gamma  
        self.sample_count = 0 
        self.epsilon_start = cfg.epsilon_start
        self.epsilon_end = cfg.epsilon_end
        self.epsilon_decay = cfg.epsilon_decay 
        self.Q  = defaultdict(lambda: np.zeros(n_actions)) # Q table
    def sample(self, state):
        self.sample_count += 1
        self.epsilon = self.epsilon_end + (self.epsilon_start - self.epsilon_end) * \
            math.exp(-1. * self.sample_count / self.epsilon_decay) # The probability to select a random action, is is log decayed
        best_action = np.argmax(self.Q[state])
        action_probs = np.ones(self.n_actions, dtype=float) * self.epsilon / self.n_actions
        action_probs[best_action] += (1.0 - self.epsilon)
        action = np.random.choice(np.arange(len(action_probs)), p=action_probs) 
        return action
    def predict(self,state):
        return np.argmax(self.Q[state])
    def update(self, state, action, reward, next_state, next_action,done):
        Q_predict = self.Q[state][action]
        if done:
            Q_target = reward  # 终止状态
        else:
            Q_target = reward + self.gamma * self.Q[next_state][next_action] # 与Q learning不同,Sarsa是拿下一步动作对应的Q值去更新
        self.Q[state][action] += self.lr * (Q_target - Q_predict) 
    def save(self,path):
        '''把 Q表格 的数据保存到文件中
        '''
        import dill
        torch.save(
            obj=self.Q,
            f=path+"sarsa_model.pkl",
            pickle_module=dill
        )
    def load(self, path):
        '''从文件中读取数据到 Q表格
        '''
        import dill
        self.Q =torch.load(f=path+'sarsa_model.pkl',pickle_module=dill)

2、定义训练

同样地,跟Q learning差别也不大

def train(cfg,env,agent):
    print('开始训练!')
    print(f'环境:{cfg.env_name}, 算法:{cfg.algo_name}, 设备:{cfg.device}')
    rewards = []  # 记录奖励
    for i_ep in range(cfg.train_eps):
        ep_reward = 0  # 记录每个回合的奖励
        state = env.reset()  # 重置环境,即开始新的回合
        action = agent.sample(state)
        while True:
            action = agent.sample(state)  # 根据算法采样一个动作
            next_state, reward, done, _ = env.step(action)  # 与环境进行一次动作交互
            next_action = agent.sample(next_state)
            agent.update(state, action, reward, next_state, next_action,done) # 算法更新
            state = next_state # 更新状态
            action = next_action
            ep_reward += reward
            if done:
                break
        rewards.append(ep_reward)
        print(f"回合:{i_ep+1}/{cfg.train_eps},奖励:{ep_reward:.1f},Epsilon:{agent.epsilon}")
    print('完成训练!')
    return {"rewards":rewards}
    
def test(cfg,env,agent):
    print('开始测试!')
    print(f'环境:{cfg.env_name}, 算法:{cfg.algo_name}, 设备:{cfg.device}')
    rewards = []  # 记录所有回合的奖励
    for i_ep in range(cfg.test_eps):
        ep_reward = 0  # 记录每个episode的reward
        state = env.reset()  # 重置环境, 重新开一局(即开始新的一个回合)
        while True:
            action = agent.predict(state)  # 根据算法选择一个动作
            next_state, reward, done, _ = env.step(action)  # 与环境进行一个交互
            state = next_state  # 更新状态
            ep_reward += reward
            if done:
                break
        rewards.append(ep_reward)
        print(f"回合数:{i_ep+1}/{cfg.test_eps}, 奖励:{ep_reward:.1f}")
    print('完成测试!')
    return {"rewards":rewards}

3、定义环境

为了具体看看Q learning和Sarsa的不同,笔者决定跟Q learning使用相同的环境

import gym
import turtle
import numpy as np

# turtle tutorial : https://docs.python.org/3.3/library/turtle.html

def GridWorld(gridmap=None, is_slippery=False):
    if gridmap is None:
        gridmap = ['SFFF', 'FHFH', 'FFFH', 'HFFG']
    env = gym.make("FrozenLake-v0", desc=gridmap, is_slippery=False)
    env = FrozenLakeWapper(env)
    return env


class FrozenLakeWapper(gym.Wrapper):
    def __init__(self, env):
        gym.Wrapper.__init__(self, env)
        self.max_y = env.desc.shape[0]
        self.max_x = env.desc.shape[1]
        self.t = None
        self.unit = 50

    def draw_box(self, x, y, fillcolor='', line_color='gray'):
        self.t.up()
        self.t.goto(x * self.unit, y * self.unit)
        self.t.color(line_color)
        self.t.fillcolor(fillcolor)
        self.t.setheading(90)
        self.t.down()
        self.t.begin_fill()
        for _ in range(4):
            self.t.forward(self.unit)
            self.t.right(90)
        self.t.end_fill()

    def move_player(self, x, y):
        self.t.up()
        self.t.setheading(90)
        self.t.fillcolor('red')
        self.t.goto((x + 0.5) * self.unit, (y + 0.5) * self.unit)

    def render(self):
        if self.t == None:
            self.t = turtle.Turtle()
            self.wn = turtle.Screen()
            self.wn.setup(self.unit * self.max_x + 100,
                          self.unit * self.max_y + 100)
            self.wn.setworldcoordinates(0, 0, self.unit * self.max_x,
                                        self.unit * self.max_y)
            self.t.shape('circle')
            self.t.width(2)
            self.t.speed(0)
            self.t.color('gray')
            for i in range(self.desc.shape[0]):
                for j in range(self.desc.shape[1]):
                    x = j
                    y = self.max_y - 1 - i
                    if self.desc[i][j] == b'S':  # Start
                        self.draw_box(x, y, 'white')
                    elif self.desc[i][j] == b'F':  # Frozen ice
                        self.draw_box(x, y, 'white')
                    elif self.desc[i][j] == b'G':  # Goal
                        self.draw_box(x, y, 'yellow')
                    elif self.desc[i][j] == b'H':  # Hole
                        self.draw_box(x, y, 'black')
                    else:
                        self.draw_box(x, y, 'white')
            self.t.shape('turtle')

        x_pos = self.s % self.max_x
        y_pos = self.max_y - 1 - int(self.s / self.max_x)
        self.move_player(x_pos, y_pos)


class CliffWalkingWapper(gym.Wrapper):
    def __init__(self, env):
        gym.Wrapper.__init__(self, env)
        self.t = None
        self.unit = 50
        self.max_x = 12
        self.max_y = 4

    def draw_x_line(self, y, x0, x1, color='gray'):
        assert x1 > x0
        self.t.color(color)
        self.t.setheading(0)
        self.t.up()
        self.t.goto(x0, y)
        self.t.down()
        self.t.forward(x1 - x0)

    def draw_y_line(self, x, y0, y1, color='gray'):
        assert y1 > y0
        self.t.color(color)
        self.t.setheading(90)
        self.t.up()
        self.t.goto(x, y0)
        self.t.down()
        self.t.forward(y1 - y0)

    def draw_box(self, x, y, fillcolor='', line_color='gray'):
        self.t.up()
        self.t.goto(x * self.unit, y * self.unit)
        self.t.color(line_color)
        self.t.fillcolor(fillcolor)
        self.t.setheading(90)
        self.t.down()
        self.t.begin_fill()
        for i in range(4):
            self.t.forward(self.unit)
            self.t.right(90)
        self.t.end_fill()

    def move_player(self, x, y):
        self.t.up()
        self.t.setheading(90)
        self.t.fillcolor('red')
        self.t.goto((x + 0.5) * self.unit, (y + 0.5) * self.unit)

    def render(self):
        if self.t == None:
            self.t = turtle.Turtle()
            self.wn = turtle.Screen()
            self.wn.setup(self.unit * self.max_x + 100,
                          self.unit * self.max_y + 100)
            self.wn.setworldcoordinates(0, 0, self.unit * self.max_x,
                                        self.unit * self.max_y)
            self.t.shape('circle')
            self.t.width(2)
            self.t.speed(0)
            self.t.color('gray')
            for _ in range(2):
                self.t.forward(self.max_x * self.unit)
                self.t.left(90)
                self.t.forward(self.max_y * self.unit)
                self.t.left(90)
            for i in range(1, self.max_y):
                self.draw_x_line(
                    y=i * self.unit, x0=0, x1=self.max_x * self.unit)
            for i in range(1, self.max_x):
                self.draw_y_line(
                    x=i * self.unit, y0=0, y1=self.max_y * self.unit)

            for i in range(1, self.max_x - 1):
                self.draw_box(i, 0, 'black')
            self.draw_box(self.max_x - 1, 0, 'yellow')
            self.t.shape('turtle')

        x_pos = self.s % self.max_x
        y_pos = self.max_y - 1 - int(self.s / self.max_x)
        self.move_player(x_pos, y_pos)
def env_agent_config(cfg,seed=1):
    '''创建环境和智能体
    Args:
        cfg ([type]): [description]
        seed (int, optional): 随机种子. Defaults to 1.
    Returns:
        env [type]: 环境
        agent : 智能体
    '''    
    env = gym.make(cfg.env_name)  
    env = CliffWalkingWapper(env)
    env.seed(seed) # 设置随机种子
    n_states = env.observation_space.n # 状态维度
    n_actions = env.action_space.n # 动作维度
    print(f"状态数:{n_states},动作数:{n_actions}")
    agent = Sarsa(n_actions,cfg)
    return env,agent

4、设置参数

同样的参数也是一样

import datetime
import argparse
import matplotlib.pyplot as plt
import seaborn as sns
def get_args():
    """ 
    """
    curr_time = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")  # 获取当前时间
    parser = argparse.ArgumentParser(description="hyperparameters")      
    parser.add_argument('--algo_name',default='Sarsa',type=str,help="name of algorithm")
    parser.add_argument('--env_name',default='CliffWalking-v0',type=str,help="name of environment")
    parser.add_argument('--train_eps',default=400,type=int,help="episodes of training") # 训练的回合数
    parser.add_argument('--test_eps',default=20,type=int,help="episodes of testing") # 测试的回合数
    parser.add_argument('--gamma',default=0.90,type=float,help="discounted factor") # 折扣因子
    parser.add_argument('--epsilon_start',default=0.95,type=float,help="initial value of epsilon") #  e-greedy策略中初始epsilon
    parser.add_argument('--epsilon_end',default=0.01,type=float,help="final value of epsilon") # e-greedy策略中的终止epsilon
    parser.add_argument('--epsilon_decay',default=300,type=int,help="decay rate of epsilon") # e-greedy策略中epsilon的衰减率
    parser.add_argument('--lr',default=0.1,type=float,help="learning rate")
    parser.add_argument('--device',default='cpu',type=str,help="cpu or cuda")          
    args = parser.parse_args([])                          
    return args

def smooth(data, weight=0.9):  
    '''用于平滑曲线,类似于Tensorboard中的smooth

    Args:
        data (List):输入数据
        weight (Float): 平滑权重,处于0-1之间,数值越高说明越平滑,一般取0.9

    Returns:
        smoothed (List): 平滑后的数据
    '''
    last = data[0]  # First value in the plot (first timestep)
    smoothed = list()
    for point in data:
        smoothed_val = last * weight + (1 - weight) * point  # 计算平滑值
        smoothed.append(smoothed_val)                    
        last = smoothed_val                                
    return smoothed

def plot_rewards(rewards,cfg, tag='train'):
    sns.set()
    plt.figure()  # 创建一个图形实例,方便同时多画几个图
    plt.title(f"{tag}ing curve on {cfg.device} of {cfg.algo_name} for {cfg.env_name}")
    plt.xlabel('epsiodes')
    plt.plot(rewards, label='rewards')
    plt.plot(smooth(rewards), label='smoothed')
    plt.legend()
    plt.show()

5、开始训练

训练结果会发现,Sarsa收敛速度更快,但收敛值会比Q-learning低

# 获取参数
cfg = get_args() 
# 训练
env, agent = env_agent_config(cfg)
res_dic = train(cfg, env, agent)
 
plot_rewards(res_dic['rewards'], cfg, tag="train")  
# 测试
res_dic = test(cfg, env, agent)
plot_rewards(res_dic['rewards'], cfg, tag="test")  # 画出结果
状态数:48,动作数:4
开始训练!
环境:CliffWalking-v0, 算法:Sarsa, 设备:cpu
回合:1/400,奖励:-1524.0,Epsilon:0.2029722781251147
回合:2/400,奖励:-1294.0,Epsilon:0.011808588201828951
回合:3/400,奖励:-192.0,Epsilon:0.01050118158853445
回合:4/400,奖励:-346.0,Epsilon:0.010049747911736582
回合:5/400,奖励:-252.0,Epsilon:0.010009240861841986
回合:6/400,奖励:-168.0,Epsilon:0.010003005072880926
回合:7/400,奖励:-393.0,Epsilon:0.01000042188120369
回合:8/400,奖励:-169.0,Epsilon:0.010000136281659052
回合:9/400,奖励:-97.0,Epsilon:0.010000071145264558
回合:10/400,奖励:-134.0,Epsilon:0.010000029022085234
回合:11/400,奖励:-124.0,Epsilon:0.010000012655059554
回合:12/400,奖励:-74.0,Epsilon:0.010000007701309915
回合:13/400,奖励:-135.0,Epsilon:0.010000003120699265
回合:14/400,奖励:-84.0,Epsilon:0.010000001776639691
回合:15/400,奖励:-101.0,Epsilon:0.010000000903081117
回合:16/400,奖励:-111.0,Epsilon:0.010000000429438717
回合:17/400,奖励:-114.0,Epsilon:0.010000000200165738
回合:18/400,奖励:-114.0,Epsilon:0.010000000093299278
回合:19/400,奖励:-82.0,Epsilon:0.010000000053829002
回合:20/400,奖励:-85.0,Epsilon:0.01000000003044167
回合:21/400,奖励:-108.0,Epsilon:0.010000000014768242
回合:22/400,奖励:-66.0,Epsilon:0.010000000009479634
回合:23/400,奖励:-74.0,Epsilon:0.010000000005768887
回合:24/400,奖励:-114.0,Epsilon:0.010000000002688936
回合:25/400,奖励:-98.0,Epsilon:0.010000000001394421
回合:26/400,奖励:-94.0,Epsilon:0.010000000000742658
回合:27/400,奖励:-58.0,Epsilon:0.010000000000502822
回合:28/400,奖励:-100.0,Epsilon:0.010000000000257298
回合:29/400,奖励:-208.0,Epsilon:0.010000000000123995
回合:30/400,奖励:-184.0,Epsilon:0.010000000000070121
回合:31/400,奖励:-62.0,Epsilon:0.010000000000046227
回合:32/400,奖励:-117.0,Epsilon:0.01000000000002112
回合:33/400,奖励:-47.0,Epsilon:0.010000000000015387
回合:34/400,奖励:-54.0,Epsilon:0.0100000000000107
回合:35/400,奖励:-120.0,Epsilon:0.010000000000004792
回合:36/400,奖励:-75.0,Epsilon:0.010000000000002897
回合:37/400,奖励:-62.0,Epsilon:0.01000000000000191
回合:38/400,奖励:-70.0,Epsilon:0.010000000000001194
回合:39/400,奖励:-67.0,Epsilon:0.010000000000000762
回合:40/400,奖励:-87.0,Epsilon:0.010000000000000425
回合:41/400,奖励:-92.0,Epsilon:0.01000000000000023
回合:42/400,奖励:-79.0,Epsilon:0.010000000000000136
回合:43/400,奖励:-49.0,Epsilon:0.010000000000000097
回合:44/400,奖励:-103.0,Epsilon:0.010000000000000049
回合:45/400,奖励:-40.0,Epsilon:0.010000000000000037
回合:46/400,奖励:-214.0,Epsilon:0.010000000000000018
回合:47/400,奖励:-83.0,Epsilon:0.01000000000000001
回合:48/400,奖励:-62.0,Epsilon:0.010000000000000007
回合:49/400,奖励:-37.0,Epsilon:0.010000000000000005
回合:50/400,奖励:-73.0,Epsilon:0.010000000000000004
回合:51/400,奖励:-66.0,Epsilon:0.010000000000000002
回合:52/400,奖励:-48.0,Epsilon:0.010000000000000002
回合:53/400,奖励:-96.0,Epsilon:0.01
回合:54/400,奖励:-189.0,Epsilon:0.01
回合:55/400,奖励:-42.0,Epsilon:0.01
回合:56/400,奖励:-46.0,Epsilon:0.01
回合:57/400,奖励:-85.0,Epsilon:0.01
回合:58/400,奖励:-52.0,Epsilon:0.01
回合:59/400,奖励:-86.0,Epsilon:0.01
回合:60/400,奖励:-41.0,Epsilon:0.01
回合:61/400,奖励:-51.0,Epsilon:0.01
回合:62/400,奖励:-59.0,Epsilon:0.01
回合:63/400,奖励:-145.0,Epsilon:0.01
回合:64/400,奖励:-76.0,Epsilon:0.01
回合:65/400,奖励:-43.0,Epsilon:0.01
回合:66/400,奖励:-49.0,Epsilon:0.01
回合:67/400,奖励:-36.0,Epsilon:0.01
回合:68/400,奖励:-41.0,Epsilon:0.01
回合:69/400,奖励:-69.0,Epsilon:0.01
回合:70/400,奖励:-38.0,Epsilon:0.01
回合:71/400,奖励:-63.0,Epsilon:0.01
回合:72/400,奖励:-46.0,Epsilon:0.01
回合:73/400,奖励:-30.0,Epsilon:0.01
回合:74/400,奖励:-45.0,Epsilon:0.01
回合:75/400,奖励:-38.0,Epsilon:0.01
回合:76/400,奖励:-88.0,Epsilon:0.01
回合:77/400,奖励:-19.0,Epsilon:0.01
回合:78/400,奖励:-40.0,Epsilon:0.01
回合:79/400,奖励:-62.0,Epsilon:0.01
回合:80/400,奖励:-25.0,Epsilon:0.01
回合:81/400,奖励:-54.0,Epsilon:0.01
回合:82/400,奖励:-41.0,Epsilon:0.01
回合:83/400,奖励:-57.0,Epsilon:0.01
回合:84/400,奖励:-52.0,Epsilon:0.01
回合:85/400,奖励:-42.0,Epsilon:0.01
回合:86/400,奖励:-51.0,Epsilon:0.01
回合:87/400,奖励:-53.0,Epsilon:0.01
回合:88/400,奖励:-42.0,Epsilon:0.01
回合:89/400,奖励:-53.0,Epsilon:0.01
回合:90/400,奖励:-31.0,Epsilon:0.01
回合:91/400,奖励:-75.0,Epsilon:0.01
回合:92/400,奖励:-148.0,Epsilon:0.01
回合:93/400,奖励:-41.0,Epsilon:0.01
回合:94/400,奖励:-47.0,Epsilon:0.01
回合:95/400,奖励:-184.0,Epsilon:0.01
回合:96/400,奖励:-34.0,Epsilon:0.01
回合:97/400,奖励:-45.0,Epsilon:0.01
回合:98/400,奖励:-52.0,Epsilon:0.01
回合:99/400,奖励:-44.0,Epsilon:0.01
回合:100/400,奖励:-49.0,Epsilon:0.01
回合:101/400,奖励:-30.0,Epsilon:0.01
回合:102/400,奖励:-49.0,Epsilon:0.01
回合:103/400,奖励:-23.0,Epsilon:0.01
回合:104/400,奖励:-37.0,Epsilon:0.01
回合:105/400,奖励:-37.0,Epsilon:0.01
回合:106/400,奖励:-44.0,Epsilon:0.01
回合:107/400,奖励:-40.0,Epsilon:0.01
回合:108/400,奖励:-28.0,Epsilon:0.01
回合:109/400,奖励:-50.0,Epsilon:0.01
回合:110/400,奖励:-46.0,Epsilon:0.01
回合:111/400,奖励:-28.0,Epsilon:0.01
回合:112/400,奖励:-35.0,Epsilon:0.01
回合:113/400,奖励:-35.0,Epsilon:0.01
回合:114/400,奖励:-45.0,Epsilon:0.01
回合:115/400,奖励:-38.0,Epsilon:0.01
回合:116/400,奖励:-39.0,Epsilon:0.01
回合:117/400,奖励:-27.0,Epsilon:0.01
回合:118/400,奖励:-49.0,Epsilon:0.01
回合:119/400,奖励:-27.0,Epsilon:0.01
回合:120/400,奖励:-25.0,Epsilon:0.01
回合:121/400,奖励:-50.0,Epsilon:0.01
回合:122/400,奖励:-41.0,Epsilon:0.01
回合:123/400,奖励:-22.0,Epsilon:0.01
回合:124/400,奖励:-38.0,Epsilon:0.01
回合:125/400,奖励:-125.0,Epsilon:0.01
回合:126/400,奖励:-25.0,Epsilon:0.01
回合:127/400,奖励:-40.0,Epsilon:0.01
回合:128/400,奖励:-33.0,Epsilon:0.01
回合:129/400,奖励:-56.0,Epsilon:0.01
回合:130/400,奖励:-32.0,Epsilon:0.01
回合:131/400,奖励:-21.0,Epsilon:0.01
回合:132/400,奖励:-33.0,Epsilon:0.01
回合:133/400,奖励:-23.0,Epsilon:0.01
回合:134/400,奖励:-33.0,Epsilon:0.01
回合:135/400,奖励:-34.0,Epsilon:0.01
回合:136/400,奖励:-33.0,Epsilon:0.01
回合:137/400,奖励:-21.0,Epsilon:0.01
回合:138/400,奖励:-40.0,Epsilon:0.01
回合:139/400,奖励:-23.0,Epsilon:0.01
回合:140/400,奖励:-31.0,Epsilon:0.01
回合:141/400,奖励:-31.0,Epsilon:0.01
回合:142/400,奖励:-26.0,Epsilon:0.01
回合:143/400,奖励:-26.0,Epsilon:0.01
回合:144/400,奖励:-32.0,Epsilon:0.01
回合:145/400,奖励:-27.0,Epsilon:0.01
回合:146/400,奖励:-33.0,Epsilon:0.01
回合:147/400,奖励:-35.0,Epsilon:0.01
回合:148/400,奖励:-21.0,Epsilon:0.01
回合:149/400,奖励:-23.0,Epsilon:0.01
回合:150/400,奖励:-33.0,Epsilon:0.01
回合:151/400,奖励:-25.0,Epsilon:0.01
回合:152/400,奖励:-41.0,Epsilon:0.01
回合:153/400,奖励:-31.0,Epsilon:0.01
回合:154/400,奖励:-28.0,Epsilon:0.01
回合:155/400,奖励:-133.0,Epsilon:0.01
回合:156/400,奖励:-22.0,Epsilon:0.01
回合:157/400,奖励:-21.0,Epsilon:0.01
回合:158/400,奖励:-33.0,Epsilon:0.01
回合:159/400,奖励:-33.0,Epsilon:0.01
回合:160/400,奖励:-24.0,Epsilon:0.01
回合:161/400,奖励:-34.0,Epsilon:0.01
回合:162/400,奖励:-20.0,Epsilon:0.01
回合:163/400,奖励:-21.0,Epsilon:0.01
回合:164/400,奖励:-126.0,Epsilon:0.01
回合:165/400,奖励:-36.0,Epsilon:0.01
回合:166/400,奖励:-18.0,Epsilon:0.01
回合:167/400,奖励:-35.0,Epsilon:0.01
回合:168/400,奖励:-26.0,Epsilon:0.01
回合:169/400,奖励:-24.0,Epsilon:0.01
回合:170/400,奖励:-33.0,Epsilon:0.01
回合:171/400,奖励:-17.0,Epsilon:0.01
回合:172/400,奖励:-23.0,Epsilon:0.01
回合:173/400,奖励:-26.0,Epsilon:0.01
回合:174/400,奖励:-23.0,Epsilon:0.01
回合:175/400,奖励:-21.0,Epsilon:0.01
回合:176/400,奖励:-35.0,Epsilon:0.01
回合:177/400,奖励:-26.0,Epsilon:0.01
回合:178/400,奖励:-17.0,Epsilon:0.01
回合:179/400,奖励:-20.0,Epsilon:0.01
回合:180/400,奖励:-28.0,Epsilon:0.01
回合:181/400,奖励:-34.0,Epsilon:0.01
回合:182/400,奖励:-27.0,Epsilon:0.01
回合:183/400,奖励:-22.0,Epsilon:0.01
回合:184/400,奖励:-24.0,Epsilon:0.01
回合:185/400,奖励:-26.0,Epsilon:0.01
回合:186/400,奖励:-20.0,Epsilon:0.01
回合:187/400,奖励:-30.0,Epsilon:0.01
回合:188/400,奖励:-28.0,Epsilon:0.01
回合:189/400,奖励:-15.0,Epsilon:0.01
回合:190/400,奖励:-30.0,Epsilon:0.01
回合:191/400,奖励:-29.0,Epsilon:0.01
回合:192/400,奖励:-22.0,Epsilon:0.01
回合:193/400,奖励:-25.0,Epsilon:0.01
回合:194/400,奖励:-21.0,Epsilon:0.01
回合:195/400,奖励:-19.0,Epsilon:0.01
回合:196/400,奖励:-23.0,Epsilon:0.01
回合:197/400,奖励:-21.0,Epsilon:0.01
回合:198/400,奖励:-32.0,Epsilon:0.01
回合:199/400,奖励:-30.0,Epsilon:0.01
回合:200/400,奖励:-22.0,Epsilon:0.01
回合:201/400,奖励:-20.0,Epsilon:0.01
回合:202/400,奖励:-27.0,Epsilon:0.01
回合:203/400,奖励:-21.0,Epsilon:0.01
回合:204/400,奖励:-26.0,Epsilon:0.01
回合:205/400,奖励:-19.0,Epsilon:0.01
回合:206/400,奖励:-17.0,Epsilon:0.01
回合:207/400,奖励:-31.0,Epsilon:0.01
回合:208/400,奖励:-18.0,Epsilon:0.01
回合:209/400,奖励:-24.0,Epsilon:0.01
回合:210/400,奖励:-17.0,Epsilon:0.01
回合:211/400,奖励:-26.0,Epsilon:0.01
回合:212/400,奖励:-27.0,Epsilon:0.01
回合:213/400,奖励:-33.0,Epsilon:0.01
回合:214/400,奖励:-16.0,Epsilon:0.01
回合:215/400,奖励:-32.0,Epsilon:0.01
回合:216/400,奖励:-19.0,Epsilon:0.01
回合:217/400,奖励:-20.0,Epsilon:0.01
回合:218/400,奖励:-15.0,Epsilon:0.01
回合:219/400,奖励:-119.0,Epsilon:0.01
回合:220/400,奖励:-26.0,Epsilon:0.01
回合:221/400,奖励:-26.0,Epsilon:0.01
回合:222/400,奖励:-22.0,Epsilon:0.01
回合:223/400,奖励:-22.0,Epsilon:0.01
回合:224/400,奖励:-15.0,Epsilon:0.01
回合:225/400,奖励:-24.0,Epsilon:0.01
回合:226/400,奖励:-15.0,Epsilon:0.01
回合:227/400,奖励:-31.0,Epsilon:0.01
回合:228/400,奖励:-24.0,Epsilon:0.01
回合:229/400,奖励:-20.0,Epsilon:0.01
回合:230/400,奖励:-20.0,Epsilon:0.01
回合:231/400,奖励:-22.0,Epsilon:0.01
回合:232/400,奖励:-15.0,Epsilon:0.01
回合:233/400,奖励:-19.0,Epsilon:0.01
回合:234/400,奖励:-21.0,Epsilon:0.01
回合:235/400,奖励:-27.0,Epsilon:0.01
回合:236/400,奖励:-15.0,Epsilon:0.01
回合:237/400,奖励:-25.0,Epsilon:0.01
回合:238/400,奖励:-22.0,Epsilon:0.01
回合:239/400,奖励:-16.0,Epsilon:0.01
回合:240/400,奖励:-18.0,Epsilon:0.01
回合:241/400,奖励:-13.0,Epsilon:0.01
回合:242/400,奖励:-13.0,Epsilon:0.01
回合:243/400,奖励:-13.0,Epsilon:0.01
回合:244/400,奖励:-23.0,Epsilon:0.01
回合:245/400,奖励:-29.0,Epsilon:0.01
回合:246/400,奖励:-26.0,Epsilon:0.01
回合:247/400,奖励:-19.0,Epsilon:0.01
回合:248/400,奖励:-21.0,Epsilon:0.01
回合:249/400,奖励:-17.0,Epsilon:0.01
回合:250/400,奖励:-17.0,Epsilon:0.01
回合:251/400,奖励:-15.0,Epsilon:0.01
回合:252/400,奖励:-20.0,Epsilon:0.01
回合:253/400,奖励:-23.0,Epsilon:0.01
回合:254/400,奖励:-19.0,Epsilon:0.01
回合:255/400,奖励:-21.0,Epsilon:0.01
回合:256/400,奖励:-19.0,Epsilon:0.01
回合:257/400,奖励:-17.0,Epsilon:0.01
回合:258/400,奖励:-17.0,Epsilon:0.01
回合:259/400,奖励:-15.0,Epsilon:0.01
回合:260/400,奖励:-21.0,Epsilon:0.01
回合:261/400,奖励:-17.0,Epsilon:0.01
回合:262/400,奖励:-19.0,Epsilon:0.01
回合:263/400,奖励:-19.0,Epsilon:0.01
回合:264/400,奖励:-15.0,Epsilon:0.01
回合:265/400,奖励:-19.0,Epsilon:0.01
回合:266/400,奖励:-17.0,Epsilon:0.01
回合:267/400,奖励:-15.0,Epsilon:0.01
回合:268/400,奖励:-19.0,Epsilon:0.01
回合:269/400,奖励:-27.0,Epsilon:0.01
回合:270/400,奖励:-15.0,Epsilon:0.01
回合:271/400,奖励:-17.0,Epsilon:0.01
回合:272/400,奖励:-17.0,Epsilon:0.01
回合:273/400,奖励:-25.0,Epsilon:0.01
回合:274/400,奖励:-19.0,Epsilon:0.01
回合:275/400,奖励:-22.0,Epsilon:0.01
回合:276/400,奖励:-23.0,Epsilon:0.01
回合:277/400,奖励:-18.0,Epsilon:0.01
回合:278/400,奖励:-23.0,Epsilon:0.01
回合:279/400,奖励:-21.0,Epsilon:0.01
回合:280/400,奖励:-21.0,Epsilon:0.01
回合:281/400,奖励:-21.0,Epsilon:0.01
回合:282/400,奖励:-19.0,Epsilon:0.01
回合:283/400,奖励:-18.0,Epsilon:0.01
回合:284/400,奖励:-15.0,Epsilon:0.01
回合:285/400,奖励:-19.0,Epsilon:0.01
回合:286/400,奖励:-19.0,Epsilon:0.01
回合:287/400,奖励:-21.0,Epsilon:0.01
回合:288/400,奖励:-15.0,Epsilon:0.01
回合:289/400,奖励:-32.0,Epsilon:0.01
回合:290/400,奖励:-18.0,Epsilon:0.01
回合:291/400,奖励:-17.0,Epsilon:0.01
回合:292/400,奖励:-15.0,Epsilon:0.01
回合:293/400,奖励:-24.0,Epsilon:0.01
回合:294/400,奖励:-22.0,Epsilon:0.01
回合:295/400,奖励:-31.0,Epsilon:0.01
回合:296/400,奖励:-17.0,Epsilon:0.01
回合:297/400,奖励:-19.0,Epsilon:0.01
回合:298/400,奖励:-19.0,Epsilon:0.01
回合:299/400,奖励:-20.0,Epsilon:0.01
回合:300/400,奖励:-21.0,Epsilon:0.01
回合:301/400,奖励:-26.0,Epsilon:0.01
回合:302/400,奖励:-20.0,Epsilon:0.01
回合:303/400,奖励:-16.0,Epsilon:0.01
回合:304/400,奖励:-20.0,Epsilon:0.01
回合:305/400,奖励:-21.0,Epsilon:0.01
回合:306/400,奖励:-16.0,Epsilon:0.01
回合:307/400,奖励:-19.0,Epsilon:0.01
回合:308/400,奖励:-24.0,Epsilon:0.01
回合:309/400,奖励:-20.0,Epsilon:0.01
回合:310/400,奖励:-17.0,Epsilon:0.01
回合:311/400,奖励:-16.0,Epsilon:0.01
回合:312/400,奖励:-25.0,Epsilon:0.01
回合:313/400,奖励:-16.0,Epsilon:0.01
回合:314/400,奖励:-19.0,Epsilon:0.01
回合:315/400,奖励:-19.0,Epsilon:0.01
回合:316/400,奖励:-27.0,Epsilon:0.01
回合:317/400,奖励:-15.0,Epsilon:0.01
回合:318/400,奖励:-15.0,Epsilon:0.01
回合:319/400,奖励:-15.0,Epsilon:0.01
回合:320/400,奖励:-19.0,Epsilon:0.01
回合:321/400,奖励:-23.0,Epsilon:0.01
回合:322/400,奖励:-24.0,Epsilon:0.01
回合:323/400,奖励:-15.0,Epsilon:0.01
回合:324/400,奖励:-20.0,Epsilon:0.01
回合:325/400,奖励:-18.0,Epsilon:0.01
回合:326/400,奖励:-19.0,Epsilon:0.01
回合:327/400,奖励:-19.0,Epsilon:0.01
回合:328/400,奖励:-26.0,Epsilon:0.01
回合:329/400,奖励:-16.0,Epsilon:0.01
回合:330/400,奖励:-18.0,Epsilon:0.01
回合:331/400,奖励:-15.0,Epsilon:0.01
回合:332/400,奖励:-15.0,Epsilon:0.01
回合:333/400,奖励:-17.0,Epsilon:0.01
回合:334/400,奖励:-17.0,Epsilon:0.01
回合:335/400,奖励:-16.0,Epsilon:0.01
回合:336/400,奖励:-24.0,Epsilon:0.01
回合:337/400,奖励:-15.0,Epsilon:0.01
回合:338/400,奖励:-18.0,Epsilon:0.01
回合:339/400,奖励:-16.0,Epsilon:0.01
回合:340/400,奖励:-15.0,Epsilon:0.01
回合:341/400,奖励:-18.0,Epsilon:0.01
回合:342/400,奖励:-15.0,Epsilon:0.01
回合:343/400,奖励:-20.0,Epsilon:0.01
回合:344/400,奖励:-18.0,Epsilon:0.01
回合:345/400,奖励:-17.0,Epsilon:0.01
回合:346/400,奖励:-19.0,Epsilon:0.01
回合:347/400,奖励:-15.0,Epsilon:0.01
回合:348/400,奖励:-15.0,Epsilon:0.01
回合:349/400,奖励:-15.0,Epsilon:0.01
回合:350/400,奖励:-18.0,Epsilon:0.01
回合:351/400,奖励:-16.0,Epsilon:0.01
回合:352/400,奖励:-16.0,Epsilon:0.01
回合:353/400,奖励:-15.0,Epsilon:0.01
回合:354/400,奖励:-20.0,Epsilon:0.01
回合:355/400,奖励:-15.0,Epsilon:0.01
回合:356/400,奖励:-17.0,Epsilon:0.01
回合:357/400,奖励:-15.0,Epsilon:0.01
回合:358/400,奖励:-17.0,Epsilon:0.01
回合:359/400,奖励:-15.0,Epsilon:0.01
回合:360/400,奖励:-16.0,Epsilon:0.01
回合:361/400,奖励:-15.0,Epsilon:0.01
回合:362/400,奖励:-18.0,Epsilon:0.01
回合:363/400,奖励:-17.0,Epsilon:0.01
回合:364/400,奖励:-22.0,Epsilon:0.01
回合:365/400,奖励:-15.0,Epsilon:0.01
回合:366/400,奖励:-15.0,Epsilon:0.01
回合:367/400,奖励:-15.0,Epsilon:0.01
回合:368/400,奖励:-16.0,Epsilon:0.01
回合:369/400,奖励:-16.0,Epsilon:0.01
回合:370/400,奖励:-15.0,Epsilon:0.01
回合:371/400,奖励:-20.0,Epsilon:0.01
回合:372/400,奖励:-15.0,Epsilon:0.01
回合:373/400,奖励:-15.0,Epsilon:0.01
回合:374/400,奖励:-15.0,Epsilon:0.01
回合:375/400,奖励:-16.0,Epsilon:0.01
回合:376/400,奖励:-15.0,Epsilon:0.01
回合:377/400,奖励:-15.0,Epsilon:0.01
回合:378/400,奖励:-17.0,Epsilon:0.01
回合:379/400,奖励:-20.0,Epsilon:0.01
回合:380/400,奖励:-17.0,Epsilon:0.01
回合:381/400,奖励:-15.0,Epsilon:0.01
回合:382/400,奖励:-15.0,Epsilon:0.01
回合:383/400,奖励:-15.0,Epsilon:0.01
回合:384/400,奖励:-15.0,Epsilon:0.01
回合:385/400,奖励:-16.0,Epsilon:0.01
回合:386/400,奖励:-15.0,Epsilon:0.01
回合:387/400,奖励:-18.0,Epsilon:0.01
回合:388/400,奖励:-15.0,Epsilon:0.01
回合:389/400,奖励:-15.0,Epsilon:0.01
回合:390/400,奖励:-15.0,Epsilon:0.01
回合:391/400,奖励:-16.0,Epsilon:0.01
回合:392/400,奖励:-18.0,Epsilon:0.01
回合:393/400,奖励:-15.0,Epsilon:0.01
回合:394/400,奖励:-15.0,Epsilon:0.01
回合:395/400,奖励:-15.0,Epsilon:0.01
回合:396/400,奖励:-20.0,Epsilon:0.01
回合:397/400,奖励:-15.0,Epsilon:0.01
回合:398/400,奖励:-15.0,Epsilon:0.01
回合:399/400,奖励:-15.0,Epsilon:0.01
回合:400/400,奖励:-15.0,Epsilon:0.01
完成训练!

开始测试!
环境:CliffWalking-v0, 算法:Sarsa, 设备:cpu
回合数:1/20, 奖励:-15.0
回合数:2/20, 奖励:-15.0
回合数:3/20, 奖励:-15.0
回合数:4/20, 奖励:-15.0
回合数:5/20, 奖励:-15.0
回合数:6/20, 奖励:-15.0
回合数:7/20, 奖励:-15.0
回合数:8/20, 奖励:-15.0
回合数:9/20, 奖励:-15.0
回合数:10/20, 奖励:-15.0
回合数:11/20, 奖励:-15.0
回合数:12/20, 奖励:-15.0
回合数:13/20, 奖励:-15.0
回合数:14/20, 奖励:-15.0
回合数:15/20, 奖励:-15.0
回合数:16/20, 奖励:-15.0
回合数:17/20, 奖励:-15.0
回合数:18/20, 奖励:-15.0
回合数:19/20, 奖励:-15.0
回合数:20/20, 奖励:-15.0
完成测试!

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

资源存储库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值