简单的强化学习举例

1,定义奖励函数

首先,需要根据具体的任务需求来定义奖励函数。例如,对于机器人导航任务,可以根据机器人与目标点的距离来定义奖励函数:

import numpy as npdef navigation_reward(robot_position, target_position):# 计算机器人当前位置与目标位置之间的欧几里得距离distance = np.linalg.norm(np.array(robot_position) - np.array(target_position))# 距离越近,奖励越高reward = -distancereturn reward

2. 集成奖励函数到环境中

在强化学习中,环境负责与智能体进行交互,并根据智能体的动作给出相应的奖励。通常,环境类会有一个 step 方法,该方法接受智能体的动作作为输入,并返回下一个状态、奖励、是否终止等信息

import numpy as npclass NavigationEnv: # 定义导航环境类def __init__(self):# 初始化机器人的起始位置和目标位置self.robot_position = np.array([0, 0]) # 机器人初始位置 (x=0, y=0)self.target_position = np.array([10, 10]) # 目标位置 (x=10, y=10)def step(self, action):# 核心逻辑:执行动作 → 更新状态 → 计算奖励 → 判断终止# 根据动作更新机器人的位置self.robot_position += action # 通过向量加法更新位置# 通过向量加法更新机器人位置。例如,若动作是 [2, 3],新位置为 (0+2, 0+3) = (2, 3)# 计算奖励reward = navigation_reward(self.robot_position, self.target_position)# 判断是否到达目标位置done = np.linalg.norm(self.robot_position - self.target_position) < 0.1# 返回下一个状态、奖励、是否终止等信息,返回四元组return self.robot_position, reward, done, {}

3. 在训练循环中使用奖励函数

在训练智能体时,需要在每个时间步调用环境的 step 方法,并根据返回的奖励来更新智能体的策略。以下是一个简单的训练循环示例:

代码分为三大部分:

  1. 环境 (NavigationEnv)

    • 状态:机器人的二维坐标
    • 动作:离散动作空间 (0 = 向右移动,1 = 向上移动)
    • 奖励:负距离 (-distance),鼓励机器人靠近目标
  2. 策略网络 (PolicyNetwork)

    • 输入:机器人当前位置 (二维向量)
    • 输出:两个动作的概率分布
    • 结构:两层全连接网络,使用 ReLU 激活和 softmax 输出
  3. 训练循环

    • 收集数据:每个 episode 收集状态、动作、奖励序列
    • 计算回报:使用折扣因子计算每个时间步的累积回报
    • 更新策略:通过最大化累积回报的对数概率来更新网络参数
# 修正后的完整代码
import numpy as np
import torch
import torch.optim as optimclass NavigationEnv:def __init__(self):self.reset() ## 初始化时直接调用reset方法def reset(self):self.robot_position = np.array([0.0, 0.0])self.target_position = np.array([10.0, 10.0])return self.robot_positiondef step(self, action):self.robot_position += action # # 执行动作(向量加法)distance = np.linalg.norm(self.robot_position - self.target_position)reward = -distance  # 简单奖励函数,奖励设计:距离越近奖励越高(负值越小)done = distance < 0.1 # 终止条件:距离目标小于0.1单位return self.robot_position, reward, done, {}class PolicyNetwork(torch.nn.Module):def __init__(self, input_size, output_size):super().__init__()self.fc1 = torch.nn.Linear(input_size, 128) # 输入层→隐藏层(128神经元)self.fc2 = torch.nn.Linear(128, output_size) # 隐藏层→输出层(动作维度)def forward(self, x):x = torch.relu(self.fc1(x)) # ReLU激活函数引入非线性 return torch.softmax(self.fc2(x), dim=-1) # 输出动作概率分布env = NavigationEnv()
policy_net = PolicyNetwork(2, 2) # 输入状态维度2,输出动作数2
optimizer = optim.Adam(policy_net.parameters(), lr=0.001) # 自适应学习率优化器
action_map = {0: np.array([1,0]), 1: np.array([0,1])} # 动作映射表 0向右移动1个单位,1向上移动1个单位
gamma = 0.99 #未来奖励折扣因子
for episode in range(1000): #训练1000轮state = env.reset()  # 重置环境done = Falserewards, states, actions = [], [], [] # 数据收集容器while not done:state_tensor = torch.FloatTensor(state) # 转为PyTorch张量probs = policy_net(state_tensor)        # 获取动作概率action_idx = torch.multinomial(probs, 1).item() # 按概率抽样动作action = action_map[action_idx]         # 转换为实际动作向量next_state, reward, done, _ = env.step(action)  # 环境反馈# 存储轨迹数据rewards.append(reward)                  states.append(state_tensor)actions.append(action_idx)state = next_state  # 状态更新# 计算累积回报returns = []cumulative = 0for r in reversed(rewards):             # 从最后一步反向计算cumulative = r + gamma * cumulative # 计算累积回报returns.insert(0, cumulative)       # 保持时序# 策略梯度更新optimizer.zero_grad()                   # 清空梯度for s, a, R in zip(states, actions, returns):prob = policy_net(s)                # 重新计算动作概率(需梯度)log_prob = torch.log(prob[a])       # 选择动作的对数概率loss = -log_prob * R                # 策略梯度损失loss.backward()                     # 反向传播累积梯度optimizer.step()print(f"Episode {episode}, Total Reward: {sum(rewards):.1f}")
  1. Episode 0

    • 初始位置 (0,0)

    • 随机选择动作:可能频繁撞墙(若未加边界约束)

    • 奖励约 -200(低效路径)

  2. Episode 500

    • 网络学会向目标方向移动

    • 路径呈现锯齿形(探索仍在进行)

    • 奖励提升至 -50

  3. Episode 1000

    • 稳定选择向右和向上动作

    • 直线接近目标,奖励接近 0

    • 成功收敛

