20250408-报错:pre_state = state同更新现象

news2025/4/13 20:47:42

项目场景:

基于强化学习解决组合优化问题
在这里插入图片描述


问题描述

        # POMO Rollout
        state, reward, done = self.env.pre_step()
        # next_state = state
        with autocast():
            while not done:
                # 执行动作并获取新状态和奖励
                
                selected, prob = self.model(state)
                
                # 更新状态:因为·self.env.step(selected)之后会自动更新state
                # 为了解决克隆state问题构建一个新的函数方法(.clone())专门克隆state所有向量
                pre_state = state
                state, reward, done = self.env.step(selected)

                # 存储当前的动作概率(用于后续计算比率)
                prob_list = torch.cat((prob_list, prob[:, :, None]), dim=2)
                old_prob_list = torch.cat((old_prob_list, prob[:, :, None]), dim=2)

                print(f"Encoded nodes in forward: {reward.shape}")

                # 计算当前状态的值函数 V(s)
                value = self.model_critic(pre_state)
                # 计算下一个状态的值函数 V(s')
                next_value = self.model_critic(state)

                # 计算优势函数
                advantage = reward + (1 - done.to(torch.int)) * next_value - value             
pre_state = state

出现与目标相反的现象:pre_state = state目的是保存state的前一步数据,因为state, reward, done = self.env.step(selected)会更新state的值。但随着state的更新pre_state也会更新。


原因分析:

state是类似全局变量的参数,可能pre_statestate指着同一个地址,这导致state更新pre_state也更新。


解决方案:

使用.clone()操作将他们分开到两个地址中。
但要注意的是state = Step_State()。其中 Step_State()为多向量数据。

@dataclass
class Step_State:
    BATCH_IDX: torch.Tensor = None      #表示批次的索引 # shape: (batch, pomo)
    POMO_IDX: torch.Tensor = None       #表示 POMO 算法中的多智能体索引 # shape: (batch, pomo)
    selected_count: int = None          #表示当前已经选中的节点数量 # shape: (batch, pomo)
    load: torch.Tensor = None           #表示当前负载状态 # shape: (batch, pomo)
    current_node: torch.Tensor = None   #表示当前正在访问的节点编号 # shape: (batch, pomo)
    ninf_mask: torch.Tensor = None      #表示负无穷掩码    # shape: (batch, pomo, problem+1)
    

这里构建一个函数cloneStep_State()所有向量。

@dataclass
class Step_State:
    BATCH_IDX: torch.Tensor = None      #表示批次的索引 # shape: (batch, pomo)
    POMO_IDX: torch.Tensor = None       #表示 POMO 算法中的多智能体索引 # shape: (batch, pomo)
    selected_count: int = None          #表示当前已经选中的节点数量 # shape: (batch, pomo)
    load: torch.Tensor = None           #表示当前负载状态 # shape: (batch, pomo)
    current_node: torch.Tensor = None   #表示当前正在访问的节点编号 # shape: (batch, pomo)
    ninf_mask: torch.Tensor = None      #表示负无穷掩码    # shape: (batch, pomo, problem+1)
    
    def clone(self):
        # 克隆每个张量属性
        return Step_State(
            BATCH_IDX=self.BATCH_IDX.clone() if self.BATCH_IDX is not None else None,
            POMO_IDX=self.POMO_IDX.clone() if self.POMO_IDX is not None else None,
            selected_count=self.selected_count,  # 如果是整数,直接赋值即可
            load=self.load.clone() if self.load is not None else None,
            current_node=self.current_node.clone() if self.current_node is not None else None,
            ninf_mask=self.ninf_mask.clone() if self.ninf_mask is not None else None
        )

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

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

相关文章

如何在服务器里部署辅助域

辅助域(Additional Domain Controller,ADC)是指在现有的Active Directory(活动目录)架构中,新增一个或多个域控制器以提高目录服务的可用性和可靠性。以下是辅助域的定义、功能和应用场景的详细说明&#x…

GNSS有源天线和无源天线

区别 需要外部供电的就是有源天线,不需要外部供电的是无源天线。 无源天线 一般就是一个陶瓷片、金属片等,结构简单,成本低廉,占用空间及体积小,适合于强调紧凑型空间的导航类产品。 不需要供电,跟设备直…

欧税通香港分公司办公室正式乔迁至海港城!

3月20日,欧税通香港分公司办公室正式乔迁至香港油尖旺区的核心商业区海港城!左手挽着内地市场,右手牵起国际航道——这波乔迁选址操作堪称“地理课代表”! 乔迁仪式秒变行业大联欢!感谢亚马逊合规团队、亚马逊云、阿里国际站、Wayfair、coupang、美客多…

ETPNav:基于演进拓扑规划的连续环境视觉语言导航模型

1、现有工作的缺陷: 最近,出现了一种基于模块化航路点的方法的新兴趋势,该方法将复杂任务分为航路点生成、子目标规划和导航控制: (1)在每个决策循环中,代理使用预训练的网络来预测附近的几个…

