(初探)强化学习路径规划的理论基础与代码实现
一、强化学习路径规划的核心理论
1.1 马尔可夫决策过程(MDP)框架
理论基础:
路径规划问题可以建模为马尔可夫决策过程(Markov Decision Process, MDP),由五元组(S, A, P, R, γ)定义。其中,S(状态空间)表示智能体所在的位置和环境信息(如坐标、传感器数据);A(动作空间)用于表示可执行的移动指令(如前进、转向);P(状态转移概率),我们通常使用P(s'|s,a)表示在状态s执行动作a后转移到状态s'的概率;R(奖励函数),用R(s,a,s')给出状态转移的即时奖励;γ(折扣因子)用于权衡当前奖励与未来奖励的重要性(通常取0.9-0.99)。
代码映射:
class GridWorldEnv(gym.Env):
def __init__(self):
self.state_space = [...] # S
self.action_space = [...] # A
self.transition_matrix = [...] # P
self.reward_function = [...] # R
self.gamma = 0.95 # γ
1.2 贝尔曼方程与价值函数
理论解释:
价值函数V(s)表示从状态s开始遵循策略π的预期回报:Vπ(s) = Eπ[∑γ^t R_t | S_0 = s]
贝尔曼方程给出了价值函数的递归形式:Vπ(s) = ∑π(a|s)∑P(s'|s,a)[R(s,a,s') + γVπ(s')]
代码实现:
# Q-learning更新规则 new_q = (1 - learning_rate) * current_q + \learning_rate * (reward + gamma * max_next_q)
二、Q-Learning算法深度解析
2.1 Q表学习原理
理论说明:
Q-learning是一种无模型(model-free)的时序差分(TD)算法,通过学习动作价值函数Q(s,a)来找到最优策略。更新规则为:Q(s,a) ← Q(s,a) + α[r + γ max_a' Q(s',a') - Q(s,a)]
其中α是学习率,γ是折扣因子。
代码细节:
def update_q_table(self, state, action, reward, new_state):
# 当前状态的Q值
current_q = self.q_table[state[0], state[1], action]
# 下一状态的最大Q值(最优未来价值)
max_next_q = np.max(self.q_table[new_state[0], new_state[1]])
# 应用Q-learning更新公式
new_q = (1 - self.lr) * current_q + \
self.lr * (reward + self.discount * max_next_q)
# 更新Q表
self.q_table[state[0], state[1], action] = new_q
2.2 探索-利用权衡
理论分析:
ε-greedy策略是平衡探索与利用的经典方法:
(1)以概率ε随机选择动作
(2)以概率1-ε选择当前最优动作
代码实现:
def get_action(self, state):
# 探索阶段:随机动作
if np.random.uniform(0, 1) < self.exploration_rate:
return self.env.action_space.sample()
# 利用阶段:选择Q值最高的动作
return np.argmax(self.q_table[state[0], state[1]])
参数设置建议:
-
初始ε:1.0(完全探索)
-
最终ε:0.01(基本不探索)
-
衰减率:0.995(每个episode衰减)
三、深度Q网络(DQN)技术详解
3.1 神经网络架构设计
理论背景:
DQN使用神经网络近似Q函数,解决传统Q-learning在高维状态空间的"维度灾难"问题。网络输入为状态,输出为各动作的Q值。
代码实现:
class DQN(nn.Module):
def __init__(self, input_shape, n_actions):
super().__init__()
# 卷积层提取空间特征
self.conv = nn.Sequential(
nn.Conv2d(input_shape[2], 32, kernel_size=3, stride=1),
nn.ReLU(),
nn.Conv2d(32, 64, kernel_size=3, stride=1),
nn.ReLU()
)
# 计算卷积输出尺寸
conv_out_size = self._get_conv_out(input_shape)
# 全连接层决策
self.fc = nn.Sequential(
nn.Linear(conv_out_size, 256),
nn.ReLU(),
nn.Linear(256, n_actions)
)
3.2 经验回放机制
理论意义:打破数据间的时序相关性;提高数据利用率;稳定训练过程
代码解析:
class ReplayBuffer:
def __init__(self, capacity):
self.buffer = deque(maxlen=capacity) # 固定大小的循环队列
def push(self, transition):
"""存储(s,a,r,s',done)五元组"""
self.buffer.append(transition)
def sample(self, batch_size):
"""随机采样一批经验"""
return random.sample(self.buffer, batch_size)
def __len__(self):
return len(self.buffer)
训练循环节选:
# 收集经验
state = env.reset()
action = agent.select_action(state)
next_state, reward, done, _ = env.step(action)
memory.push((state, action, reward, next_state, done))
# 从记忆中采样训练
if len(memory) > batch_size:
transitions = memory.sample(batch_size)
batch = Transition(*zip(*transitions))
# 计算当前Q值和目标Q值
current_q = model(batch.state).gather(1, batch.action)
next_q = target_model(batch.next_state).max(1)[0].detach()
expected_q = batch.reward + (1 - batch.done) * gamma * next_q
# 计算损失并反向传播
loss = F.mse_loss(current_q, expected_q.unsqueeze(1))
optimizer.zero_grad()
loss.backward()
optimizer.step()
四、奖励函数设计原则
4.1 多目标奖励设计
理论指导:
良好的奖励函数应:引导智能体快速到达目标;避免碰撞障碍物;鼓励高效路径;保持信号尺度合理
代码示例:
def calculate_reward(self, new_pos):
# 基础奖励组件
goal_reward = 10.0 if new_pos == self.goal_pos else 0.0
collision_penalty = -2.0 if self.obstacles[new_pos] else 0.0
# 距离奖励(鼓励靠近目标)
old_dist = np.linalg.norm(self.agent_pos - self.goal_pos)
new_dist = np.linalg.norm(new_pos - self.goal_pos)
distance_reward = (old_dist - new_dist) * 0.5
# 探索奖励(鼓励访问新区域)
visit_reward = 0.1 if new_pos not in self.visited else -0.05
self.visited.add(new_pos)
# 时间惩罚(鼓励快速决策)
time_penalty = -0.01
return goal_reward + distance_reward + collision_penalty + visit_reward + time_penalty
4.2 奖励塑形(Reward Shaping)
理论说明:通过添加中间奖励引导学习过程,潜在函数形式:
R' = R + γΦ(s') - Φ(s)
其中Φ是势能函数,通常设计为到目标的负距离。
代码实现:
def potential_function(self, pos):
"""势能函数:到目标的负距离"""
return -np.linalg.norm(pos - self.goal_pos)
def shaped_reward(self, old_pos, new_pos, base_reward):
potential = self.potential_function(new_pos)
old_potential = self.potential_function(old_pos)
return base_reward + self.gamma * potential - old_potential
相关文章:
(初探)强化学习路径规划的理论基础与代码实现
一、强化学习路径规划的核心理论 1.1 马尔可夫决策过程(MDP)框架 理论基础: 路径规划问题可以建模为马尔可夫决策过程(Markov Decision Process, MDP),由五元组(S, A, P, R, γ)定义。其中,S&…...
分布式链路ID实现
实现原理 api入口或者网关处生成traceId,调用服务时优先检查是否头部带有traceId,有则复用,没有则生成 实现方式 处理api相关traceId 1.通过filter复用或者生成traceId,并且将traceId输入到响应头中 import java.io.IOExcept…...
Java @Transactional事物隔离级别和默认值详解
在 Java 开发中,Transactional 注解是 Spring 框架中用于管理事务的重要工具。它提供了多种配置选项,其中事务隔离级别是一个关键属性。本文将深入探讨 Transactional 注解的隔离级别默认值,并通过具体代码示例帮助你更好地理解和应用事务隔离…...
ComputeShader绘制全屏纯色纹理
参考 Getting Started With Compute Shaders In Unity 环境 Win10 Unity20194.40 全屏纯色纹理示例 使用ComputerShader逐个像素设置颜色 ComputeShader脚本 设置纹理颜色 #pragma kernel CSMainRWTexture2D<float4> Result;//纹理 half4 solidColor;//颜色[numth…...
关于 MCP 的理论知识学习
文章目录 1. 写在最前面2. 基本概念2.1 Why MCP2.1.1 大模型访问的局限2.1.2 过渡阶段—Function Call2.1.3 当前阶段— MCP 3. 碎碎念4. 参考资料 1. 写在最前面 最近有一项任务是写旧版本迁移到新版本的支持文档,文档的编写是借助于 cursor 帮忙写的。但是实现的…...
关于vue+iview中tabs嵌套及实际应用
最近在用vueiview框架做项目,在实际做项目中根据需求用到iview中的tabs标签页嵌套以及标签页增加删除功能。想着记录下来,以后可能会再用到。下面是页面。由于是公司的项目具体有些地方我会打码,不影响阅读! 1607751577(1).jpg ta…...
26考研——输入/输出系统_I/O 方式_DMA 方式(7)
408答疑 文章目录 三、I/O 方式DMA 方式DMA 方式的特点DMA 控制器的组成DMA 的传送方式停止 CPU 访存周期挪用DMA 与 CPU 交替访存 示例分析DMA 的传送过程 DMA 方式和中断方式的区别 四、参考资料鲍鱼科技课件26王道考研书 三、I/O 方式 DMA 方式 DMA 方式是一种完全由硬件进…...
处理vue3热加载后axios的请求重复访问的问题
在请求拦截上加上判断,热加载时清空拦截器 if (import.meta.hot) { const interceptorsRe axios.interceptors.response.handlers; const interceptorsRq axios.interceptors.request.handlers; interceptorsRe .length 0; // 清空已有响应拦截器 interceptorsR…...
【教学类-102-21】蝴蝶三色图作品3——异型书蝴蝶“满格变形图”一页2图、一页4图
前期设计 将蝴蝶撑满整个单元格,满格变形图。确保蝴蝶图案最大化 【教学类-102-20】蝴蝶三色图作品2——卡纸蝴蝶“满格变形图”(滴颜料按压对称花纹、原图切边后变形放大到A4横版最大化)-CSDN博客文章浏览阅读572次,点赞7次,收藏3次。【教学类-102-20】蝴蝶三色图作品2…...
【昇腾】Benchmark
1. MindIE 服务化 1.1 环境准备 镜像传送门 参数说明: device用于挂载卡,下面的例子是挂载了8张卡 倒数第二行的镜像名称记得修改 docker run -itd --privileged --namemindie --nethost \--shm-size 500g \--device/dev/davinci0 \--device/dev/da…...
【阿里云大模型高级工程师ACP学习笔记】2.7 通过微调增强模型能力 (下篇)(⭐️⭐️⭐️ 重点章节!!!)
学习目标 特别说明:由于这一章节是2025年3月官方重点更新的部分,新增内容非常多,因此我不得不整理成上、下两篇,方便大家参考。 备考阿里云大模型高级工程师ACP认证时,深入钻研《2.7通过微调增强模型能力(下篇)》,期望达成以下目标: 掌握高效微调技术:深入理解预训练与…...
【RustDesk 】中继1:压力测试 Python 版 RustDesk 中继服务器
测试 Python 版 RustDesk 中继服务器 测试我们实现的中继服务器有几种方法,从简单到复杂依次如下: 1. 基本连接测试客户端 创建一个简单的测试客户端来验证中继服务器的基本功能: 2. 用两个测试客户端测试中继功能 要测试完整的中继功能,你需要运行两个客户端实例来模拟…...
MCP 自定义python实现server服务,支持离线调用和远程接口访问形式
参考: https://blog.csdn.net/lingding_cn/article/details/147355620 其他百炼、mcp服务网址支持链接访问 server服务代码: 出行酒店查询 mcp server代码编写参考:https://blog.csdn.net/weixin_42357472/article/details/146503660 api_mcp_server.py import pickle im…...
搭建PCDN大节点,服务器该怎么配
搭建P2P大节点时,服务器要怎么配呢?需要综合考虑硬件性能、网络带宽、存储能力、系统架构以及安全性等多个方面,以确保节点能够高效、稳定地运行。 一、硬件配置 CPU:选择高性能的多核处理器,以满足高并发处理需求。核…...
JavaScript的3D库有哪些?
JavaScript的3D库有哪些? 在3D开发领域,JavaScript提供了多种库和框架,使开发者能够在浏览器中创建丰富的3D体验。以下是一些流行的3D方面的JavaScript库: Three.js:这是最著名的用于创建3D图形的JavaScript库之一。它…...
如何解决matlab/octave画图legend图例颜色一样的问题?
预期目的: 本意想用legend在画图的时候把对应线段的颜色对应起来,实际按照如下代码运行得不到预期的结果。 x [1:10;11:20]y1 x.^2;y2 0.5.*x.^3plot(x,y1,r,x,y2,b);legend(y x^2,y x^3) 代码运行结果如下: 原因 是matlab /octave默…...
[第十五章][15.3.2 shellcode注入攻击]ret2shellcode+[NewStarCTF 公开赛赛道]ret2shellcode
1、[NewStarCTF 公开赛赛道]ret2shellcode IDA 反编译看伪代码: buf mmap((void *)0x233000, 0x1000uLL, 7, 34, -1, 0LL); 这里直接给了 buf 7 的权限,即可读可写可执行,那么 shellcode 肯定写到 buf 里 buf 的映射地址:0x23…...
边缘计算:数字世界的”末梢神经系统”解析-优雅草卓伊凡
边缘计算:数字世界的”末梢神经系统”解析-优雅草卓伊凡 一、边缘计算深度解析 1.1 边缘计算的定义与架构 边缘计算(Edge Computing)是一种分布式计算范式,它将数据处理能力从传统的集中式云数据中心推向网络边缘,更…...
基于CATIA参数化球体建模的自动化插件开发实践——NX建模之球体命令的参考与移植
引言 在CATIA二次开发领域,Python因其灵活性和丰富的库支持逐渐成为高效工具开发的首选语言。本文将以笔者开发的CATIA球体自动化建模工具为例,参考NX软件中高效球体创建命令,深度解析基于PySide6 GUI框架与pycatia接口库的集成…...
ActiveMQ 可靠性保障:消息确认与重发机制(一)
引言 在当今分布式系统的架构中,消息中间件扮演着举足轻重的角色,而 ActiveMQ 作为一款广泛使用的开源消息中间件,凭借其对 JMS(Java Message Service)规范的支持、多种消息传输协议、丰富的消息模型(如点对…...
麒麟、UOS系统在线打开word文件并提取修订痕迹
麒麟、UOS系统在线打开word文件并提取修订痕迹 查看本示例演示效果(Windows版) 查看本示例演示效果(国产版)本示例关键代码的编写位置,请参考“开始 - 快速上手”里您所使用的开发语言框架的最简集成代码 注意 本文中…...
Vue3笔记摘录
1.Vue3整体知识概览图 2.ref与reactive具体使用区别 2-1 基本类型处理 const count1 ref(0) 使用ref自动转化为数字类型const count2 reactive(0) 参数必须是对象类型 2-2 具体使用过程 // ref 处理对象(自动解包) const user ref({name: John,a…...
大力探索“AI·Life爱生活”项目峰会暨战略投资签约仪式成功举办
2025年4月26日,杭州西溪雷迪森大酒店内气氛热烈非凡,大力探索(杭州)科技有限公司主办的“大力探索项目峰会暨战略投资签约仪式”在此隆重开启。这场汇聚了数百位行业精英与企业代表的盛会,不仅是一场智慧的碰撞&#x…...
复刻低成本机械臂 SO-ARM100 材料齐活篇
视频讲解: 复刻低成本机械臂 SO-ARM100 材料齐活篇 打印件基本ok,总共12个,尴尬的是github又更新了so-101,不过看了下还好只是优化了走线和几个结构键,影响不大,大不了后面再重新打印(有3d打印机…...
解读 AI绘画工作流ComfyUI Stable Diffusion
ComfyUI 是什么?图像工作流又是什么? 认识ComfyUI 从名词术语来看: ComfyUI是一个基于节点流程的Stable Diffusion操作界面,通过自定义节点、拖拽连线实现精准的工作流定制,以完成更复杂的图像生成工作。 </...
北极星 新美团核销接口对接
美团吃相难看,东哥就应该干掉他 申请官方接口一般来说很难了 现在无非就是几种第三方开放出来的接口 按量收费,但是需要一次性充钱收首期的技术服务费 ,然后按年收费就是我们技术自己解决的方式,方便便宜 ,代码齐全,…...
理解数据库存储以及查询(集合)
理解数据库存储以及查询(集合) 基本概念定义 主键集合: 定义:主键集合是由数据库表中的主键组成的一个集合。主键是表中唯一标识每一行记录的属性(或属性组合)。 特性:主键集合包含表的主键属性…...
(Go Gin)Gin学习笔记(四)Gin的数据渲染和中间件的使用:数据渲染、返回JSON、浅.JSON()源码、中间件、Next()方法
1. 数据渲染 1.1 各种数据格式的响应 json、结构体、XML、YAML类似于java的properties、ProtoBuf 1.1.1 返回JSON package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {r : gin.Default()r.POST("/demo", func(res *gi…...
机器视觉橡胶制品检测的应用
橡胶制品在生产过程中易出现划痕、气泡、缺料、毛边、杂质嵌入等多种缺陷,这些缺陷往往微小且随机分布,人工检测不仅耗时,漏检率也居高不下。尤其在汽车密封件、医疗硅胶制品等高端领域,微米级的缺陷都可能导致产品失效࿰…...
JavaScript:从JS的执行机制到location对象
一、JS执行机制 (1)JS是单线程 JavaScript语言的一大特点就是单线程,也就是同一时间只能做一件事。因为JavaScript是为了处理页面中的用户交互,以及制作DOM二诞生的。比如我们对某个DOM元素进行添加和删除操作,这个不…...
Sigmoid函数简介及其Python实现
文章目录 一、Sigmoid 函数简介1. 数学公式2. 关键特性3. 应用场景 二、Python 实现1. 使用 math 库 (适用于单个数值)2. 使用 numpy 库 (适用于数值、列表、数组、矩阵)3. 使用 scipy.special.expit (数值稳定) 三、小结 一、Sigmoid 函数简介 Sigmoid 函数(也称为…...
全局事件总线EventBus的用法
全局事件总线 EventBus 在前端开发中是一种用于实现组件间通信的机制,适用于兄弟组件或跨层级组件间的数据传递。 1. 创建全局 EventBus 实例 在前端项目中,先创建一个全局的 EventBus 实例。在 Vue 中,可以通过创建一个新的 Vue 实例来实现…...
嵌入式Linux系统中的线程信号处理:策略与实践
在嵌入式Linux系统的开发中,多线程编程是提升系统性能和响应速度的重要手段。然而,多线程环境下的信号处理却是一个复杂且需要细致处理的问题。信号,作为进程间通信的一种机制,在嵌入式系统中常用于处理外部事件或中断。但在多线程…...
CCM/TCM在STM32中的含义和用途
CCM/TCM在STM32中的含义和用途 CCM(Core Coupled Memory)和TCM(Tightly Coupled Memory)是ARM架构中的特殊内存类型,它们都表示与CPU核心紧密耦合的内存区域。这些内存具有一些特殊特性,使其在某些应用场景…...
【网络原理】 《TCP/IP 协议深度剖析:从网络基础到协议核心》
文章目录 一、网络基础1. 认识IP地址概念作用格式组成子网掩码 2、认识Mac地址一跳一跳的网络数据传输 3. 网络设备及相关技术集线器:转发所有端口交换机:MAC地址转换表转发对应端口主机:网络分层从上到下封装主机&路由器:ARP…...
Windows系统编译支持GPU的llama.cpp
Windows系统编译支持GPU的llama.cpp git clone https://github.com/ggerganov/llama.cpp.git cd llama.cpp mkdir build cd buildcmake .. -G "Visual Studio 17 2022" -DGGML_CUDAON -DCMAKE_BUILD_TYPERelease -DCMAKE_CUDA_ARCHITECTURES"86"cmake --b…...
Unity编辑器扩展之导出项目中所有预制体中文本组件文字内容
一、最后导出的Excel文件效果如下图所示: 二、在Unity的Editor目录下,新建一个名为FindChineseInPrefabs的C#脚本,Copy以下代码到你新建的名为FindChineseInPrefabs的C#脚本中去,最后一定要保存文件哈。 using UnityEditor; using UnityEngine; using UnityEngine.UI; usi…...
高效管理远程服务器Termius for Mac 保姆级教程
以下是 Termius for Mac 保姆级教程,涵盖安装配置、核心功能、实战案例及常见问题解决方案,助你高效管理远程服务器(如Vultr、AWS等)。 一、Termius 基础介绍 1. Termius 是什么? 跨平台SSH客户端:支持Ma…...
WPF框架中常用算法
WPF框架中常用算法与实现 一、排序算法 1. 快速排序 (Quick Sort) 应用场景:大数据集合排序、性能敏感场景 public static void QuickSort(IList<int> list, int left, int right) {if (left < right){int pivotIndex Partition(list, left, r…...
【Java函数式编程-58】Java函数式编程深度解析
函数式编程(Functional Programming)作为一种编程范式,近年来在Java生态中获得了越来越多的关注和应用。自Java 8引入Lambda表达式和Stream API以来,函数式编程风格在Java开发中逐渐普及。本文将深入探讨Java中函数式编程的核心概念、实践技巧以及在实际…...
解决vscode cmake提示检测到 #include 错误
一、问题 cmake已经包含了动态库文件,依然提示“检测到 #include 错误。请更新 includePath。” 二、解决方案 Ctrl Shift P进入CPP编辑配置,然后在JSON中加入下面一行: "configurationProvider": "ms-vscode.cmake-tools&…...
Microsoft .NET Framework 4.8 离线安装包 下载
简介Microsoft .NET Framework 4.8 是对 Microsoft .NET Framework 4、4.5、4.5.1、4.5.2、4.6、4.6.1、4.6.2、4.7、4.7.1 和 4.7.2 的高度兼容的就地更新。 脱机程序包可用于因无法连接 Internet 而导致 Web 安装程序无法使用的情况。 此包比 Web 安装程序大,并且…...
部署若依项目到服务器遇到的问题
以下是本次部署遇到的问题及解决方法 1、问题:docker一直出现“> ERROR [internal] load metadata for docker.io/library/xxx“的问题 ERROR: failed to solve: openjdk:8-jdk-alpine: failed to resolve source metadata for docker.io/libran y/ope…...
Elasticsearch--自带“搜索引擎“的数据库
一、核心原理 1. 倒排索引(Inverted Index) 基本概念 将文档中的每个词条(term)映射到包含它的文档列表上,正如图书馆目录将关键词映射到书籍编号。工作流程 分词(Analysis):文本切…...
malloc的实现原理
malloc 是 C 语言中动态内存分配的核心函数,其实现原理涉及操作系统内存管理、数据结构和算法设计。以下是其核心实现原理的简化分析: 1. 内存池管理 基本思想:malloc 通过管理一个 内存池(堆)动态分配内存。操作系统…...
垃圾收集GC的基本理解
垃圾收集的基本理解 GC 的基本算法 标记清除 从根开始将可能被引用的对象用递归的方式进行标记(标记阶段),然后再从根开始将全部对象按顺序扫描一遍,将没有被标记的对象进行回收(清除阶段)。 大多数情况…...
JVM——Java的基本类型的实现
Java 基本类型在 JVM 中的实现 Java 作为一种广泛使用的编程语言,其在虚拟机(JVM)上的实现细节对于开发者来说至关重要。本文将详细讲解 Java 基本类型在 JVM 中的实现,去深入理解 Java 编程语言的底层工作机制。 Java 基本类型…...
临床回归分析及AI推理
在医疗保健决策越来越受数据驱动的时代,回归分析已成为临床医生和研究人员最强大的工具之一。无论是预测结果、调整混杂因素、建模生存时间还是理解诊断性能,回归模型都为将原始数据转化为临床洞察提供了统计学基础。 AI推理 然而,随着技术…...
Ubuntu 22.04 的 ROS 2 和 Carla 设置指南(其一)
重点介绍适用于 Ubuntu 22.04 的全面 ROS 2 和 Carla 设置指南。我们将首先安装 Terminator 终端,然后安装 ROS 2 依赖项,然后继续安装 ROS 2 Humble。接下来,我们将介绍如何在 Ubuntu 22.04 上安装 Carla,最后通过设置 Carla ROS…...
声明:个人从未主动把文章设置为仅vip可读
之前一直在公司忙就没看csdn这边,前几天朋友看到我的博客是仅vip可读我才发现这个 给我气笑了。。。不反馈默认同意。。。。 现在都已经改回来 写文章的初衷就是记录一下自己的学习过程,本来就是一些偏基础类的东西,还需要去买vip才能看就太…...