시간적 차이를 배우는 예제 (https://www.youtube.com/watch?v=XrxgdpduWOU)를 사용하고 있으며 파이썬 구현시 다음 계산식에 문제가 있습니다.시간 차이 학습의 이중 계산
아래 표를 2 차원 배열로 코딩하면 최대 보상이 1이라고 가정 할 때 현재 위치는 (2, 2)이고 목표는 (2, 3)입니다. Q (t)를 현재의 평균 평균 위치, 다음 r (t + 1) 1이고 최대 Q (t + 1) 또한 1, 내 Q (t) 2 (감마 1 가정) 가까운 결과를 가정합니다. 이게 맞습니까? 아니면 Q (n), 여기서 n은 종점입니까?
편집 코드를 포함하는 - I 그것이 종점이며, 값이 모두 현재 인 경우 0을 반환 get_max_q 함수를 수정 아래 I은 보상 이후 더 정확한 추정 한 (단지 1입니다.) 이것이 올바른 접근법인지 확실하지 않습니다 (이전에는 종점 일 때 1을 반환하도록 설정했습니다).#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})
코드를 표시하고 원하는 출력을 표시하고 잘못된 출력을 표시하십시오. –
@TomKarzes 감사합니다. 코드와 출력을 포함 시켰습니다. –