Исследование Больцмана с более чем двумя действиями в Q-learning
Я использую исследование Больцмана в Q-learning, где у меня есть как минимум 10 действий в каждом штате. Я знаю, что только с двумя действиями, исследование Больцмана может быть применено довольно просто следующим образом:
- Рассчитайте pr1 и pr2 для двух действий с помощью уравнения разведки Больцмана.
- Генерация случайного числа r
- Предполагая, что pr1>pr2. Если r<=pr1, предпринять действие, соответствующее вероятности pr1. Если r>pr1, выполните действие, соответствующее pr2.
Тем не менее, как я могу сделать это с 10 действиями? На каждом этапе принятия решения я обновляю вероятности всех действий. Это дает мне распределение вероятностей всех действий, где вероятность наилучшего действия самая высокая. Как выбрать действие в этом случае, используя исследование Больцмана?
2 ответа
Вот отличное обсуждение взвешенной случайной выборки: Дартс, Кости и Монеты.
И вот моя реализация метода Псевдонима Восе:
class WeightedRandom
{
private alias : array[int];
private prob : array[double];
private random : Random;
public this(p : array[double], random : Random)
{
this.random = random;
def n = p.Length;
alias = array(n);
prob = array(n);
def small = Queue(n);
def large = Queue(n);
def p = p.Map(_ * n : double);
foreach (x in p with i)
(if (x < 1.0) small else large).Enqueue(i);
while (!small.IsEmpty && !large.IsEmpty)
{
def s = small.Dequeue();
def l = large.Dequeue();
prob[s] = p[s];
alias[s] = l;
p[l] = p[l] + p[s] - 1;
(if (p[l] < 1.0) small else large).Enqueue(l);
}
while (!large.IsEmpty)
prob[large.Dequeue()] = 1.0;
while (!small.IsEmpty)
prob[small.Dequeue()] = 1.0;
}
public NextIndex() : int
{
def i = random.Next(prob.Length);
if (random.NextDouble() < prob[i])
i;
else
alias[i];
}
}
Есть, возможно, более хорошие способы сделать это, но основная идея заключается в следующем:
def weighted_choice(weights):
r = uniform(0, sum(weights))
for i, weight in enumerate(weights):
r -= weight
if(r < 0):
return i
где weights - список pr1,pr2,.., а возвращаемое значение - индекс выигрышного действия.