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

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 10else:return -0.1# 获取下一个状态
def next_state(state, action):row, col = statemove = 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.mrgr.cn/news/62856.html

相关文章:

  • 【Linux】设备树
  • 如何在Linux系统中使用LVM进行磁盘管理
  • Rust 文档生成与发布
  • Java如何使用分治法求最大值、最小值的应用分析?
  • 两道算法题
  • 最新出炉!2024年邮件营销平台综合盘点
  • ubuntu交叉编译libffi库给arm平台使用
  • 【力扣打卡系列】二叉树的最近公共祖先
  • 2024最新Linkedln领英养号方法总结
  • 【数学二】线性代数-行列式
  • 早点包子店点餐的软件下载和点餐操作教程 佳易王餐饮点餐管理系统操作方法
  • redis安装使用
  • 攻防世界 MISC miao~详解
  • Android——Activity生命周期
  • 面试题整理 2
  • net framework 3.5组件更新失败错误代码0x80072f8f怎样解决
  • LC:贪心题解
  • Javaweb梳理5——约束
  • 10 go语言(golang) - 数据类型:哈希表(map)及原理(二)
  • LoRA微调大模型 - 从主元 pivot 的角度看矩阵的秩
  • 前端如何解决浏览器input输入框密码自动填充的问题
  • 【C/C++】字符/字符串函数(1)——由string.h提供
  • DBeaver如何插入一行新数据或者复制一行新数据,真方便
  • selenium无头浏览器截图并以邮件发送
  • 【设计模式】如何用C++实现依赖倒置
  • AcWing 1069 凸多边形的划分 区间dp + 高精度