Python-代码阅读-epsilon-greedy策略函数(3)

1.代码 

def epsilon_greedy_policy(qnet, num_actions):
    def policy_fn(sess, observation, epsilon):
        # epsilon-greedy策略函数
        # 输入参数:
        #     qnet: Q网络模型,用于预测Q值
        #     num_actions: 动作空间的数量
        #     sess: TensorFlow会话,用于执行模型预测
        #     observation: 当前观测值
        #     epsilon: ε值,表示探索概率
        
        if (np.random.rand() < epsilon):  
            # 探索:等概率地选择所有动作
            A = np.ones(num_actions, dtype=float) / float(num_actions)
        else:
            # 利用:选择具有最大Q值的动作
            q_values = qnet.predict(sess, np.expand_dims(observation, 0))[0]
            max_Q_action = np.argmax(q_values)
            A = np.zeros(num_actions, dtype=float)
            A[max_Q_action] = 1.0 
        return A
    return policy_fn

2.代码阅读

该函数实现了ε-greedy策略,根据当前的Q网络模型(qnet)、动作空间的数量(num_actions)、当前观测值(observation)和探索概率ε(epsilon)选择动作。

当随机生成的随机数小于ε时,选择等概率地选择所有动作(探索),否则根据Q网络模型预测的Q值选择具有最大Q值的动作(利用)。返回一个概率分布,表示在当前状态下选择各个动作的概率。

2.1 np.ones(num_actions, dtype=float) / float(num_actions)

A = np.ones(num_actions, dtype=float) / float(num_actions)

A = np.ones(num_actions, dtype=float) / float(num_actions)这行代码的作用是创建一个包含num_actions个元素的一维数组A,每个元素的初始值都为1.0,并且将数组中的所有元素除以num_actions,从而得到一个等概率的概率分布。

具体而言,np.ones(num_actions, dtype=float)创建了一个由num_actions个元素组成的一维数组,每个元素的值都为1.0,/ float(num_actions)将数组中的每个元素除以num_actions,从而得到一个等概率的概率分布。最终,将这个概率分布赋值给数组A,表示在探索阶段,每个动作被选择的概率相等。

2.2 qnet.predict()

q_values = qnet.predict(sess, np.expand_dims(observation, 0))[0]

q_values = qnet.predict(sess, np.expand_dims(observation, 0))[0] 这行代码的作用是使用qnet模型通过输入observation进行预测,并获取预测结果中的Q值(动作值函数)。

具体而言,代码中使用np.expand_dims(observation, 0)observation转换为一个形状为(1, observation_shape)的数组,其中observation_shapeobservation的形状。这样做是为了将observation作为一个样本输入到qnet模型中进行预测。

接着,qnet.predict(sess, np.expand_dims(observation, 0))调用qnet模型的predict方法,传入sess作为会话对象和转换后的observation作为输入,得到一个包含Q值的数组。

最后,通过[0]取得数组中的第一个元素,即Q值数组,赋值给q_values,表示预测得到的Q值。这样,q_values就包含了模型对当前observation的每个动作的Q值估计。

np.expand_dims(observation, 0)

np.expand_dims(observation, 0) 这行代码的作用是将observation数组在第0维(最前面)添加一个维度。

具体而言,np.expand_dims(observation, 0)会返回一个新的数组,其中observation数组会在第0维添加一个维度。这个新的数组将具有形状(1, observation_shape),其中observation_shapeobservation数组的形状。这样做是为了将observation作为一个单独的样本输入到模型中进行预测。

例如,如果observation原本的形状是(observation_shape,),则经过np.expand_dims(observation, 0)处理后,新的数组形状将变为(1, observation_shape),其中第0维有一个大小为1的维度。这样的处理在某些情况下可以确保输入数据的维度与模型期望的输入维度一致。

2.3 max_Q_action = np.argmax(q_values)

max_Q_action = np.argmax(q_values)

max_Q_action = np.argmax(q_values) 这行代码的作用是找到Q值数组 q_values 中的最大值,并返回其对应的索引,即表示最优动作的索引

具体而言,np.argmax(q_values) 调用 np.argmax 函数,传入 q_values 数组作为参数。np.argmax 函数会返回 q_values 数组中的最大值所在的索引。这个索引表示在当前状态下,模型认为具有最高Q值(即最优动作)的动作。

