Ниже приведен типичный алгоритм 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