【动手学强化学习】02多臂老虎机

问题定义

强化学习关注的是在于环境交互中学习,是一种试错学习的范式。在正式进入强化学习之前,我们先来了解多臂老虎机问题。该问题也被看作简化版的强化学习,帮助我们更快地过度到强化学习阶段。

有一个拥有 K K K 根拉杆的老虎机,拉动每根拉杆都有着对应奖励 R R R,且这些奖励可以进行累加。在各根拉杆的奖励分布未知的情况下,从头开始尝试,在进行 T T T 步操作次数后,得到尽可能高的累计奖励。
在这里插入图片描述

对于每个动作 a a a,我们定义其期望奖励是 Q ( a ) Q(a) Q(a)。是,至少存在一根拉杆,它的期望奖励不小于拉动其他任意一根拉杆,我们将该最优期望奖励表示为
Q ∗ = max ⁡ a ∈ A Q ( a ) Q^* = \max_{a \in A}Q(a) Q=aAmaxQ(a)
为了更为直观的表示实际累计奖励和真实累计奖励之间的误差,我们引入懊悔概念,用来表示它们之间的差值。
R ( a ) = Q ∗ − Q ( a ) R(a) = Q^* - Q(a) R(a)=QQ(a)

下面我们编写代码来实现一个拉杆数为 10 的多臂老虎机。其中拉动每根拉杆的奖励服从伯努利分布(Bernoulli distribution),即每次拉下拉杆有的概率获得的奖励为 1,有的概率获得的奖励为 0。奖励为 1 代表获奖,奖励为 0 代表没有获奖。

import numpy as np
import matplotlib.pyplot as plt
class BernouliiBandit:
    def __init__(self, K):
        self.probs:np.ndarray = np.random.uniform(size=K)  # type: ignore # 随机生成K个0~1的数,作为拉动每根拉杆的获奖 #
        # 概率
        self.best_idx = np.argmax(self.probs)  # 获奖概率最大的拉杆
        self.best_prob = self.probs[self.best_idx]  # 最大的获奖概率
        self.K = K
    def step(self, k
### 多老虎机算法在Java中的实现 多老虎机问题是强化学习领域的一个经典问题,旨在通过一系列试验找到具有最高回报率的动作。一种常见的解决策略是ε-greedy方法,在该方法中,大部分时间会选择当前估计价值最高的动作(即贪婪选择),但在一小部分时间内会随机选取其他动作来探索可能更好的选项[^3]。 下面是一个简单的基于ε-greedy策略的多老虎机算法的Java实现: ```java import java.util.Random; public class EpsilonGreedyBandit { private final int numArms; private double[] qValues; // Estimated values for each arm. private Random randomGenerator; private static final double epsilon = 0.1; // Exploration rate. public EpsilonGreedyBandit(int numberOfArms) { this.numArms = numberOfArms; reset(); randomGenerator = new Random(System.currentTimeMillis()); } /** * Resets the agent's knowledge about arms' rewards. */ public void reset() { qValues = new double[numArms]; for (int i = 0; i < numArms; ++i) { qValues[i] = 0.0; } } /** * Selects an action based on current estimates and exploration policy. * * @return Index of selected arm/action. */ public int selectAction() { if (randomGenerator.nextDouble() > epsilon) { // Exploit learned values. return exploit(); } else { // Explore other options. return explore(); } } private int exploit() { int bestArmIndex = 0; for (int i = 1; i < numArms; ++i) { if (qValues[i] > qValues[bestArmIndex]) { bestArmIndex = i; } } return bestArmIndex; } private int explore() { return randomGenerator.nextInt(numArms); } /** * Updates estimate after receiving reward from environment. * * @param chosenArm Arm that was pulled. * @param reward Reward received from pulling given arm. */ public void updateEstimate(int chosenArm, double reward) { qValues[chosenArm] += 0.1 * (reward - qValues[chosenArm]); // Using fixed step-size alpha=0.1. } } ``` 此代码片段展示了如何创建一个多老虎机模拟器类`EpsilonGreedyBandit`,它实现了基本的ε-greedy行为模式。在这个例子中,使用了一个固定的学习速率α=0.1来进行奖励值的更新操作[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

误伤这又何妨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值