укб многорукий бандит python - PullRequest
0 голосов
/ 21 февраля 2020

Ниже приведен типичный алгоритм UCB для задачи с многоруким бандитом. X представляет собой матрицу, в которой каждая строка представляет каждое плечо, а каждый столбец представляет время воспроизведения t. И X [a] [b] означает вознаграждение, получаемое от игры рукой a в момент времени t.

Я верю, что алгоритм правильный, но я провалил все тесты. Есть ли очевидная ошибка, которую я не заметил? Спасибо, просто смотрите на это весь день и ничего не получите.

Возвращаемое значение - это список порядка игры на руках по этому алгоритму.

    T = len(X[0])
    K = len(X)
    arm_select = []
    n_selections = [0] * K
    sums_of_rewards = [0] * K
    total_reward = 0.0
    for n in range(0, T):
        ad = 0
        max_up_bound = 0
        for i in range(0, K):
            if (n_selections[i] > 0):
                average_reward = sums_of_rewards[i] / n_selections[i]
                UCB_term = math.sqrt(2 * math.log(n+1) / n_selections[i])
                up_bound = average_reward + UCB_term
            else:
                up_bound = 1e400
            if up_bound > max_up_bound:
                max_up_bound = up_bound
                ad = i
        arm_select.append(ad)
        n_selections[ad] = n_selections[ad] + 1
        reward = X[ad][n]
        sums_of_rewards[ad] = sums_of_rewards[ad] + reward
        total_reward = total_reward + reward
    return arm_select
...