第2关:ϵ -贪心
import numpy as np
# 定义k-摇臂赌博机类
class Bandit:
def __init__(self, k):
self.k = k
self.q_star = np.random.normal(0, 1, k) # 真实回报分布
# 选择拉杆并获得奖励
def pull(self, action):
reward = np.random.normal(self.q_star[action], 1)
return reward
# 请在下面的 Begin-End 之间按照注释中给出的提示编写正确的代码
########## Begin ##########
# 贪心算法
def greedy(bandit, epsilon, num_steps):
# 第一步:初始化回报估计值
q_estimates = np.zeros(bandit.k)
# 第二步:初始化拉杆选择次数
action_counts = np.zeros(bandit.k)
# 第三步:初始化累积奖励
rewards = np.zeros(num_steps)
for step in range(num_steps):
# 如果随机数小于 epsilon
if np.random.random() < epsilon:
# 第四步:随机选择一个摇臂进行探索
action = np.random.randint(0, bandit.k)
else:
# 第五步:选择具有最高回报估计值的摇臂进行利用
action = np.argmax(q_estimates)
# 选择摇臂并获得奖励
reward = bandit.pull(action)
# 第六步:更新摇臂选择次数
action_counts[action] += 1
# 第七步:更新回报估计值
q_estimates[action] += (reward - q_estimates[action]) / action_counts[action]
# 第八步:更新累积奖励
rewards[step] = reward
return rewards
########## End ##########
# 创建一个k-摇臂赌博机实例
bandit = Bandit(k=10)
# 使用贪心算法进行探索与利用
epsilon = 0.1
num_steps = 10
rewards_greedy = greedy(bandit, epsilon, num_steps)