优化方向建议

  1. 状态归一化:将坐标范围缩放到 [-1,1] 加速训练

  2. 经验回放:使用 deque 存储历史数据,随机采样更新

  3. 熵正则化:在损失函数中添加熵项鼓励探索

  4. Advantage Actor-Critic:引入价值函数估计优势值

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

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

相关文章

css背景相关

背景书写 background: url(src); // 注意&#xff1a;在写动态样式时&#xff0c;backgournd赋值格式错误&#xff0c;是不会在浏览器dom的style上显示的 // 但是可以创建不可见的img&#xff0c;预加载来提高性能背景也会加载图片资源 同img的src一样&#xff0c;background也…

opencascade.js stp vite 调试笔记

Hello, World! | Op enCascade.js cnpm install opencascade.js cnpm install vite-plugin-wasm --save-dev 当你不知道文件写哪的时候trae还是有点用的 ‘’‘ import { defineConfig } from vite; import wasm from vite-plugin-wasm; import rollupWasm from rollup/plug…

线程的一些事(2)

在java中&#xff0c;线程的终止&#xff0c;是一种“软性”操作&#xff0c;必须要对应的线程配合&#xff0c;才能把终止落实下去 然而&#xff0c;系统原生的api其实还提供了&#xff0c;强制终止线程的操作&#xff0c;无论线程执行到哪&#xff0c;都能强行把这个线程干掉…

BGP实验练习1

需求&#xff1a; 要求五台路由器的环回地址均可以相互访问 需求分析&#xff1a; 1.图中存在五个路由器 AR1、AR2、AR3、AR4、AR5&#xff0c;分属不同自治系统&#xff08;AS&#xff09;&#xff0c;AR1 在 AS 100&#xff0c;AR2 - AR4 在 AS 200&#xff0c;AR5 在 AS …

滑动窗口——将x减到0的最小操作数

题目&#xff1a; 这个题如果我们直接去思考方法是很困难的&#xff0c;因为我们不知道下一步是在数组的左还是右操作才能使其最小。正难则反&#xff0c;思考一下&#xff0c;无论是怎么样的&#xff0c;最终这个数组都会分成三个部分左中右&#xff0c;而左右的组合就是我们…

C++ RAII机制

RAII&#xff08;Resource Acquisition Is Initialization&#xff09;是一种编程范式&#xff0c;核心思想是&#xff1a;资源的生命周期与对象绑定——对象创建时获取资源&#xff0c;对象销毁时自动释放资源。这种机制通过构造函数和析构函数的配对执行&#xff0c;确保资源…

连续抵消解码器--Successive Cancellation decoder(SC 解码器)

在这里&#xff0c;我们来看一下&#xff08;Arikan&#xff0c;2009&#xff09;中提供的连续取消解码算法。 顾名思义&#xff0c;SC解码算法从u0开始按顺序解码比特。 冻结的比特节点总是被解码为0。 在解码ui时&#xff0c;根据以下规则使用由向量表示的可用比特来解码u…

suricata之规则去重

一、环境和背景 1.1 环境 OS: Ubuntu 22.04.5 LTS IDE: vscode suricata: suricata 7.0.5 1.2 背景 在添加规则时&#xff0c;为了给规则分类&#xff0c;将不同类别的规则写入不同的文件。 在规则加载时两条不同的规则却被认为是重复的&#xff0c;因此记录一下去重逻辑。…

vue vite 无法热更新问题

一、在vue页面引入组件CustomEmployeesDialog&#xff0c;修改组件CustomEmployeesDialog无法热更新 引入方式&#xff1a; import CustomEmployeesDialog from ../dialog/customEmployeesDialog.vue 目录结构&#xff1a; 最后发现是引入import时&#xff0c;路径大小写与目…

