问题陈述
我们有两个多臂老虎机(Multi-Armed Bandit),分别称为左边的老虎机 和右边的老虎机。每个老虎机的奖励服从不同的正态分布:
-
左边的老虎机 :奖励服从均值为 500 ,标准差为 50 的正态分布,即 N(500,50)N(500,50)。
-
右边的老虎机 :奖励服从均值为 550 ,标准差为 100 的正态分布,即 N(550,100)N(550,100)。
我们的目标是使用 ε-greedy 强化学习算法(ε=0.1,初始值为 998)来估计这两个老虎机的奖励期望值。具体来说,我们需要通过多次尝试(拉动手臂)来逐步更新对每个老虎机奖励的估计,最终找到两个老虎机的奖励期望值。
问题分解
-
目标:
-
使用 ε-greedy 算法估计两个老虎机的奖励期望值。
-
通过多次尝试,逐步更新对每个老虎机奖励的估计。
-
-
ε-greedy 算法:
-
ε=0.1:表示有 10% 的概率进行随机探索(随机选择一个老虎机),90% 的概率进行利用(选择当前估计奖励最高的老虎机)。
-
初始值=998:表示每个老虎机的初始奖励估计值为 998。
-
-
奖励分布:
-
左边的老虎机:N(500,50)N(500,50)
-
右边的老虎机:N(550,100)N(550,100)
-
-
输出:
-
经过多次尝试后,输出两个老虎机的奖励期望值的估计结果
-
通过运行代码,我们可以得到一个图表,显示两个老虎机奖励期望估计值随着时间的变化情况。随着拉动次数的增加,两个估计值应该逐渐接近它们各自的真实奖励期望值(500 和 550)。
-
python
import numpy as np
import matplotlib.pyplot as plt
# 参数初始化
epsilon = 0.1 # ε-greedy算法中的ε
Q1 = 998 # 左边老虎机的奖励期望估计
Q2 = 998 # 右边老虎机的奖励期望估计
n1 = 0 # 左边老虎机的拉动次数
n2 = 0 # 右边老虎机的拉动次数
num_plays = 10000 # 总共拉动的次数
# 奖励的真实分布
mu1, sigma1 = 500, 50 # 左边老虎机的真实奖励分布(均值,标准差)
mu2, sigma2 = 550, 100 # 右边老虎机的真实奖励分布(均值,标准差)
# 用于存储结果
Q1_estimates = []
Q2_estimates = []
# ε-greedy策略的实验
for t in range(num_plays):
# 根据ε-greedy策略选择一个老虎机
if np.random.random() < epsilon:
action = np.random.choice([1, 2]) # 随机选择左或右
else:
action = 1 if Q1 > Q2 else 2 # 选择当前估计奖励最大的老虎机
if action == 1:
reward = np.random.normal(mu1, sigma1) # 从左边老虎机获得奖励
n1 += 1
Q1 += (reward - Q1) / n1 # 更新左边老虎机的奖励期望估计
Q1_estimates.append(Q1)
else:
reward = np.random.normal(mu2, sigma2) # 从右边老虎机获得奖励
n2 += 1
Q2 += (reward - Q2) / n2 # 更新右边老虎机的奖励期望估计
Q2_estimates.append(Q2)
# 最终的奖励期望估计
print(f"最终左边老虎机的奖励期望估计: {Q1}")
print(f"最终右边老虎机的奖励期望估计: {Q2}")
# 绘图
plt.figure(figsize=(12, 6))
# 绘制左边老虎机奖励期望估计的变化
plt.plot(Q1_estimates, label="Left Slot Machine (Q1)", color="blue")
# 绘制右边老虎机奖励期望估计的变化
plt.plot(Q2_estimates, label="Right Slot Machine (Q2)", color="red")
# 绘制真实奖励期望值的参考线
plt.axhline(y=mu1, color="blue", linestyle="--", label="True Q1 (500)")
plt.axhline(y=mu2, color="red", linestyle="--", label="True Q2 (550)")
# 图表设置
plt.title("Reward Estimation in ε-greedy Slot Machine Experiment")
plt.xlabel("Number of Plays")
plt.ylabel("Estimated Reward")
plt.legend(loc="best")
plt.grid(True)
# 显示图表
plt.show()
显示结果如图:
![](https://i-blog.csdnimg.cn/direct/50c3a7386c84436fa15d2f7f7f0b9ae3.png)