Q-Learning для Ti c Ta c Toe не сходится - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь решить 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, когда награда дается только в конце игры и поэтому не обрабатывается ранними ходами?

Надеюсь, вы можете прочитать мой код, я не совсем уверен, сколько информации вам нужно. Спасибо!

...