卡姆斯班迪厄普西隆里迪政策

2024-10-03 00:26:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试实施强化学习书籍练习2.5

我已经根据这个伪版本编写了这段代码

enter image description here

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

结果我得到了这个

enter image description here

我期待着这样的结果

enter image description here

我一直想知道我在哪里失踪了,但我不能


Tags: selfforifdefnpzerosrandomeps
1条回答
网友
1楼 · 发布于 2024-10-03 00:26:24

你的平均报酬大约是0,因为这是正确的估计。您的奖励功能定义为:

 # R bandit(A)
 r = np.random.normal(0, 0.01, 1)

这意味着您的奖励分配的预期值为0,方差为0.01。在这本书中,作者使用了不同的奖励函数。虽然这个仍然有一个基本问题,但如果您将代码更改为

 # R bandit(A)
 r = np.random.normal(1.25, 0.01, 1)

给每个强盗一个不同的奖励函数是有意义的或者你所有的行动值都是相同的。因此,您真正应该做的是从k不同的分布中采样,并使用不同的期望值。否则,动作选择就没有意义了。 将此添加到init函数中:

self.expected_vals = np.random.uniform(0, 2, self.k)

并更改奖励的计算,使其取决于行动:

r = np.random.uniform(self.expected_vals[a], 0.5, 1)

我还将方差增加到了0.5,因为0.01对于强盗来说基本上是无意义的方差。如果你的代理人工作正常,他的平均报酬应该大约等于np.max(self.expected_vals)

相关问题 更多 >