Я пытаюсь решить Ti c Ta c Toe с подходом Q-обучения. Я использую 2 Q-таблицы для игроков X и O, и я награждаю победу 1, проигрываю -1 и ничью 0,5.
Поскольку при идеальной игре каждая игра заканчивается ничьей, я измерение сходимости с коэффициентом ничьей в последних 100 играх. К сожалению, я не могу привести это к конвергенции. Мой (соответствующий) код выглядит следующим образом:
def update_qtable(state, next_state, action, player, qtable, discount, lr):
state_idx = all_possible_states.index(state)
# For a full board, there are no more actions allowed (select_actions produces error)
if next_state.count(' ') > 0:
next_action = select_action(next_state, player, eps=0) # 0 = epsilon (greedy)
else:
next_action = 0
# Get Reward
reward = 0
winner, game_status = check_result(next_state)
if game_status == 'Done' and winner == player:
reward = 1
if game_status == 'Done' and winner != player:
reward = -1
if game_status == 'Draw':
reward = 0.5
next_state_idx = all_possible_states.index(next_state)
# calculate long-term reward
observed = reward + discount * qtable[next_state_idx, next_action]
# update Q-Table
qtable[state_idx, action] = qtable[state_idx, action] * (1 - lr) + observed * lr
.
.
.
#for each training epoch:
while game_status == 'Not Done':
if players_turn == 0: # X's move
# print("\nAI X's turn!")
action = select_action(state, 'X', epsilon)
new_state = play_move(state, 'X', action)
else: # O's move
# print("\nAI O's turn!")
action = select_action(state, 'O', epsilon)
new_state = play_move(state, 'O', action)
# Q Values of terminal states (full board) shall not be updated
if state.count(' ') > 0:
update_qtable(state, new_state, action, 'X', qtable_X, discount=0.95, lr=learning_rate[epoch])
update_qtable(state, new_state, action, 'O', qtable_O, discount=0.95, lr=learning_rate[epoch])
state = new_state.copy()
Я тренировался около 5000 эпох с затухающей скоростью обучения и эпсилоном (эпсилон жадный подход). Как только значение эпсилона становится небольшим, продолжает играть та же самая последовательность игр, что приводит к победе первого игрока. Это проблема с Q-learning, когда награда дается только в конце игры и поэтому не обрабатывается ранними ходами?
Надеюсь, вы можете прочитать мой код, я не совсем уверен, сколько информации вам нужно. Спасибо!