当前位置: 首页 > news >正文

用ε贪婪算法解决多老虎机问题

一、代码

# 4-2 用ε贪婪算法解决多老虎机问题

import numpy as np
import matplotlib.pyplot as plt

# 参数设置
c = 10  # 老虎机数量
l = 501  # 最后时刻
runs = 1000  # 运行次数
epsilon = 0.01  # ε贪婪中的ε

# 构造随机种子为指定值的随机数生成器
rng = np.random.default_rng(1)

# 初始化每一时刻的奖赏和
timestep_rewards = np.zeros(l)  # 修改为大小为 l 的数组
timestep_rewards_epsilon = np.zeros(l)  # 修改为大小为 l 的数组

# 运行循环
for run in range(runs):
    # 每次运行的初始化
    occ_actions = np.zeros(c)  # 每个行动被选择的次数
    acc_rewards = np.zeros(c)  # 每个行动下累加获得的奖赏
    estimated_rewards = np.zeros(c)  # 每台老虎机奖赏期望值的估计值
    occ_actions_epsilon = np.zeros(c)  # 每个行动被选择的次数(ε贪婪)
    acc_rewards_epsilon = np.zeros(c)  # 每个行动下累加获得的奖赏(ε贪婪)
    estimated_rewards_epsilon = np.zeros(c)  # 每台老虎机奖赏期望值的估计值(ε贪婪)
    means_bandits = rng.normal(0, 1, c)  # 每次运行时的老虎机奖赏期望值

    # 从第1个时刻到第l-1个时刻
    for t in range(l - 1):
        # 计算每台老虎机的奖赏期望值的估计值
        for i in range(c):
            estimated_rewards[i] = 0 if acc_rewards[i] == 0 else acc_rewards[i] / occ_actions[i]
            estimated_rewards_epsilon[i] = 0 if acc_rewards_epsilon[i] == 0 else acc_rewards_epsilon[i] / occ_actions_epsilon[i]

        # 选择贪婪行动
        a_t = np.argmax(estimated_rewards).item()
        # ε贪婪
        if rng.random() > epsilon:
            # 选择贪婪行动
            a_t_epsilon = np.argmax(estimated_rewards_epsilon).item()
        else:
            # 随机选择行动
            a_t_epsilon = rng.integers(0, c)

        # 选择该行动后(在下一时刻)获得的奖赏
        r_tp1 = rng.normal(means_bandits[a_t], 1)
        r_tp1_epsilon = rng.normal(means_bandits[a_t_epsilon], 1)

        # 累加当前行动选择获得的奖赏
        occ_actions[a_t] += 1
        acc_rewards[a_t] += r_tp1
        occ_actions_epsilon[a_t_epsilon] += 1
        acc_rewards_epsilon[a_t_epsilon] += r_tp1_epsilon

        # 累加每个时刻下获得的奖赏
        timestep_rewards[t + 1] += r_tp1
        timestep_rewards_epsilon[t + 1] += r_tp1_epsilon

# 画平均奖赏线
plt.figure()
plt.plot(np.arange(1, l), timestep_rewards[1:] / runs, linewidth=2)
plt.plot(np.arange(1, l), timestep_rewards_epsilon[1:] / runs, 'r', linewidth=2)
plt.ylabel('Averaged rewards')
plt.xlabel('Time steps')
plt.title('Greedy v.s. Epsilon-greedy')
plt.legend(['Greedy', 'Epsilon-greedy'])
plt.show()

二、结果图

相关文章:

  • 简单了解TypeScript
  • Java实现10大经典排序算法
  • 【操作系统】macOS软件提示“已损坏,打不开”的解决方案
  • 数字ic后端设计从入门到精通8(含fusion compiler, tcl教学)ULVTLL、LVT、ULVT详解及应用
  • 游戏技能编辑器界面优化设计
  • AEO:从搜索引擎到答案引擎,AI时代搜索优化的新战场
  • MSPM0G3507学习笔记(三)软硬I2C任意切换,兼容HAL:oled与mpu6050
  • RK 安卓10/11平台 HDMI-IN 调试
  • SSRF4 SSRF-gopher 协议扩展利用-向内网发起 GET/POST 请求
  • Java中间件使用方式与实战应用
  • 基于深度学习的智能文本摘要系统:技术与实践
  • 【音视频】SIP基础、搭建服务器和客户端
  • uniapp 配置devserver代理
  • P6 QT项目----汽车仪表盘(6.4)
  • C++ vector深度剖析与模拟实现:探索模板的泛型应用
  • 腾讯云国际站缩容:策略、考量与实践
  • 智慧园区建设资料合集(Wordppt原件)
  • Spring Boot 中的条件装配:@Conditional 系列注解详解
  • 答辩讲解387基于Spring Boot的心理健康管理系统
  • 【Python系列PyCharm实战】ModuleNotFoundError: No module named ‘sklearn’ 系列Bug解决方案大全
  • 企业做网站的注意什么/今天的重要新闻
  • WordPress使用中文链接好吗/广州seo网站营销
  • 金坛市常州网络推广/江西seo
  • 网站免费服务器/线上推广平台哪些好
  • 算命网站怎么做/网站优化策略
  • 销售类电商网站如何做优化/seo诊断专家