b站——《【强化学习】一小时完全入门》学习笔记及代码(1-3 多臂老虎机)

问题陈述

我们有两个多臂老虎机(Multi-Armed Bandit),分别称为左边的老虎机 和右边的老虎机。每个老虎机的奖励服从不同的正态分布:

  • 左边的老虎机 :奖励服从均值为 500 ,标准差为 50 的正态分布,即 N(500,50)N(500,50)。

  • 右边的老虎机 :奖励服从均值为 550 ,标准差为 100 的正态分布,即 N(550,100)N(550,100)。

我们的目标是使用 ε-greedy 强化学习算法(ε=0.1,初始值为 998)来估计这两个老虎机的奖励期望值。具体来说,我们需要通过多次尝试(拉动手臂)来逐步更新对每个老虎机奖励的估计,最终找到两个老虎机的奖励期望值。

问题分解

  1. 目标:

    • 使用 ε-greedy 算法估计两个老虎机的奖励期望值。

    • 通过多次尝试,逐步更新对每个老虎机奖励的估计。

  2. ε-greedy 算法:

    • ε=0.1:表示有 10% 的概率进行随机探索(随机选择一个老虎机),90% 的概率进行利用(选择当前估计奖励最高的老虎机)。

    • 初始值=998:表示每个老虎机的初始奖励估计值为 998。

  3. 奖励分布:

    • 左边的老虎机:N(500,50)N(500,50)

    • 右边的老虎机:N(550,100)N(550,100)

  4. 输出:

    • 经过多次尝试后,输出两个老虎机的奖励期望值的估计结果

    • 通过运行代码,我们可以得到一个图表,显示两个老虎机奖励期望估计值随着时间的变化情况。随着拉动次数的增加,两个估计值应该逐渐接近它们各自的真实奖励期望值(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()

显示结果如图:

相关推荐
dyxal13 分钟前
FireRedVAD 深度解析:小红书开源的工业级语音活动检测“小钢炮”
人工智能·开源·语音识别
陈布衣17 分钟前
MySQL(1)_MySQL 5.7.21 Linux 安装笔记
linux·笔记·mysql
加宝的起点雷达35 分钟前
40 条候选里 38 条来自同一个源,主卡整屏重样
人工智能·算法·创业
紧跟先前的步伐38 分钟前
Go AI Agent 实战 28|Agent 的预算、超时与停止条件
开发语言·人工智能·后端·ai·golang
蓝星科学1 小时前
AI Agent 说「已完成」,凭什么信——ChipCode 的证据链与产物门禁设计
人工智能
田里的水稻1 小时前
FA_CNN卷积神经网络二十六---从全连接到卷积PyTorch
人工智能·pytorch·cnn
艺杯羹1 小时前
MCP本地服务集成避坑:从Stdio管道僵死到双向JSON-RPC稳健通信
人工智能·python·ai·系统架构·大语言模型·ai编程·mcp
武子康1 小时前
h3.c 的两个权重槽,怎样把内存压力换成 SSD 等待
c语言·人工智能·agent
大模型真好玩1 小时前
豆包真人分身操作技巧:这次让我来做主演
人工智能·agent·deepseek
xyzzklk1 小时前
在Open-WebUI中提升向量化速度
网络·人工智能·爬虫·ai·语言模型·自然语言处理·安卓