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

Universal Value Function Approximators 论文阅读(强化学习,迁移?)

前言

Universal Value Function Approximators 个人实现(请大佬指正)

*关于UVFA如何迁移的问题,这也是我为什么反复看这篇文章的原因,我觉值函数逼近的最大用法就是如何迁移,如果仅仅是更改值函数的结构,这没有太大意义。但是从面前理解来看并没有回答好如何迁移这个问题 我想把思路给各位学者分享也请给我学者为我指正

Universal Value Function Approximators这篇论文我分别两次去阅读它,以下是两次大致的理解:

第一次:文章中心意思是训练一个网络作为一个奖励生成器(有点像装配网络中的SVM)但是呢,这个生成器呢是用来代替价值网络的又不是显示的外部环境生成器(就不像装配网络中那个svm)。我觉着难点是如何去训练,输入它说了是环境s和目标g(这里以棋盘为例估计就是xy坐标s和当前距离g)(用有监督或者强化学习框架(强化学习框架获得与我想法类似)),怎么取获取这些数据,复杂的环境又该怎么办。还有这个训练好如何和强化学习嵌入也是的麻烦的事?

文章注重了价值函数的作用,但是如何获得是个麻烦事

获得之后,他是提取了这个UVF用于迁移和嵌入指导这和我论文想法类似

第二次:这篇论文确实想训练一个和svm类似的东西,其输入是状态g和伪奖励g(是由子目标提供的)。但是训练好后是想将UVF嵌入DQN这类强化学习主框架的,如何嵌入?目前看是生成和子目标相关的价值函数V来更新UVF本身,然后构建关于子目标的与V相关的Q来更新主网络DQN。(但是如何与DQN结合呢?)

   两次独立的阅读,我都把UVF看成了独立于经典(比如DQN)以外的模块,这是因为它提供了完整的监督学习的路子,和不完整的强化学习训练UVF的描述以及可以进行迁移学习的描述(但都没有给完整的介绍,所以很多细节靠猜),这就让我认为UVF是个独立的模块可以用监督学习和强化学习来训练它,然后再嵌入回强化学习以此来进行状态迁移。后面反应过来不是这样的,因为我在全文实在看不到除了文章新定义的Q(s, a, g)外的其它Q(s, a,),所以我决定跳出把他作为单独模块来看的思路。

思路的改变需要注意以下几条问题的澄清:

1、 Q ( s , a , g ) Q(s, a, g) Q(s,a,g)就是UVFA为整个强化学习构建的而不是它自己,UVFA也在共享,我们全文以DQN为例:

