Python 时差学习中的重复计数

Python 时差学习中的重复计数,python,machine-learning,reinforcement-learning,temporal-difference,Python,Machine Learning,Reinforcement Learning,Temporal Difference,我正在研究一个时差学习示例(),在python实现中,我遇到了一些问题,因为我似乎在重复计算奖励和Q 如果我将下面的网格编码为2d数组,那么我当前的位置是(2,2),目标是(2,3),假设最大奖励是1。假设Q(t)是我当前位置的平均值,那么r(t+1)是1,我假设max Q(t+1)也是1,这导致我的Q(t)变得接近2(假设gamma为1)。这是正确的,还是我应该假设Q(n),其中n是终点是0 编辑以包含代码-我修改了get_max_q函数,如果它是终点,则返回0,并且值现在都小于1(我认为

我正在研究一个时差学习示例(),在python实现中,我遇到了一些问题,因为我似乎在重复计算奖励和Q

如果我将下面的网格编码为2d数组,那么我当前的位置是(2,2),目标是(2,3),假设最大奖励是1。假设Q(t)是我当前位置的平均值,那么r(t+1)是1,我假设max Q(t+1)也是1,这导致我的Q(t)变得接近2(假设gamma为1)。这是正确的,还是我应该假设Q(n),其中n是终点是0

编辑以包含代码-我修改了get_max_q函数,如果它是终点,则返回0,并且值现在都小于1(我认为这更正确,因为奖励仅为1),但不确定这是否是正确的方法(以前我在终点时将其设置为返回1)

#不确定这是否正确
def get_max_q(q,位置):
#终点
#不确定是否应将其设置为0或1
如果位置==(最大行数-1,最大列数-1):
返回0
返回最大值([q[pos,am]表示可用移动(pos)中的am)
def学习(q、旧位置、行动、奖励):
新建位置=获取新位置(旧位置,操作)
max_q_next_move=get_max_q(q,新位置)
q[(旧位置,动作)]=q[旧位置,动作]+alpha*(奖励+最大值下一步动作-q[旧位置,动作])-0.04
def移动(q,当前位置):
移动=可用移动(当前位置)
如果random.random()
Q值表示在本集结束前您预计会获得多少奖励的估计值。所以,在终端状态下,maxQ=0,因为在此之后您将不会收到任何奖励。因此,
t
处的Q值将为1,这对于未贴现的问题是正确的。但是你不能忽略等式中的
伽马
,把它加到你的公式中,让它打折。因此,例如,如果
gamma=0.9
,则
t
处的Q值将为0.9。在(2,1)和(1,2)处,它将是0.81,依此类推。

显示您的代码,显示您想要的输出,并显示您得到的不正确的输出。@TomKarzes谢谢您,我已经包括了我的代码和输出!谢谢,我将用伽马值进行实验!感谢您的解释,按照您的解释,maxQ在终端状态下为0是有意义的。
#not sure if this is correct
def get_max_q(q, pos):
    #end point 
    #not sure if I should set this to 0 or 1
    if pos == (MAX_ROWS - 1, MAX_COLS - 1):
        return 0
    return max([q[pos, am] for am in available_moves(pos)])

def learn(q, old_pos, action, reward):
    new_pos = get_new_pos(old_pos, action)
    max_q_next_move = get_max_q(q, new_pos) 

    q[(old_pos, action)] = q[old_pos, action] +  alpha * (reward + max_q_next_move - q[old_pos, action]) -0.04

def move(q, curr_pos):
    moves = available_moves(curr_pos)
    if random.random() < epsilon:
        action = random.choice(moves)
    else:
        index = np.argmax([q[m] for m in moves])
        action = moves[index]

    new_pos = get_new_pos(curr_pos, action)

    #end point
    if new_pos == (MAX_ROWS - 1, MAX_COLS - 1):
        reward = 1
    else:
        reward = 0

    learn(q, curr_pos, action, reward)
    return get_new_pos(curr_pos, action)

=======================
OUTPUT
Average value (after I set Q(end point) to 0)
defaultdict(float,
            {((0, 0), 'DOWN'): 0.5999999999999996,
             ((0, 0), 'RIGHT'): 0.5999999999999996,
              ...
             ((2, 2), 'UP'): 0.7599999999999998})

Average value (after I set Q(end point) to 1)
defaultdict(float,
        {((0, 0), 'DOWN'): 1.5999999999999996,
         ((0, 0), 'RIGHT'): 1.5999999999999996,
         ....
         ((2, 2), 'LEFT'): 1.7599999999999998,
         ((2, 2), 'RIGHT'): 1.92,
         ((2, 2), 'UP'): 1.7599999999999998})