深入理解 Linux 权限控制机制

引言 在 Linux 系统中&#xff0c;权限控制是保障系统安全的核心机制。通过限制用户对文件和资源的访问&#xff0c;它能有效防止未授权操作&#xff0c;保护数据不被篡改或泄露。合理设置权限不仅有助于实现用户隔离和最小权限原则&#xff0c;还能降低系统被滥用或攻击的风险…

Oracle版本、补丁及升级(12)——版本体系

12.1. 版本体系 Oracle作为最流行的一款关系数据库软件产品,其拥有自己一套成熟的版本管理体系。具体版本体系以12c为分界线,前后版本体系分别不同。 ​​​​​​​12.1.1. 12c之前版本 12c之前的Oracle,版本共有5位阿拉伯数字组成,其中的每位数字,都有各自的含义,具…

Maven 中的 pom.xml 文件

目录标题 1、根标签 <project> 的直接子标签顺序​2、常见子标签内部顺序​2.1、<build> 标签内部顺序2.2、<dependencies> 标签内部顺序 3、modelVersion 为什么是 4.0.0 &#xff1f;4、<parent> 标签&#xff1f;​​4.1、为什么需要 <parent>…

方案精读:华为与中软-智慧园区解决方案技术主打胶片【附全文阅读】

该文档是华为与中软国际的智慧园区轻量化解决方案推介&#xff0c;主要面向园区管理者、运营者及相关企业决策人。其核心围绕园区痛点&#xff0c;阐述智慧园区的发展趋势。 方案涵盖综合安防、便捷通行、设备管理等多领域应用场景&#xff0c;通过智能视频监控、人脸识别、远程…

# KVstorageBaseRaft-cpp 项目 RPC 模块源码学习

KVstorageBaseRaft-cpp 项目 RPC 模块源码学习 。 一、项目简介 KVstorageBaseRaft-cpp 是一个基于 Raft 一致性算法实现的分布式 KV 存储系统&#xff0c;采用 C 开发。项目的核心目标是帮助开发者理解 Raft 原理和分布式 KV 存储的基本实现。RPC 模块是分布式系统通信的关…

TeledyneLeCroy在OFC2025 EA展台上展示了其400G/800G的全包围的测试解决方案,满足了UEC联盟和UALINK联盟的技术需求

Teledyne LeCroy在OFC 2025上的EA展台 在2025年3月26日至28日于美国圣地亚哥举办的OFC&#xff08;Optical Fiber Communication Conference and Exhibition&#xff09;展会上&#xff0c;全球领先的测试测量解决方案提供商Teledyne LeCroy隆重展示了其最新研发的800G网络测试…

新一代电动门“攻克”行业痛点,远峰科技打造“智能出入”新标杆

在2025上海国际车展期间&#xff0c;远峰科技举办了一场面向车企合作伙伴和媒体的智能汽车解决方案实车展示会。 在这其中&#xff0c;远峰科技的新一代电动门首次亮相&#xff0c;突破性的解决了行业普遍存在的“运行抖动不平顺”、“窄车位车门开度过小”、“障碍物识别不准…

WEB UI自动化测试之Pytest框架学习

文章目录 前言Pytest简介Pytest安装Pytest的常用插件Pytest的命名约束Pytest的运行方式Pytest运行方式与unittest对比主函数运行命令行运行执行结果代码说明 pytest.ini配置文件方式运行&#xff08;推荐&#xff09;使用markers标记测试用例 pytest中添加Fixture&#xff08;测…

机器学习简单概述

Chatgpt回答&#xff1a; 机器学习&#xff1a;机器学习是人工智能的一个分支&#xff0c;侧重于通过数据训练模型&#xff0c;使计算机能够根据数据进行预测、分类、回归等任务。它通过算法从历史数据中学习规律&#xff0c;然后在新数据上进行推断。机器学习包括多种算法&…

openjdk底层汇编指令调用(一)——汇编指令及指令编码基础

汇编指令 计算机在执行过程时只识别代表0或者1的电信号。因此为了让计算机能够执行则须向计算机输入一系列01构成的指令。 例如在x64平台下&#xff0c;0x53&#xff0c;二进制为01010011&#xff0c;表示将rbx寄存器中的值压栈。 但是&#xff0c;对于程序员而言&#xff0c;…

Python Day 22 学习

学习讲义Day14安排的内容&#xff1a;SHAP图的绘制 SHAP模型的基本概念 参考学习的帖子&#xff1a;SHAP 可视化解释机器学习模型简介_shap图-CSDN博客 以下为学习该篇帖子的理解记录&#xff1a; Q. 什么是SHAP模型&#xff1f;它与机器学习模型的区别在哪儿&#xff1f; …