将返回的最优动作索引赋值给 max_Q_action,以便后续在构建 epsilon-greedy 策略时使用。

2.4 np.zeros(num_actions, dtype=float)

A = np.zeros(num_actions, dtype=float)

A = np.zeros(num_actions, dtype=float) 这行代码的作用是创建一个形状为 (num_actions,) 的全零数组,并指定数据类型为 float

具体而言,np.zeros(num_actions, dtype=float) 调用 np.zeros 函数,传入 num_actions 参数作为数组的长度,dtype=float 参数指定数组的数据类型为 float。函数将创建一个长度为 num_actions 的全零数组,并将其数据类型设定为 float

这个数组 A 用于存储 epsilon-greedy 策略中各个动作的概率。在策略中,对于具有最高 Q 值的动作,其概率会设置为1,表示以确定性选择最优动作;而对于其他动作,其概率会设置为0,表示不选取这些动作。

2.5 A[max_Q_action] = 1.0

A[max_Q_action] = 1.0

A[max_Q_action] = 1.0 这行代码的作用是将 A 数组中索引为 max_Q_action 的位置的元素值设置为1.0。

具体而言,A[max_Q_action] 是访问 A 数组中索引为 max_Q_action 的位置的元素值。将其赋值为1.0,表示在 epsilon-greedy 策略中,最优动作的概率被设置为1.0,即以确定性选择最优动作。

这样,A 数组中只有最优动作的位置上的元素值为1.0,其余位置上的元素值都为0,从而实现了在策略中以确定性选择最优动作的效果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. Softmax算法: Softmax算法是一种基于概率的多臂老虎机算法。它的本质是将每个臂的平均奖励值转化为概率分布,选择最大概率的臂进行探索。 算法步骤: - 初始化每个臂的计数器和平均奖励值为0 - 对于每一轮,计算每个臂的概率分布,即p(i)=exp(q(i)/tau)/sum(exp(q(j)/tau)) - 从概率分布中选择一个臂i - 执行臂i并得到奖励r(i) - 更新臂i的计数器和平均奖励值 2. Epsilon-Greedy算法: Epsilon-Greedy算法是一种简单的多臂老虎机算法。它以1-epsilon的概率选择当前平均奖励值最高的臂,以epsilon的概率随机选择一个臂进行探索。 算法步骤: - 初始化每个臂的计数器和平均奖励值为0 - 对于每一轮,以1-epsilon的概率选择当前平均奖励值最高的臂,以epsilon的概率随机选择一个臂 - 执行选择的臂并得到奖励r(i) - 更新臂i的计数器和平均奖励值 3. BetaThompson sampling算法: BetaThompson sampling算法是一种贝叶斯多臂老虎机算法。它根据每个臂的奖励概率分布,使用贝叶斯推断方法计算每个臂被选择的概率。 算法步骤: - 初始化每个臂的计数器和奖励计数器为0 - 对于每一轮,计算每个臂的奖励概率分布,并从中抽取一个值作为当前臂的奖励概率 - 选择奖励概率最高的臂i - 执行臂i并得到奖励r(i) - 更新臂i的计数器和奖励计数器 4. UCB算法: UCB算法是一种基于置信区间的多臂老虎机算法。它使用置信区间作为选择臂的依据,同时平衡探索和利用的策略。 算法步骤: - 初始化每个臂的计数器和平均奖励值为0 - 对于每一轮,计算每个臂的置信区间上界,即UCB(i)=q(i)+c*sqrt(ln(t)/N(i)) - 选择置信区间上界最大的臂i - 执行臂i并得到奖励r(i) - 更新臂i的计数器和平均奖励值 5. LinUCB算法: LinUCB算法是一种基于线性模型的多臂老虎机算法。它使用线性回归模型来估计每个臂的奖励值,并使用置信区间来选择臂。 算法步骤: - 初始化每个臂的特征向量和奖励计数器为0 - 对于每一轮,计算每个臂的置信区间上界,即UCB(i)=theta(i)*x(t)+c*sqrt(x(t)T*A(i)^-1*x(t)) - 选择置信区间上界最大的臂i - 执行臂i并得到奖励r(i) - 更新臂i的特征向量和奖励计数器,并更新线性回归模型的参数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天寒心亦热

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

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

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

打赏作者

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

抵扣说明:

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

余额充值