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

Q-learning原理及代码实现

目录

1. Q-learning原理        

  1.1 Q值

  1.2  更新规则

  1.3  目标

  1.4  探索与利用

2.代码实现

  2.1 代码示例

  2.2 解释


1. Q-learning原理        

        Q-learning是一种基于值强化学习算法,用于在不依赖环境模型的情况下学习最优策略。它的目标是通过学习动作-状态对的价值(即Q值),找到使得累计奖励最大的策略。以下是Q-learning的关键步骤和公式:

  1.1 Q值

        Q值(动作价值)是一个函数,表示在某一状态下选择某一动作后,能够获得的未来累计奖励。Q值表示为 Q(s, a),其中 s 是当前状态,a 是当前动作。

  1.2  更新规则

        Q-learning 的核心是 Q 值的更新公式。在每一步,Q-learning 会通过与环境交互,更新对应的 Q 值:

Q(s, a) \leftarrow Q(s, a) + \alpha \left[ r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right]

其中:

  • Q(s, a) 是当前 Q 值
  • \alpha 是学习率,控制更新的速度
  • r 是执行动作后获得的即时奖励
  • \gamma 是折扣因子,权衡当前奖励和未来奖励的影响
  • \max_{a'} Q(s', a') 是在新状态 s' 下所有可能动作的最大 Q 值

  1.3  目标

        通过反复更新Q值,Q-learning可以逐渐逼近最优动作价值函数 Q^*(s, a)。这样,在每个状态下,选择Q值最大的动作就能得到最优策略。

  1.4  探索与利用

        Q-learning 需要平衡“探索”和“利用”:

  • 探索:选择随机动作,以探索新的可能性。
  • 利用:选择当前 Q 值最高的动作,以获得最大奖励。

        常用的探索策略是 \epsilon-贪心策略,即以概率 \epsilon 随机选择动作,以概率 1 - \epsilon 选择当前最佳动作。

        Q-learning 已广泛应用于游戏、路径规划等领域,特别适合在离散状态和动作空间下的控制任务。


2.代码实现

        我们可以用一个简单的迷宫问题来举例,展示如何使用Q-learning找到从起点到终点的最优路径。假设一个5x5的迷宫,其中:

  • 起点在左上角(0, 0),终点在右下角(4, 4)。
  • 代理(智能体)每次可以向上、下、左、右四个方向移动。
  • 如果撞墙或走出边界,则返回到该状态,并获得-1的奖励。
  • 到达终点时获得+10的奖励。
  • 其余位置每次移动获得-0.1的奖励,以鼓励代理尽快找到终点。

  2.1 代码示例

        以下是一个基于Q-learning的简单实现,用来训练智能体找到从起点到终点的最短路径。

import numpy as np
import random

# 环境设置
maze_size = 5
goal = (4, 4)  # 目标状态
actions = ['up', 'down', 'left', 'right']  # 动作空间
action_dict = {'up': (-1, 0), 'down': (1, 0), 'left': (0, -1), 'right': (0, 1)}

# Q-learning参数
alpha = 0.1       # 学习率
gamma = 0.9       # 折扣因子
epsilon = 0.1     # 探索概率
episodes = 5000   # 训练轮数

# 初始化Q表
Q_table = np.zeros((maze_size, maze_size, len(actions)))

# 定义奖励函数
def get_reward(state):
    if state == goal:
        return 10
    else:
        return -0.1

# 获取下一个状态
def next_state(state, action):
    row, col = state
    move = action_dict[action]
    next_row, next_col = row + move[0], col + move[1]
    if 0 <= next_row < maze_size and 0 <= next_col < maze_size:
        return (next_row, next_col)
    else:
        return state  # 撞墙则停在原地

# Q-learning算法
for episode in range(episodes):
    state = (0, 0)  # 初始状态
    while state != goal:
        # 选择动作
        if random.uniform(0, 1) < epsilon:
            action_index = random.randint(0, len(actions) - 1)  # 随机选择动作
        else:
            action_index = np.argmax(Q_table[state[0], state[1]])  # 利用Q值选择最优动作
        action = actions[action_index]

        # 执行动作,观察奖励和下一个状态
        next_state_ = next_state(state, action)
        reward = get_reward(next_state_)

        # 更新Q值
        best_next_action = np.argmax(Q_table[next_state_[0], next_state_[1]])
        Q_table[state[0], state[1], action_index] += alpha * (reward + gamma * Q_table[next_state_[0], next_state_[1], best_next_action] - Q_table[state[0], state[1], action_index])

        # 状态更新
        state = next_state_

# 打印结果Q表
print("Learned Q-table:")
print(Q_table)

# 显示路径
state = (0, 0)
path = [state]
while state != goal:
    action_index = np.argmax(Q_table[state[0], state[1]])
    action = actions[action_index]
    state = next_state(state, action)
    path.append(state)

print("Optimal path from start to goal:", path)

  2.2 解释

  1. 环境初始化:我们定义了一个5x5的迷宫,每个位置可以向上、下、左、右四个方向移动。
  2. Q表更新:Q表存储在Q_table中,维度为(maze_size, maze_size, len(actions))。每个状态在四个方向上有一个Q值。
  3. 训练过程
    • 通过epsilon-贪心策略选择动作,以平衡探索和利用。
    • 根据所选动作获得奖励,计算下一个状态,并用更新规则调整当前状态的Q值。
  4. 输出路径:训练完成后,输出从起点到目标的最优路径。

        通过多次迭代,智能体将学习到从左上角到右下角的最短路径。


http://www.kler.cn/a/373645.html

相关文章:

  • 论文翻译 | PROMPTAGATOR : FEW-SHOT DENSE RETRIEVAL FROM 8 EXAMPLES
  • 刘艳兵-DBA015-对于属于默认undo撤销表空间的数据文件的丢失,哪条语句是正确的?
  • 关于Android Studio Koala Feature Drop | 2024.1.2下载不了插件的解决办法
  • 【日常记录-Java】JarFile
  • 金和OA-C6 ApproveRemindSetExec.aspx XXE漏洞复现(CNVD-2024-40568)
  • SystemC学习(3)— APB_SRAM的建模与测试
  • 初识 BPF:从 Hello World 开始的内核编程之旅
  • SpringBoot技术:闲一品交易的未来
  • 标准数字隔离器主要特性和应用---腾恩科技
  • CAN报文:位定时和位同步
  • CSS 复习
  • ARM base instruction -- adc
  • 基于LORA的一主多从监测系统_4G模块上巴法云
  • 哈希函数简介
  • 全局数据在Python包中模块间管理方法探讨
  • 红警之家进不去
  • Ribbon的轮询策略实现方法
  • 把握鸿蒙生态机遇,共创智能应用未来
  • shell基础-for\while\break
  • 使用Scrapy框架爬取博客信息
  • 深度学习:梯度下降算法简介
  • Spring学习笔记_16——@Inject
  • Es可视化界面 ElasticHd
  • 杂货 | 每日资讯 | 2024.10.31
  • 远程工作时代的文件安全管理挑战与机遇
  • 尚硅谷-react教程-求和案例-优化2-Provider组件的使用-笔记