我一直在尝试实施强化学习书籍练习2.5
我已经根据这个伪版本编写了这段代码
class k_arm:
def __init__(self, iter, method="incrementally"):
# self.iter placeholder
self.iter = iter
self.k = 10
self.eps = .1
# here is Q(a) and N(a)
self.qStar = np.zeros(self.k)
self.n = np.zeros(self.k)
# Method just for experimenting different functions
self.method = method
def pull(self):
# selecting argmax(Q(A)) action with prob. (1 - eps)
eps = np.random.uniform(0, 1, 1)
if eps < self.eps or self.qStar.argmax() == 0:
a = np.random.randint(10)
else: a = self.qStar.argmax()
# R bandit(A)
r = np.random.normal(0, 0.01, 1)
# N(A) <- N(A) + 1
self.n[a] += 1
# Q(A) <- Q(A) i / (N(A)) * (R - Q(A))
if self.method == "incrementally":
self.qStar[a] += (r - self.qStar[a]) / self.n[a]
return self.qStar[a]`
iter = 1000
rewards = np.zeros(iter)
c = k_arm(iter, method="incrementally")
for i in range(iter):
k = c.pull()
rewards[i] = k
结果我得到了这个
我期待着这样的结果
我一直想知道我在哪里失踪了,但我不能
你的平均报酬大约是0,因为这是正确的估计。您的奖励功能定义为:
这意味着您的奖励分配的预期值为0,方差为0.01。在这本书中,作者使用了不同的奖励函数。虽然这个仍然有一个基本问题,但如果您将代码更改为
给每个强盗一个不同的奖励函数是有意义的或者你所有的行动值都是相同的。因此,您真正应该做的是从
k
不同的分布中采样,并使用不同的期望值。否则,动作选择就没有意义了。 将此添加到init
函数中:并更改奖励的计算,使其取决于行动:
我还将方差增加到了0.5,因为0.01对于强盗来说基本上是无意义的方差。如果你的代理人工作正常,他的平均报酬应该大约等于
np.max(self.expected_vals)
相关问题 更多 >
编程相关推荐