Spring Cloud LoadBalancer负载均衡+算法切换

目录 介绍核心功能负载均衡启动两个支付服务订单模块引入依赖LoadBalanced 注解启动订单服务测试结果 负载均衡算法切换总结 介绍 Spring Cloud LoadBalancer 是 Spring Cloud 提供的客户端负载均衡解决方案,提供更现代化的 API 和更好的 Spring 生态系统集成。它支…

游戏引擎学习第210天

回顾并为今天的工作做准备 今天我们,进行一些编码工作。这部分的编码内容对那些对代码架构感兴趣的人非常有帮助,我认为今天的编码内容会很有教育意义,尤其是在展示一些代码转化的过程中,希望大家能够从中获得一些启发。 接下来…

UML类图综合实验三补档

1.使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数“M”,则返回一个Man对象,如果传入参数“W”,则返回一个Woman对象,用Java语言实现该场景。现需要增加一个新的Robot类,如果传入参数“R”&#…

WinForm真入门(11)——ComboBox控件详解

WinForm中 ComboBox 控件详解‌ ComboBox 是 WinForms 中一个集文本框与下拉列表于一体的控件,支持用户从预定义选项中选择或直接输入内容。以下从核心属性、事件、使用场景到高级技巧的全面解析: 一、ComboBox 核心属性‌ 属性说明示例‌Items‌下拉…

DeepSeek底层揭秘——《推理时Scaling方法》技术对比浅析

4月初,DeepSeek 提交到 arXiv 上的最新论文正在 AI 社区逐渐升温。 笔者尝试对比了“关于推理时Scaling”与现有技术,粗浅分析如下: 与LoRA的对比 区别: 应用场景:LoRA是一种参数高效微调方法,主要用于在…

Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(四)

Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(四) 对 Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(三)-CSDN博客 进行完善,注意完善 …

Adam优化器研究综述

摘要 Adam优化器(Adaptive Moment Estimation)是一种广泛应用于深度学习的优化算法,通过自适应学习率加速梯度下降过程。本文从Adam的定义、算法原理、优势与局限性、应用场景及变体等方面进行调研,结合学术文献和实践经验&#x…

在 macOS 上连接 PostgreSQL 数据库(pgAdmin、DBeaver)

在 macOS 上连接 PostgreSQL 数据库 pgAdmin 官方提供的图形化管理工具,支持 macOS。 下载地址:https://www.pgadmin.org/ pgAdmin 4 是对 pgAdmin 的完全重写,使用 Python、ReactJs 和 Javascript 构建。一个用 Electron 编写的桌面运行时…

2018年真题

数学基础 一、 (共4分)用逻辑符号表达下列语句(论域为包含一切事物的集合) 1、(2分)集合A的任一元素的元素都是A的元素 经过对图片文字的识别与逻辑分析,结果如下: 符号定义&…

Efficient Burst Raw Denoising:稳定噪声方差和分频率降噪

Efficient Burst Raw Denoising with Stabilization and Multi-Frequency Denoising Network Burst Raw Denoising必要性Burst Raw Image Denoising流程Main Contributions具体方法介绍集成noise priorCMOS sensor 噪声建模噪声变换(Variance stabilization&#xf…

mapbox进阶,使用本地dem数据,加载hillshade山体阴影图层

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️hillshade 山体阴影图层 api1.3.1 ☘️…

【C++】Stack Queue 仿函数

📝前言: 这篇文章我们来讲讲STL中的stack和queue。因为前面我们已经有了string、vector和list的学习基础,所以这篇文章主要关注一些stack和queue的细节问题,以及了解一下deque(缝合怪)和priority_queue &am…

代码随想录_单调栈

代码随想录_单调栈 739.每日温度 739. 每日温度 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,…

BoostSearch搜索引擎项目 —— 测试用例设计 + web自动化测试代码

web自动化代码: https://gitee.com/chicken-c/boost-search/tree/master/AutoTest

【Ansible自动化运维】一、初步了解,开启自动化运维之旅

在当今数字化时代,随着企业 IT 基础设施规模的不断扩大,传统的手工运维方式逐渐显得力不从心。自动化运维技术应运而生,其中 Ansible 凭借其简洁易用、功能强大的特点,成为众多运维工程师和开发人员的首选工具。本篇文章将从基础概…

条件概率、概率乘法公式、全概率公式和贝叶斯 (Bayes) 公式

定义 设 P ( A ) > 0 P(A) > 0 P(A)>0,若在随机事件 A A A发生的条件下随机事件 B B B发生的概率记作 P ( B ∣ A ) P(B|A) P(B∣A),定义 P ( B ∣ A ) P ( A B ) P ( A ) P(B|A) \frac{P(AB)}{P(A)} P(B∣A)P(A)P(AB)​ 则称 P ( B ∣ A ) …