【强化学习】Q-learning算法详解:含MATLAB和Python实现代码

news2025/4/16 1:52:49

Q-learning算法详解

  • 1. Q-learning算法简介
    • Q-Learning算法的基本概念
    • Q-Learning算法的核心思想
    • Q-learning算法步骤
    • Q-Learning算法的特点
  • MATLAB 实现 Q-learning
  • Python 实现 Q-learning
  • 参考

强化学习属于机器学习,但与以前的监督学习和无监督学习的处理对象和任务都不同。监督学习和无监督学习处理的都是静态的数据,比如文本、图像等,主要是解决分类、回归及聚类等问题。

而强化学习要解决的是 动态的决策问题,是根据不断变化的环境,做出不同的决策,最后生成一个动作序列,以达到某种目的或者最优,处理的数据是动态的。
在这里插入图片描述

强化学习的目的,是让计算机学会自主的进行动态的决策。阿尔法围棋软件就是典型的强化学习成果,最近推出的ChartGPT的核心算法,也是基于神经网络组成的强化学习框架。

1. Q-learning算法简介

Q-learning是一种基于值迭代的强化学习算法,属于无模型(model-free)强化学习方法。它通过学习 状态-动作值函数(Q值) 来优化策略,使得智能体在给定环境中获得最大累计奖励。
在这里插入图片描述

Q-Learning算法的基本概念

在这里插入图片描述

  • 状态(State)‌:环境的某个特定情况或配置。
  • 动作(Action)‌:在给定状态下可以采取的可能行为。
  • 奖励(Reward)‌:采取某个动作后从环境中获得的即时回报。
  • 策略(Policy)‌:从状态到动作的映射,指导如何根据当前状态选择动作。
  • Q函数(Q-value)‌:表示在状态s下采取动作a的期望回报。

在强化学习中,奖励非常重要,因为样本没有标签,理论上是奖励在引领学习。一般需要人工设置,是强化学习中较为复杂的难点。

Q-Learning算法的核心思想

Q-Learning通过贝尔曼(Bellman)方程来更新Q值,其公式为:
在这里插入图片描述

Q-learning算法步骤

1、初始化 Q 表:将所有状态-动作对的 Q 值设为零或随机值

2、选择动作:使用 ε-greedy 策略选择动作:

  • 以概率 ϵ 进行随机探索
  • 以概率 1−ϵ 选择当前 Q 值最大的动作(贪心策略)

3、执行动作 & 观察奖励:执行动作 a,观察环境的新状态 s′ 和奖励 r

4、更新 Q 值:使用 Q-learning 公式更新 Q 表

5、重复:直到满足终止条件(如达到最大迭代次数或收敛)
在这里插入图片描述

Q-Learning算法的特点

  • 无需模型‌:Q-Learning不需要环境的动态模型,通过与环境的交互来学习。
  • ‌离线学习‌:可以在没有实时环境反馈的情况下,使用已经收集的数据来更新Q值。
  • ‌收敛性‌:在满足一定条件下,Q-Learning能够收敛到最优策略。

MATLAB 实现 Q-learning

下面是一个基于 MATLAB 的 Q-learning 示例,应用于一个 5x5 的网格世界(Grid World)。

clc; clear; close all;

% 参数设置
alpha = 0.1;  % 学习率
gamma = 0.9;  % 折扣因子
epsilon = 0.1; % 探索概率
numEpisodes = 500; % 训练回合数
numStates = 25; % 5x5 网格
numActions = 4; % 上、下、左、右
Q = zeros(numStates, numActions); % 初始化 Q 表

% 设定动作映射 (上=1, 下=2, 左=3, 右=4)
actionMap = [-5, 5, -1, 1];

% 训练 Q-learning 代理
for episode = 1:numEpisodes
    state = randi(numStates); % 随机初始化状态
    
    while state ~= 25  % 终止状态(假设25号格子是终点)
        if rand < epsilon  % 采取随机动作(探索)
            action = randi(numActions);
        else  % 采取贪心策略(利用)
            [~, action] = max(Q(state, :));
        end
        
        % 计算下一个状态
        nextState = state + actionMap(action);
        
        % 边界检查
        if nextState < 1 || nextState > numStates || ...
           (mod(state, 5) == 0 && action == 4) || ...
           (mod(state, 5) == 1 && action == 3)
            nextState = state;  % 保持不变
        end
        
        % 设定奖励函数
        if nextState == 25
            reward = 100;
        else
            reward = -1;
        end
        
        % 更新 Q 值
        Q(state, action) = Q(state, action) + alpha * ...
            (reward + gamma * max(Q(nextState, :)) - Q(state, action));
        
        % 更新状态
        state = nextState;
    end
end

% 显示最终 Q 值
disp('训练后的Q表:');
disp(Q);