D Q N U V F A = ( r + γ ⋅ m a x a ′ Q ( s ′ , a ′ , g ) − Q ( s , a , g ) ) 2 DQN_{UVFA}= (r + γ·max_a' Q(s', a', g) - Q(s, a, g))² DQNUVFA=(r+γmaxaQ(s,a,g)Q(s,a,g))2
传统的DQN更新:
D Q N = ( r + γ ⋅ m a x a ′ Q ( s ′ , a ′ ) − Q ( s , a ) ) 2 DQN= (r + γ·max_a' Q(s', a') - Q(s, a))² DQN=(r+γmaxaQ(s,a)Q(s,a))2
   从第一条信息可以看出,如果将UVFA看做DQN的一部分,其实问题就简单了,只不过是引入了一个关于g的奖励来更新Q(后面我会根据个人想法来给出代码段)。

2、 澄清下文中提到的第一个是通过监督学习进行学习的classical grid-world with 4 room也就是图4来探讨的下文章的实验过程。图4中的左图和中图似乎是UVFA输出的可视化?按道理UVFA输出的是一个具体的值,我不太清楚这是如何可视化的(问题1)。中文提到UVFA的输入是状态s(在这里我觉是grid-world with 4 room的坐标)和目标g(应该是图像中的坐标),那么grid-world with 4 room这个实验中subgoal是在像素中随机取点吗?既然有subgoal那么全局的目标又是什么,两者什么关系,还有图4中提到了subgoal后文也提到了UVFA的迁移,在grid-world with 4 room怎么实现迁移,从哪里迁移到哪里(问题2)?

  问题1是对于实验设置的问题 D Q N U V F A DQN_{UVFA} DQNUVFA需要状态 s s s g g g,后者文中明确说明是网格坐标点,前者也提到是坐标点,但我很疑惑如果s是具体坐标如何是智能体知道图中的墙壁和门?所以我只能把他理解为用可以表示坐标的矩阵。可视化的问题,我有两个猜测可能是输出的V(s,g)是与grid-world同等尺寸的矩阵,矩阵中的值做成了可视化的热力图,然后最大化V转为Q(s,a,g) = r(s,a) + γ·(V(s’,g))最大(可能性小);还有一种理解。在 4-room grid-world 里,状态 s 和目标 g 都对应网格中的一个方格坐标。UVFA 给出的输出是一个标量价值 (V(s,g))。在 4-room grid-world 里,状态 s 和目标 g 都对应网格中的一个方格坐标。可视化的做法就是:

  1. 固定一个目标 g*(比如右上角的某个方格),
  2. 所有可能的状态 s (即每一个方格)依次输入网络,得到对应的 V θ ( s , g ∗ ) V_\theta(s,g^*) Vθ(s,g)
  3. 把这些标量值填回到对应的方格里,用热力图(colormap)或灰度图显示。
    • 左图:真值函数 V t r u e ( s , g ∗ ) V_{\mathrm{true}}(s,g^*) Vtrue(s,g)
    • 中图:拟合出的 V θ ( s , g ∗ ) V_\theta(s,g^*) Vθ(s,g)

  问题2 关于UVFA如何迁移的问题,这也是我为什么反复看这篇文章的原因,我觉值函数逼近的最大用法就是如何迁移,如果仅仅是更改值函数的结构,这没有太大意义。 但是从面前理解来看并没有回答好如何迁移这个问题。在 UVFA 里,「迁移(transfer)」其实就是利用在一组目标上学到的知识,来帮助对另一组目标(甚至是完全没见过的目标)做出合理的价值估计或更快地学习——这在强化学习里就对应于“零样本”或“少样本”地对新任务的泛化/适应。这一点与文中的泛化性测试(文中图8)很像,至少我目前看不到不同。这与我想象的迁移工作还是很有很大差距的(或许可以迁移到房间更多的地图上,如果仅仅是目标点的重新设定这个种似乎谈不上是迁移)。另外还有子目标和全局目标的问题,文中的正文中并没有提到两者的联系,甚至是混用的,比如图4中出现了subgoal但是正文中的描述还是g(目标),这其实和迁移的理解是有关联的。如果仅仅是泛化性测试(文中图8)的所谓的‘迁移’,那么subgoal与g就是一个东西所以应该作者的初衷是可以拓展的,subgoal是当前的目标点,全局目标就是更远的更复杂的坐标点(但是目前没有看到)。

3、论文中还提到了用强化学习来训练UVFA,这里我有个问题UVFA本身就是嵌入在强化学习算法中,比如说在论文附件中使用DQN来玩Ms Pacman,所以我的理解是Reinforcement Learning Experiments用强化学习来训练UVFA可以任务是用具有UVFA的DQN在MS Pacman这个游戏上做测试,不知道我的理解里否正确

  所以"用强化学习来训练UVFA"实际上是指:使用标准的强化学习算法(如DQN)来训练具有UVFA架构的价值网络,而不是先用监督学习训练UVFA然后再插入到强化学习算法中。
在这种情况下,UVFA不是独立于强化学习算法的组件,而是被整合到算法中,成为其核心部分。这使得智能体可以在与环境交互的过程中直接学习通用价值函数,而无需预先计算真实价值。(这里是对我前两次阅读的思路的澄清)

4、按我对MS Pacman游戏应的规则和具有UVFA的DQN的理解,这个实验的设置应该是应该是Ms. Pac-Man躲避敌人吃尽可能多的豆子设置一个关于豆子数量的得分相关的奖励,在每次执行一个动作后(这里应该是上下左右)计算一次这个奖励,最后是奖励换算成Q值求Q值最大。但是在用具有UVFA的DQN在MS Pacman这个游戏上测试的过程由于引入了子目标和目标gi,文中还额为提到When the subgoal is achieved, the environment is reset, Pacman’s position is set to a random location, and a new episode begins. 这让我有点无法与“我对MS Pacman游戏应的规则和具有UVFA的DQN的理解”相互对应。(用具有UVFA的DQN在MS Pacman这个游戏上做测试,这个实验过程我有一点疑问,MS Pacman游戏应的规则应该是Ms. Pac-Man躲避敌人吃尽可能多的豆子,但是在论文附件中提到Each demon uses a variant of Deep Q-Learning with … to learn the value functions with respect to its subgoal. 这里的demon 是指敌人吗还是Pac-man如果是pac-man不是一局游戏只有一个吗。而且这里又提到了子目标,请问这里的子目标和目标gi的关系是什么,在更新Q值时除了pseudo-reward还有其他reward吗)

   这也是我前两次无解的原因之一,因为我一直以为这个实验的最终目的是吃尽可能多的豆子(每个"demon"是一个负责学习特定子目标价值函数的独立DQN实例并不是游戏中的敌人,也不是多个Pac-Man (游戏中确实只有一个Pac-Man角色)),而伪奖励(Pseudo-reward)只是子任务,会有进行迁移然后完成最终任务,但是我自始至终没有看到相关描述,所以这里的迁移很可能只是测试验证泛化性的那种意思!
   MS Pacman的游戏的设定在这里也改了:
在标准Ms. Pacman游戏中:

  • Pac-Man需要吃掉所有豆子同时避开敌人
  • 游戏持续到Pac-Man失去所有生命或清空关卡
  • 奖励基于吃豆子、能量豆和幽灵获得的分数

但在UVFA的实验设置中,研究者做了重要修改:

  1. 单一子目标训练

    • 每个训练回合只关注一个特定豆子位置(子目标)
    • 当Pac-Man达到该豆子位置时,回合结束并重置
    • 这与标准游戏规则不同,标准游戏中吃到一个豆子后游戏继续
  2. 目标是学习到达特定位置的能力

    • 实验不是为了学习完整的Ms. Pacman游戏策略
    • 而是学习"如何从任意位置到达任意豆子位置"的通用导航能力
  3. 环境重置机制

    • "When the subgoal is achieved, the environment is reset…"这句话表明这是一个修改过的训练框架
    • 每次达成子目标后就重置环境,放置Pac-Man在随机位置,开始新回合
    • 这样设计是为了收集大量不同起始位置到特定目标的轨迹

这种设置与你原本对Ms. Pacman的理解不同,因为:

  • 不是在玩完整的游戏
  • 每个回合只关注一个特定豆子
  • 实验的核心是学习从任意位置到任意豆子位置的导航策略

这种实验设计允许UVFA学习一个通用映射:从任何状态s到任何目标位置g的价值函数。一旦学习完成,UVFA就可以用来指导Pac-Man从任何位置高效地导航到游戏中的任何豆子位置。

这是一个为了验证UVFA能力而设计的受控实验,而不是直接应用于标准游戏规则的完整实现。

澄清完这4点以后,最大的问题也可以回答了,这篇文章确实没有提到正儿八经的迁移问题(我理解的迁移以 MS Pacman为例是,获得任意区域的豆子是子任务,到完成整个吃豆子的任务才是迁移,或者是完成一个简单的动作,然后可课程学习一样迁移到完成一个复合动作),文章的迁移更像是 MS Pacman或grid-world with 4 rooms完成了A,B地图随机点的到达任务,然后再A.B地图中随机一个点,他也可以到达(泛化性测试),也许可能能迁移到不同地图的不同坐标点,但是文章没有明确说,只是提到unseen goals。

代码:

目前看来UVFA只是修改了值函的求解部分,将强化学习的表达进行了修改,那么用TD更新和Horde没啥差别,代码如下:

也可能我理解错误,因为这篇文章被很多博客在介绍解读技术细节,但我的理解只是改变了V值。

"""
UVFA-DQN for CartPole EnvironmentTask setup:
- State s: 4-dimensional vector [x, x_dot, theta, theta_dot] representing cart position, velocity, pole angle, and angular velocity.
- Goal g: a scalar desired cart horizontal position in the range [-2.4, 2.4]. Each episode trains the agent to reach a sampled subgoal.
- Reward function:r = +1 if |x' - g| < 0.1, else r = -|x' - g|; encourages the agent to move the cart toward g.
- Multi-task training: train_goals is a set of subgoals sampled during training; test_goals are held-out positions for zero-shot transfer evaluation.
"""
import random
import gym
import numpy as np
import collections
import torch
import torch.nn.functional as F
from tqdm import tqdmdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")class ReplayBufferUVFA:"""Replay buffer storing (state, action, reward, next_state, done, goal)"""def __init__(self, capacity):self.buffer = collections.deque(maxlen=capacity)def add(self, state, action, reward, next_state, done, goal):self.buffer.append((state, action, reward, next_state, done, goal))def sample(self, batch_size):batch = random.sample(self.buffer, batch_size)s, a, r, s2, d, g = zip(*batch)return (np.array(s),np.array(a),np.array(r, dtype=np.float32),np.array(s2),np.array(d, dtype=np.float32),np.array(g, dtype=np.float32))def size(self): return len(self.buffer)class QNetUVFA(torch.nn.Module):#单流结构"""UVFA Q-network: takes state and goal as input"""def __init__(self, state_dim, goal_dim, hidden_dim, action_dim):super().__init__()self.fc1 = torch.nn.Linear(state_dim + goal_dim, hidden_dim)self.fc2 = torch.nn.Linear(hidden_dim, action_dim)def forward(self, state, goal):# state: [B, state_dim], goal: [B, goal_dim]x = torch.cat([state, goal], dim=1)x = F.relu(self.fc1(x))return self.fc2(x)#svd分解那套,我没有加到网络中,感觉这个在网络结构中可有可无
# def svd_embedding(training_goals):
#        # Step 1: Compute value functions for training goals
#     M = np.zeros((env.num_states, len(training_goals)))
#     for g_idx, g in enumerate(training_goals):
#         V = value_iteration(env, g)
#         M[:, g_idx] = V#     # Step 2: Perform matrix factorization using SVD (rank=5)
#     rank = 5
#     U, S, Vt = np.linalg.svd(M, full_matrices=False)
#     phi = U[:, :rank]  # State embeddings
#     psi = (np.diag(S[:rank]) @ Vt[:rank, :]).T  # Goal embeddings#     # Step 3: Train goal embedding network
#     goal_features = np.array(training_goals) / (env.size - 1)  # Normalize to [0,1]
#     goal_features = torch.from_numpy(goal_features).float()
#     psi_targets = torch.from_numpy(psi).float()#     return psi_targets# # Value iteration to compute V(s) for a goal
# def value_iteration(env, g, theta=1e-6):
#     V = np.zeros(env.num_states)
#     while True:
#         delta = 0
#         for s_idx, s in enumerate(env.states):
#             v = V[s_idx]
#             max_q = -np.inf
#             for a in env.actions:
#                 s_next = env.get_next_state(s, a)
#                 s_next_idx = env.states.index(s_next)
#                 r = env.get_reward(s, a, s_next, g)
#                 q = r + env.gamma * V[s_next_idx]
#                 max_q = max(max_q, q)
#             V[s_idx] = max_q
#             delta = max(delta, abs(v - V[s_idx]))
#         if delta < theta:
#             break
#     return V# # UVFA Embedding Networks
# class StateEmbeddingNet(torch.nn.Module):
#     def __init__(self, state_dim, hidden_dim, embed_dim):
#         super(StateEmbeddingNet, self).__init__()
#         self.fc1 = torch.nn.Linear(state_dim, hidden_dim)
#         self.fc2 = torch.nn.Linear(hidden_dim, embed_dim)#     def forward(self, x):
#         x = F.relu(self.fc1(x))
#         return self.fc2(x)# class GoalEmbeddingNet(torch.nn.Module):
#     def __init__(self, goal_dim, hidden_dim, embed_dim):
#         super(GoalEmbeddingNet, self).__init__()
#         self.fc1 = torch.nn.Linear(goal_dim, hidden_dim)
#         self.fc2 = torch.nn.Linear(hidden_dim, embed_dim)#     def forward(self, x):
#         x = F.relu(self.fc1(x))
#         return self.fc2(x)# class QNetUVFA(torch.nn.Module):#双流结构没调试
#     """UVFA Q-network: takes state and goal as input"""
#     def __init__(self, state_dim, goal_dim, hidden_dim, embed_dim):
#         super().__init__()
#         self.fc1 = GoalEmbeddingNet(goal_dim, hidden_dim, embed_dim)
#         self.fc2 = StateEmbeddingNet(goal_dim, hidden_dim, embed_dim)class UVFADQN:"""Conditional DQN (UVFA) agent that inputs state and goal"""def __init__(self, state_dim, goal_dim, hidden_dim, action_dim,lr, gamma, epsilon, target_update):self.gamma = gammaself.epsilon = epsilonself.count = 0self.target_update = target_updateself.q_net = QNetUVFA(state_dim, goal_dim, hidden_dim, action_dim).to(device)self.target_q = QNetUVFA(state_dim, goal_dim, hidden_dim, action_dim).to(device)self.target_q.load_state_dict(self.q_net.state_dict())self.opt = torch.optim.Adam(self.q_net.parameters(), lr=lr)def select_action(self, state, goal):if random.random() < self.epsilon:return random.randrange(self.q_net.fc2.out_features)s = torch.tensor(state, dtype=torch.float32, device=device).unsqueeze(0)g = torch.tensor([[goal]], dtype=torch.float32, device=device)q = self.q_net(s, g)return q.argmax().item()def update(self, buffer, batch_size):s, a, r, s2, done, g = buffer.sample(batch_size)states = torch.tensor(s, dtype=torch.float32, device=device)actions = torch.tensor(a, dtype=torch.int64, device=device).unsqueeze(1)rewards = torch.tensor(r, dtype=torch.float32, device=device).unsqueeze(1)next_states = torch.tensor(s2, dtype=torch.float32, device=device)dones = torch.tensor(done, dtype=torch.float32, device=device).unsqueeze(1)goals = torch.tensor(g.reshape(-1,1), dtype=torch.float32, device=device)# Q(s,g,a)q_values = self.q_net(states, goals).gather(1, actions)# target: r + gamma * max_a' Q_target(s',g,a')with torch.no_grad():next_q = self.target_q(next_states, goals).max(1)[0].unsqueeze(1)q_target = rewards + self.gamma * next_q * (1 - dones)loss = F.mse_loss(q_values, q_target)self.opt.zero_grad()loss.backward()self.opt.step()if self.count % self.target_update == 0:self.target_q.load_state_dict(self.q_net.state_dict())self.count += 1def train_uvfa(env, agent, buffer, train_goals, num_episodes,minimal_size, batch_size):"""Train UVFA-DQN: sample a subgoal each episode for multi-task learning"""returns = []for ep in tqdm(range(num_episodes)):state = env.reset()# sample a subgoal for this episodegoal = float(random.choice(train_goals))ep_ret = 0done = Falsewhile not done:action = agent.select_action(state, goal)next_state, _, done, _ = env.step(action)# define reward based on distance to goal (scalar comparison)dist = abs(next_state[0] - goal)reward = 1.0 if dist < 0.1 else -distbuffer.add(state, action, reward, next_state, done, goal)state = next_stateep_ret += rewardif buffer.size() > minimal_size:agent.update(buffer, batch_size)returns.append(ep_ret)return returnsdef zero_shot_eval(env, agent, test_goals, episodes=20):"""Zero-shot transfer evaluation: directly test trained UVFA-DQN on unseen goals (no parameter updates)"""results = {}for g in test_goals:total = 0for _ in range(episodes):s = env.reset()done = Falseep_r = 0goal = float(g)while not done:a = agent.select_action(s, goal)s, _, done, _ = env.step(a)dist = abs(s[0] - goal)r = 1.0 if dist < 0.1 else -distep_r += rtotal += ep_rresults[goal] = total / episodesreturn resultsif __name__ == '__main__':env = gym.make('CartPole-v0')state_dim = env.observation_space.shape[0]goal_dim = 1action_dim = env.action_space.n# UVFA hyperparameterslr = 2e-3gamma = 0.98epsilon = 0.05target_update = 10buffer_size = 10000minimal_size = 500batch_size = 64num_episodes = 500# define training and zero-shot test goalstrain_goals = np.linspace(-2.0, 2.0, 5)test_goals = np.linspace(-1.5, 1.5, 3)buffer = ReplayBufferUVFA(buffer_size)agent = UVFADQN(state_dim, goal_dim, hidden_dim=128,action_dim=action_dim,lr=lr, gamma=gamma,epsilon=epsilon, target_update=target_update)# Train on multi-task subgoalstrain_uvfa(env, agent, buffer, train_goals,num_episodes, minimal_size, batch_size)# Zero-shot transfer evaluation (unseen goals)zs_results = zero_shot_eval(env, agent, test_goals)print("Zero-shot transfer returns:", zs_results)

相关文章:

Universal Value Function Approximators 论文阅读(强化学习,迁移?)

前言 Universal Value Function Approximators 个人实现&#xff08;请大佬指正&#xff09; *关于UVFA如何迁移的问题&#xff0c;这也是我为什么反复看这篇文章的原因&#xff0c;我觉值函数逼近的最大用法就是如何迁移&#xff0c;如果仅仅是更改值函数的结构&#xff0c;…...

论文阅读:2024 arxiv HybridFlow: A Flexible and Efficient RLHF Framework

https://www.doubao.com/chat/3875396379023618 HybridFlow: A Flexible and Efficient RLHF Framework https://arxiv.org/pdf/2409.19256 https://github.com/volcengine/verl 速览 这篇论文主要介绍了一个名为HybridFlow的新型框架&#xff0c;旨在提升大语言模型&…...

WPF实现多语言切换

WPF实现多语言切换完整指南 一、基础实现方案 1. 资源文件准备 首先创建不同语言的资源文件: Resources/ ├── Strings.resx // 默认语言(英语) ├── Strings.zh-CN.resx // 简体中文 └── Strings.ja-JP.resx // 日语 ​​Strings.resx​​ (默认英…...

wpf操作主流数据

WPF 操作主流数据库详解 WPF(Windows Presentation Foundation)应用程序经常需要与数据库交互以实现数据的持久化和展示。主流的关系型数据库包括 ​​SQL Server​​、​​MySQL​​、​​PostgreSQL​​ 和 ​​SQLite​​。本文将详细介绍如何在 WPF 应用程序中使用这些主…...

Docker Compose--在Ubuntu中安装Docker compose

原文网址&#xff1a;Docker Compose--在Ubuntu中安装Docker compose_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍如何在Ubuntu中安装docker compose。 docker-compose是用于管理Docker的&#xff0c;相对于单纯使用Docker更方便、更强大。 如果还没安装docker&#xf…...

推荐几个免费提取音视频文案的工具(SRT格式、通义千问、飞书妙记、VideoCaptioner、AsrTools)

文章目录 1. 前言2. SRT格式2.1 SRT 格式的特点2.2 SRT 文件的组成2.3 SRT 文件示例 3. 通义千问3.1 官网3.2 上传音视频文件3.3 导出文案 4. 飞书妙记4.1 官网4.2 上传音视频文件4.3 导出文案4.4 缺点 5. VideoCaptioner5.1 GitHub地址5.2 下载5.2.1 通过GitHub下载5.2.2 通过…...

驱动汽车供应链数字化转型的标杆解决方案:全星研发项目管理APQP软件系统:

全星研发项目管理APQP软件系统&#xff1a;驱动汽车供应链数字化转型的标杆解决方案 一、行业痛点与转型迫切性 在汽车行业电动化、智能化浪潮下&#xff0c;主机厂对供应链企业的APQP&#xff08;先期产品质量策划&#xff09;合规性、开发效率及体系化管理能力提出严苛要求。…...

PyTorch数据加载与预处理

数据加载与预处理详解 1. 数据集类(Dataset和DataLoader) 1.1 Dataset基类 PyTorch中的Dataset是一个抽象类&#xff0c;所有自定义的数据集都应该继承这个类&#xff0c;并实现以下两个方法&#xff1a; __len__(): 返回数据集的大小__getitem__(): 根据索引返回一个样本 …...

MyBatis 官方子项目详细说明及表格总结

MyBatis 官方子项目详细说明及表格总结 1. 核心子项目说明 1.1 mybatis-3 GitHub 链接&#xff1a;https://github.com/mybatis/mybatis-3功能&#xff1a; MyBatis 核心框架的源码&#xff0c;提供 SQL 映射、动态 SQL、缓存、事务管理等核心功能。主要功能&#xff1a; 支持…...

Java学习手册:常用的内置工具类包

以下是常用 Java 内置工具包。 • 日期时间处理工具包 • java.time包&#xff08;JSR 310&#xff09;&#xff1a;这是 Java 8 引入的一套全新的日期时间 API&#xff0c;旨在替代陈旧的java.util.Date和java.util.Calendar类。其中的LocalDate用于表示不带时区的日期&…...

启动你的RocketMQ之旅(六)-Broker详细——主从复制

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final。 &#x1f4dd;个人主页&#xff1a; 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;java专栏 &#x1f4e7;如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学习&#xff0c;一…...

QT跨平台软件开发要点

一、Qt跨平台开发核心优势 1.统一代码基 通过Qt的抽象层&#xff08;Qt Platform Abstraction, QPA&#xff09;&#xff0c;同一套代码可编译部署到Windows、macOS、Linux、嵌入式系统&#xff08;如ARM设备&#xff09;甚至移动端&#xff08;通过Qt for Android/iOS&#…...

【C语言】柔性数组

目录 一柔性数组的定义与特点 定义&#xff1a; 特点&#xff1a; 注意事项 二柔性数组的使用方法 三示例代码详解 四与其他知识的结合 五总结 前言&#xff1a; 柔性数组是C99标准引入的一种特殊结构体成员类型&#xff0c;允许在结构体的末尾定义一个长度未知的数组…...

AWS中国区ICP备案全攻略:流程、注意事项与最佳实践

导语 在中国大陆地区开展互联网业务时,所有通过域名提供服务的网站和应用必须完成ICP备案(互联网内容提供商备案)。对于选择使用AWS中国区(北京/宁夏区域)资源的用户,备案流程因云服务商的特殊运营模式而有所不同。本文将详细解析AWS中国区备案的核心规则、操作步骤及避坑…...

基于Matlab的MDF文件导入与处理研究

摘要 本文围绕MDF文件格式展开全面研究,系统阐述了MDF文件的基本结构与数据块概念,深入探讨了在Matlab环境下导入和处理这些文件的理论与实践方法。首先,介绍了MDF文件在现代工业和汽车电子领域的应用背景及重要意义。接着,详细剖析了MDF文件的结构,包括头部信息、数据块、…...

架构师备考-设计模式23种及其记忆特点

引言 以下是一篇关于架构师备考中设计模式23种的博文架构及记忆技巧总结&#xff0c;内容清晰、结构系统&#xff0c;适合快速掌握核心知识点。 考试类型是给语句描述或者类图&#xff0c;判断是哪一种设计模式&#xff08;会出现英文的名词&#xff09;&#xff0c;2024年的两…...

学习记录:DAY18

前端实战与项目部署学习笔记 前言 时间固执沉默无情的流逝&#xff0c; 小心握紧漠然通达的当下。 今天要把前端实战部分学完&#xff0c;有时间写写学科作业 ----4.26---- 放纵注定是场与自我无休止的拉扯&#xff0c;过度的妥协只会跌入自我空虚的深渊 真该死啊&#xff0c…...

【OSG学习笔记】Day 10: 字体与文字渲染(osgText)

osgText库简介 osgText 是OpenSceneGraph&#xff08;OSG&#xff09;中用于文本渲染的重要模块&#xff0c;支持在3D场景中添加静态/动态文字、自定义字体、文字样式&#xff08;颜色、大小、对齐方式等&#xff09;以及动态更新文本内容。通过结合OSG的场景图机制&#xff0…...

[特殊字符] 深入理解Spring Cloud与微服务架构:全流程详解(含中间件分类与实战经验)

&#x1f4da; 目录 Spring Cloud 简介与发展 Spring Cloud 与 Spring Cloud Alibaba 的关系 为什么需要微服务&#xff1f;单体架构 vs 微服务对比 微服务常用中间件汇总 微服务如何科学拆分&#xff1f; 一个微服务对应一个数据库&#xff08;服务自治原则&#xff09; …...

深入理解算力:从普通电脑到宏观计算世界

在科技飞速发展的当下&#xff0c;“算力” 一词频繁出现在我们的视野中&#xff0c;无论是前沿的人工智能领域&#xff0c;还是新兴的区块链世界&#xff0c;算力都扮演着至关重要的角色。但对于大多数普通人来说&#xff0c;算力仿佛是一个既熟悉又陌生的概念。今天&#xff…...

IntelliJ IDEA 2025.2 和 JetBrains Rider 2025.1 恢复git commit为模态窗口

模态提交在 2025.1 中作为插件存在。 如下图所示安装插件 安装完之后&#xff0c;在设置里把下图的配置项打勾...

Linux——动静态库

目录 1. 动静态库基本原理 2. 认识动静态库 3. 动静态库的特点 3.1 静态库的优缺点 3.2 动态库的优缺点 4. 静态库的打包和使用 4.1 打包 4.2 使用 5. 动态库的打包和使用 5.1 打包 5.2 使用 6. 库的理解与加载 6.1 目标文件 6.2 ELF文件 6.3 ELF形成到加载…...

从频域的角度理解S参数:

从频域的角度理解S参数&#xff1a; S参数是一种频域模型&#xff0c;在频域的每一个频点都可以通过该频点的S参数来得到入射信号和反射信号之间的一组关系。这种方法不关注网络内部的具体结构&#xff0c;无论网络内部结构是什么,只要网络是线性不变的&#xff0c;就可以当作“…...

Java 安全:如何保护敏感数据?

Java 安全&#xff1a;如何保护敏感数据&#xff1f; 在当今数字化时代&#xff0c;数据安全成为了软件开发中至关重要的课题。对于 Java 开发者而言&#xff0c;掌握如何在 Java 应用中保护敏感数据是必备的技能。本文将深入探讨 Java 安全领域&#xff0c;聚焦于敏感数据保护…...

PySpark实现ABC_manage_channel逻辑

问题描述 我们需要确定"ABC_manage_channel"列的逻辑&#xff0c;该列的值在客户连续在同一渠道下单时更新为当前渠道&#xff0c;否则保留之前的值。具体规则如下&#xff1a; 初始值为第一个订单的渠道如果客户连续两次在同一渠道下单&#xff0c;则更新为当前渠…...

栈与堆的演示

1、栈与堆的演示 &#xff08;1&#xff09;网页视图 &#xff08;2&#xff09;代码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, in…...

【Kafka】Windows环境下生产与消费流程详解(附流程图)

1. 背景说明 在搭建基于Kafka的数据流通系统(例如流式推荐、实时日志采集)时,常见的操作是: 生产者 Producer 向 Kafka Topic 写入消息消费者 Consumer 从 Kafka Topic 读取消息本文以Windows本地环境 + Kafka 2.8.1版本为例,手把手演示生产消费流程。 2. 准备条件 Kafka…...

基于FFmpeg命令行的实时图像处理与RTSP推流解决方案

前言 在一些项目开发过程中需要将实时处理的图像再实时的将结果展示出来&#xff0c;此时如果再使用一张一张图片显示的方式展示给开发者&#xff0c;那么图像窗口的反复开关将会出现窗口闪烁的问题&#xff0c;实际上无法体现出动态画面的效果。因此&#xff0c;需要使用码流…...

神经网络笔记 - 感知机

一 感知机是什么 感知机&#xff08;Perceptron&#xff09;是一种接收输入信号并输出结果的算法。 它根据输入与权重的加权和是否超过某个阈值&#xff08;threshold&#xff09;&#xff0c;来判断输出0还是1。 二.计算方式 感知机的基本公式如下&#xff1a; X1, X2 : …...

【双指针】专题:LeetCode 15题解——三数之和

三数之和 一、题目链接二、题目三、题目解析四、算法原理解法一&#xff1a;排序 暴力枚举 利用set去重解法二&#xff1a;排序 双指针处理细节问题1、去重越界问题 2、不漏 五、编写代码六、时间复杂度和空间复杂度 一、题目链接 三数之和 二、题目 三、题目解析 i ! j …...

如何创建一个导入模板?全流程图文解析

先去找到系统内可以上传东西的按钮 把你的模板上传上去,找到对应的fileName 图里的文字写错了,是复制粘贴"filePath"到URL才能下载...

JS自动化获取网站信息开发说明

一、自动获取信息的必要性 1. 提高效率与节省时间 批量处理&#xff1a;自动化可以快速抓取大量数据&#xff0c;比人工手动操作快得多。 24/7 运行&#xff1a;自动化工具可以全天候工作&#xff0c;不受时间限制。 减少重复劳动&#xff1a;避免人工反复执行相同的任务&am…...

Python爬虫-爬取汽车之家各品牌月销量榜数据

前言 本文是该专栏的第54篇,后面会持续分享python爬虫干货知识,记得关注。 在本文中,笔者已整理19篇汽车平台相关的爬虫项目案例。对此感兴趣的同学,可以直接翻阅查看。 而本文,笔者将以汽车之家平台为例子。基于Python爬虫,实现批量爬取“各品牌月销量榜”的数据。废话…...

WPF 调用 OpenCV 库

WPF 调用 OpenCV 库指南 OpenCV 是一个强大的计算机视觉库,WPF 是 Windows 平台的 UI 框架。将两者结合可以实现强大的图像处理和计算机视觉应用。本文将详细介绍如何在 WPF 应用程序中集成和使用 OpenCV 库。 一、准备工作 1. 安装 OpenCV 方法一:通过 NuGet 安装 在 Vi…...

LLM(大语言模型)技术的最新进展可总结

截至2025年4月26日&#xff0c;LLM&#xff08;大语言模型&#xff09;技术的最新进展可总结为以下关键方向&#xff1a; 1. 架构创新与性能突破 多模态能力深化&#xff1a;GPT-4o等模型通过统一架构支持文本、图像、音频和视频的跨模态推理&#xff0c;显著提升复杂场景下的…...

Fedora 43 计划移除所有 GNOME X11 相关软件包

Fedora 43 计划移除所有 GNOME X11 相关软件包&#xff0c;这是 Fedora 项目团队为全面拥抱 Wayland 所做的重要决策。以下是关于此计划的详细介绍&#xff1a; 提案内容&#xff1a;4 月 23 日&#xff0c;Neal Gompa 提交提案&#xff0c;建议从 Fedora 软件仓库中移除所有 G…...

解构与重构:“整体部分”视角下的软件开发思维范式

在软件开发的复杂图景中&#xff0c;整体与部分的关系始终是决定项目成败的关键命题。《人月神话》“整体部分”一章以深邃的洞察力&#xff0c;揭示了软件开发过程中系统设计与实现的内在逻辑&#xff0c;不仅探讨了规格说明、设计方法等技术层面的核心要素&#xff0c;更深入…...

NdrpConformantVaryingArrayUnmarshall函数分析--重要

第一部分&#xff1a; void NdrpConformantVaryingArrayUnmarshall( PMIDL_STUB_MESSAGE pStubMsg, uchar ** ppMemory, PFORMAT_STRING pFormat, uchar fMustCopy, uchar fMustAlloc ) { uchar * …...

ZYNQ笔记(十四):基于 BRAM 的 PS、PL 数据交互

版本&#xff1a;Vivado2020.2&#xff08;Vitis&#xff09; 实验任务&#xff1a; PS 将字符串数据写入BRAM&#xff0c;再将数据读取出来&#xff1b;PL 从 BRAM 中读取数据&#xff0c;bing。通过 ILA 来观察读出的数据&#xff0c;与前面串口打印的数据进行对照&#xff0…...

月之暗面开源 Kimi-Audio-7B-Instruct,同时支持语音识别和语音生成

我们向您介绍在音频理解、生成和对话方面表现出色的开源音频基础模型–Kimi-Audio。该资源库托管了 Kimi-Audio-7B-Instruct 的模型检查点。 Kimi-Audio 被设计为通用的音频基础模型&#xff0c;能够在单一的统一框架内处理各种音频处理任务。主要功能包括&#xff1a; 通用功…...

文件操作及读写-爪哇版

文章目录 前言 初识文件文件路径里的符号文件分类文件操作方法文件读写字节流输入输出输入输出 字符流输入输出输入输出 前言 Windows用户需知&#xff1a;“/”和“\”&#xff0c; 文件路径分隔符一般都用“/”&#xff0c;但Windows系统一直保留着“\”&#xff0c;这两种符…...

【matlab】绘制maxENT模型的ROC曲线和omission curve

文章目录 一、maxENT模型二、ROC曲线三、实操3.1 数据提取3.2 绘制ROC曲线3.3 绘制遗漏曲线3.4 多次训练的ROC和测试的ROC 一、maxENT模型 前面的文章已经详细讲过了。 maxENT软件运行后&#xff0c;会生成一个html报告&#xff0c;里面有ROC曲线&#xff0c;但我们往往需要自…...

个人电子白板(svg标签电子画板功能包含正方形、文本、橡皮 (颜色、尺寸、不透明度)、 撤销、取消撤销 等等功能,)

在Http开发中&#xff0c;svg标签电子画板功能包含正方形、文本、橡皮 &#xff08;颜色、尺寸、不透明度&#xff09;、 撤销、取消撤销 等等功能&#xff0c; 效果图 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <!--<link href&qu…...

Pygame终极项目:从零开发一个完整2D游戏

Pygame终极项目:从零开发一个完整2D游戏 大家好!欢迎来到本期的Pygame教程。今天,我们将从零开始开发一个完整的2D游戏。通过这个项目,你将学习到如何使用Pygame库来创建游戏窗口、处理用户输入、绘制图形、管理游戏状态、实现碰撞检测和音效等。无论你是初学者还是有一定…...

在应用运维过程中,业务数据修改的证据留存和数据留存

在应用运维过程中,业务数据修改的证据留存和数据留存至关重要,以下是相关介绍: 一、证据留存 操作日志记录 : 详细记录每一次业务数据修改的操作日志,包括操作人员、操作时间、修改内容、修改前后数据的对比等。例如,某公司业务系统中,操作日志会精确记录员工小张在 2…...

JAVA JVM面试题

你的项目中遇到什么问题需要jvm调优&#xff0c;怎么调优的&#xff0c;堆的最小值和最大值设置为什么不设置成一样大&#xff1f; 在项目中&#xff0c;JVM调优通常源于以下典型问题及对应的调优思路&#xff0c;同时关于堆内存参数&#xff08;-Xms/-Xmx&#xff09;的设置逻…...

C盘爆红如何解决

deepseek来试用一下&#xff01; 一、快速释放空间 1. 清理临时文件 - **Win R** 输入 %temp% → 删除文件夹内所有内容。 - **Win S** 搜索 “磁盘清理”** → 选择C盘 → 勾选“临时文件”“系统缓存”等 → 点击“清理系统文件”&#xff08;可额外清理Windows…...

在 Ubuntu24.04 LTS 上 Docker 部署英文版 n8n 和 部署中文版 n8n-i18n-chinese

一、n8n 简介 n8n 是一个低代码&#xff08;Low-Code&#xff09;工作流自动化平台&#xff0c;可以帮助用户以非常简单的方式创建自动化流程&#xff0c;连接不同的应用程序和服务。n8n的设计理念是为了让复杂的工作流变得简单易用&#xff0c;同时也支持高度的自定义&#xf…...

软件设计案例分析学习笔记

1.软件设计师内容小考 一、单选题 1.(单选题&#xff0c;1.0 分) 下列内聚种类中&#xff0c;内聚程度最高的是 ( )。 A. 功能内聚 B. 逻辑内聚 C. 偶然内聚 D. 过程内聚 第 1 题&#xff1a; 答案&#xff1a;A 解析&#xff1a;功能内聚是指模块内所有元素共同完成一个功能&a…...

魔百盒CM311-3-YST代工-晨星MSO9385芯片-2+8G-免拆卡刷通刷固件包

魔百盒CM311-3-YST代工-晨星MSO9385芯片-28G-免拆卡刷通刷固件包 刷机前准备&#xff1a; 准备一个8G或一下容量的优盘将其格式化为fat32格式&#xff1b;&#xff08;切记不要用做过电脑系统的优盘&#xff0c;不然刷机直接变砖&#xff09;&#xff1b; 优盘卡刷强刷刷机&am…...