Python 实现 Q-learning

Python 版本使用 numpy 和 gym 库,应用于 OpenAI Gym 的 FrozenLake 环境。

import numpy as np
import gym

# 创建环境
env = gym.make("FrozenLake-v1", is_slippery=False)

# 超参数
alpha = 0.1  # 学习率
gamma = 0.9  # 折扣因子
epsilon = 0.1  # 探索率
num_episodes = 500  # 训练回合数
num_states = env.observation_space.n
num_actions = env.action_space.n

# 初始化 Q 表
Q = np.zeros((num_states, num_actions))

# Q-learning 训练
for episode in range(num_episodes):
    state = env.reset()[0]  # 初始化状态
    done = False

    while not done:
        # 选择动作(ε-贪心策略)
        if np.random.uniform(0, 1) < epsilon:
            action = env.action_space.sample()  # 随机探索
        else:
            action = np.argmax(Q[state, :])  # 贪心策略

        # 执行动作
        next_state, reward, done, _, _ = env.step(action)

        # 更新 Q 值
        Q[state, action] = Q[state, action] + alpha * (
            reward + gamma * np.max(Q[next_state, :]) - Q[state, action]
        )

        # 更新状态
        state = next_state

# 显示最终 Q 表
print("训练后的 Q 表:")
print(Q)

# 评估学习效果
state = env.reset()[0]
env.render()

for _ in range(10):
    action = np.argmax(Q[state, :])  # 选择最佳动作
    state, _, done, _, _ = env.step(action)
    env.render()
    if done:
        break

参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2301338.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 多数据源时事务回滚问题

目录 问题描述 1、Atomikos事务管理器 2、MyBatis-Plus多数据源支持 dynamic-datasource 特性 约定 使用方法 mybatis-mate 特性 使用方法 问题描述 在多数据源的情况下&#xff0c;如果一个事务跨越多个数据源&#xff0c;当其中一个数据源的操作失败时&#xff0c;我…

使用html css js 开发一个 教育机构前端静态网站模板

这个教育机构网站模板是专为前端开发初学者设计的练习项目&#xff0c;适合正在学习前端的学生或自学者使用。网站内容包括首页、课程体系、师资力量、关于我们和联系我们等基础页面&#xff0c;帮助学习者熟悉网页布局、样式设计和交互功能的实现。 静态页面 简单截图 应用…

在IDEA的Maven中(同步所有Maven项目)和(重新加载所有Maven项目)的区别

特性同步所有 Maven 项目 (Sync All Maven Projects)重新加载所有 Maven 项目 (Reload All Maven Projects)主要作用使 IDEA 项目结构、依赖关系与 pom.xml 文件同步。强制重新读取所有 pom.xml 文件&#xff0c;并重建 IDEA 的 Maven 项目模型。缓存使用 IDEA 缓存的 Maven 项…

el-table树状表格,默认展开第一个节点的每一层

效果如图 <template><el-table:data"tableData"style"width: 100%":tree-props"{ children: children, hasChildren: hasChildren }":expand-row-keys"expandRowKeys"row-key"id"expand-change"handleExpan…

使用VSCODE开发C语言程序

使用vscode配置C语言开发环境 一、安装VSCODE 1、下载vscode ​ 从官方网站&#xff08;https://code.visualstudio.com/Download&#xff09;上&#xff0c;下载windows版本的vscode 2、安装vscode ​ 下载完毕后&#xff0c;按照提示进行安装即可&#xff08;尽可能不要安…

【数据结构初阶第十二节】设计循环队列

云边有个稻草人-CSDN博客 必须有为成功付出代价的决心&#xff0c;然后想办法付出这个代价。 还有最后一道关于队列的习题&#xff0c;这题有点难&#xff0c;准备好迎接挑战吧&#xff01; 目录 1.【题目】 2.实现循环队列推荐用数组&#xff0c;Why? 3.Q1&#xff1a;如…

【数据分享】1929-2024年全球站点的逐年降雪深度数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2024年全球气象站…

【强化学习的数学原理】第10课-Actor-Critic方法-笔记

学习资料&#xff1a;bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接&#xff1a;强化学习的数学原理 西湖大学 赵世钰 文章目录 一、最简单的Actor-Critic&#xff08;QAC&#xff09;二、Advantage Actor-Critic&#xff08;A2C&#xff09;三、重要性采样和…

scratch猜年龄互动小游戏 2024年12月scratch四级真题 中国电子学会 图形化编程 scratch四级真题和答案解析

scratch猜年龄互动小游戏 2024年12月电子学会图形化编程Scratch等级考试四级真题 一、题目要求 老爷爷的年龄是1-100的随机数,老爷爷询问“请猜猜我的年龄是多少?”,输入年龄,老爷爷会回答"大了"或者"小了,直到最后成功猜出年龄。 1、准备工作 (1)删…

java每日精进 2.13 MySql迁移人大金仓

1.迁移数据库 1. 数据库创建语句 MySQL&#xff1a; CREATE DATABASE dbname; 人大金仓&#xff08;Kingbase&#xff09;&#xff1a; 在人大金仓中&#xff0c;CREATE DATABASE 的语法通常相同&#xff0c;但可能需要特别注意字符集的指定&#xff08;如果涉及到多语言支持…

2025最新智能优化算法:改进型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23个经典函数测试集,MATLAB

一、改进型雪雁算法 雪雁算法&#xff08;Snow Geese Algorithm&#xff0c;SGA&#xff09;是2024年提出的一种新型元启发式算法&#xff0c;其灵感来源于雪雁的迁徙行为&#xff0c;特别是它们在迁徙过程中形成的独特“人字形”和“直线”飞行模式。该算法通过模拟雪雁的飞行…

Open WebUI项目源码学习记录(从0开始基于纯CPU环境部署一个网页Chat服务)

感谢您点开这篇文章:D&#xff0c;鼠鼠我是一个代码小白&#xff0c;下文是学习开源项目Open WebUI过程中的一点笔记记录&#xff0c;希望能帮助到你&#xff5e; 本人菜鸟&#xff0c;持续成长&#xff0c;能力不足有疏漏的地方欢迎一起探讨指正&#xff0c;比心心&#xff5e…

什么是Grok-3?技术特点,场景,潜在问题与挑战

Grok-3 的技术特点与优势 1. 超大算力与训练规模 算力投入:Grok-3 使用了 20 万块英伟达 H100 GPU,分两个阶段训练(第一阶段 10 万 GPU 训练 144 天,第二阶段 20 万 GPU 训练 92 天),总计算量是前代 Grok-2 的 10 倍。这种规模远超同期其他项目(如印度的 1.8 万 GPU 公…

JWT 令牌

目录 一、JWT 1、什么是JWT 2、JWT的组成 3、JJWT签发与验证token 1、创建token 2、解析token 3、设置过期时间 4、自定义claims 前言&#xff1a; 在现代Web应用和微服务架构中&#xff0c;用户身份验证和信息安全传输是核心问题。JSON Web Token&#xff08;J…

鼎捷PLM深度集成DeepSeek,领跑智能研发新赛道

新年伊始&#xff0c;DeepSeek以其卓越的性能、高性价比和开源优势&#xff0c;掀起一股AI技术应用热潮&#xff0c;重塑各行各业的知识管理、知识应用模式。对制造业来说&#xff0c;首当其冲的就是研发管理变革&#xff0c;这也引发了企业的深度思考&#xff1a;在工业领域的…

VMware新建虚拟机

看看自己的电脑是什么内核&#xff0c;有几个处理器 再分配给虚拟机 镜像文件需要自己安装下载地方https://mirrors.aliyun.com/centos/?spma2c6h.13651104.d-2001.8.3fb1320cuI1jeS 然后就出现了 然后开启虚拟机&#xff0c;等待 等待之后如下&#xff0c;选择语言 等待一段时…

使用iOS个人声音与SoVITS训练个人AI语音(10分钟快速上手)

使用iOS个人声音与SoVITS训练个人AI语音&#xff08;10分钟快速上手&#xff09; 序言&#xff1a;最近在抖音上频繁看到曼波唱歌的视频和各种AI语音的搞笑短片&#xff0c;加上年后新购置的M2硬盘终于提供了足够的存储空间&#xff0c;让我有机会深入研究AI语音训练。24年年初…

【JavaEE进阶】Spring MVC(3)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗 如有错误&#xff0c;欢迎指出~ 返回响应 返回静态页面 //RestController Controller RequestMapping("/response") public class ResponseController {RequestMapping("/returnHtmlPage&…

火语言RPA--Excel读取内容

【组件功能】&#xff1a;读取Excel内指定位置的内容或读取整篇Sheet页内容 配置预览 配置说明 读取位置 单元格&#xff1a;读取指定单元格中的内容。 行&#xff1a;读取指定行内容。 列&#xff1a;读取指定列内容。 区域&#xff1a;读取指定区域内容。 整篇sheet页&…

sass报错:[sass] Undefined variable. @import升级@use语法注意事项

今天创建vue3项目&#xff0c;迁移老项目代码&#xff0c;使用sass的时候发现import语法已经废弃&#xff0c;官方推荐使用use替换。 这里我踩了一个坑找半天的问题&#xff0c;原因是sass升级到1.85之后 定义变量前加上 - 就是表示变量私有&#xff0c;即使使用use导出 在新的…