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

【学习笔记】pytorch强化学习

https://www.bilibili.com/video/BV1zC411h7B8


文章目录

  • [mcts] 01 mcts 基本概念基本原理(UCB)及两个示例
  • [mcts] 02 mcts from scartch(UCTNode,uct_search, pUCT,树的可视化)


[mcts] 01 mcts 基本概念基本原理(UCB)及两个示例

https://github.com/chunhuizhang/personal_chatgpt/blob/main/tutorials/drl/mcts/mcts_01_intro_bascis.ipynb

  • reference
    • Bandit based Monte-Carlo Planning:http://ggp.stanford.edu/readings/uct.pdf
from IPython.display import SVG, Image
import numpy as np

在这里插入图片描述

C = np.sqrt(2)
# level 1 select
print(7/10 + C*np.sqrt(np.log(21)/10))
print(5/8 + C*np.sqrt(np.log(21)/8))
print(0/3 + C*np.sqrt(np.log(21)/3))
  • MCTS

    • statistical(monte carlo) tree
    • Node:刻画/表示的是 state
    • edge: 刻画的是 action 导致的 state transition
  • Select 选择的是 leaf node(从 leaf node 中选择,)

    • 所谓的 leaf node:就是没有 children 的 node,比如初始状态的 root node 就没有 children;
    • select 的依据是 UCT (UCB1 vs. UCT)
      • The main idea in this paper it to apply a particular bandit algorithm, UCB1 (UCB stands for Upper Confidence Bounds), for rollout-based Monte-Carlo planning. The new algorithm, called UCT (UCB applied to trees) described in Section 2 is called UCT.
    • 随着 tree 的展开及update,后续 select 的过程就是一个 tree traversal 的过程;
  • Expand & Simulate (rollout, random simulate)

    • expand:leaf node 展开其 children,产生children的过程

      • 对于围棋的初始 root 状态,展开就是 19*19=361 个可能的children;
    • simulate:最能体现 monte carlo 思想的步骤

      • 搜索树的每个节点,算法会进行多次随机模拟
      • in order to find a value;
      • 从当前状态出发,按照某种策略(可能是完全随机的,也可能是某种启发式的策略)执行到游戏结束或达到某个深度限制。这些模拟的结果(胜 win、负 lose、平等 draw)被用来估算从当前节点出发的期望得分。
    • 什么时候需要rollout,节点是全新(没有被 simulate)的时候;

      • new node => rollout ( n i = 0 n_i=0 ni=0)
      • old node => expand (已经被update (simulate -> bp)过)
  • Backpropagate:对 node 的更新一直向上传(找其父节点)

    • 基于 rollout 找到的 value,
    • 每对一个node完成simulate,因为涉及到 bp,一直沿着 parent node,更新到 root 节点;
      • select 的过程,UCB 都需要重新计算;

UCB1 ( s i ) = w i n i + C ln ⁡ N i n i , UCB1 ( s i ) = v ˉ i + C ln ⁡ N i n i \begin{split} &\text{UCB1}(s_i)=\frac{w_i}{n_i} + C\sqrt{\frac{\ln N_i}{n_i}}, \quad \\ &\text{UCB1}(s_i)=\bar v_i + C\sqrt{\frac{\ln N_i}{n_i}} \end{split} UCB1(si)=niwi+CnilnNi ,UCB1(si)=vˉi+CnilnNi

  • w i w_i wi: # wins

  • n i n_i ni: # simulations

  • w i n i \frac{w_i}{n_i} niwi:game 中的胜率计算;

  • N i N_i Ni: parent’s # simulations

  • C = 2 C=\sqrt2 C=2

  • double E,exploitation vs. exploration

    • exploration:FOMO,fear of missing out
  • AlphaGo: deep learning + mcts

    • policy net: 输入棋盘状态,输出落点几率( π ( a i ∣ s i ) \pi(a_i|s_i) π(aisi)) => UCB
    • value net: 输入棋盘状态,输出获胜的几率 => simulate

图片来源:https://www.youtube.com/watch?v=UXW2yZndl7U
在这里插入图片描述

在这里插入图片描述

一些奏效的例子:

在这里插入图片描述

在这里插入图片描述

print('left', 20/1 + 2*np.sqrt(np.log(2)/1))
print('right', 10/1 + 2*np.sqrt(np.log(2)/1))
# left 21.665109222315394
# right 11.665109222315396

在这里插入图片描述

# left child tree
print(20/2 + 2*np.sqrt(np.log(3)/2)) # 11.482303807367511
# right child tree
print(10/1 + 2*np.sqrt(np.log(3)/1)) # 12.09629414793641# select right child 

在这里插入图片描述

# left child tree
print(10 + 2*np.sqrt(np.log(4)/2)) # 11.665109222315396# right child tree
print(12 + 2*np.sqrt(np.log(4)/2)) # 13.665109222315396# select right child 

在围棋中的案例

  • 白子/黑子,game,围棋(Go,AlphaGo)
    • 19*19 = 361
    • 博弈树:minimax tree
  • 这里根节点(root)的视角是黑子;
    • 黑子,白子,胜负的换算比较简单:总次数 - 黑子赢次数 = 白子赢的次数

在这里插入图片描述

from graphviz import Digraph
from IPython.display import display
graph = Digraph('mcts')
graph.node('s0', 'w_i/n_i', style='filled')
display(graph)
graph = Digraph('mcts')
graph.node('s0', '0/0', style='filled')
display(graph)

在这里插入图片描述
在这里插入图片描述
定义UCB函数

def ucb(wi, ni, Ni, C=np.sqrt(2)):return wi/ni + C*np.sqrt(np.log(Ni)/ni)print('left', ucb(1, 1, 2))
print('right', ucb(0, 1, 2))

在这里插入图片描述

# level 1 
print('left', ucb(1, 2, 3))
print('right', ucb(0, 1, 3))
# choose left# level 2,切换成白子赢的次数
print('left', ucb(1, 1, 2))

输出:

left 1.548147073968205
right 1.482303807367511
left 2.177410022515475

在这里插入图片描述

实际决策或者planning的时候,只贪心地考虑胜率,w_i/n_i


[mcts] 02 mcts from scartch(UCTNode,uct_search, pUCT,树的可视化)

https://github.com/chunhuizhang/personal_chatgpt/blob/main/tutorials/drl/mcts/mcts_02_from_scartch.ipynb

  • 补充
    • nodes correspond to states s s s
    • edges refer to actions a a a
      • each edge transfers the environment from its parent state to its child state
        • state transition
    • game tree
      • 交替落子 minimax setting;白子的 v(value) 是黑子的 -v;
        • 当前层黑子(边是黑子的action),下一层的为白子(边是白子的action)
        • 交替落子;
    • UCT => pUCT: Q + U
      • early on the simulation, U dominates (more exploration)
      • but later, Q is more important (less exploration, more exploitation)
    • training & inference
      • training: uct = Q + U(select node)
      • inference: Q(当前状态下的 best move)
  • 参考
    • https://github.com/brilee/python_uct
    • https://www.moderndescartes.com/essays/deep_dive_mcts/
import collections
import numpy as np
import math
from IPython.display import Image
from tqdm.notebook import tqdm

节点与搜索

在这里插入图片描述

  • node: 表示一个 game state,比如围棋里边的局面;

  • root:current state

    • mcts planning 就是决策在 current state 下,如何choose best move;
  • leaf node:terminal node or unexplored node

  • edge:action leading to another node

  • 因为 simulate(rollout/evaluate)完了之后涉及到 bp(反向传播或者回溯),每个 node 除了需要指向 children,还需要维护 parent

name_id = 0class UCTNode():def __init__(self, name, state, action, parent=None):self.name = nameself.state = stateself.action = actionself.is_expanded = False# self.parent.child_total_value[self.action]# self.parent.child_number_visits[self.action]# 指向selfself.parent = parent  # Optional[UCTNode]self.children = {}  # Dict[action, UCTNode]self.child_priors = np.zeros([362], dtype=np.float32)# tiself.child_total_value = np.zeros([362], dtype=np.float32)# niself.child_number_visits = np.zeros([362], dtype=np.float32)# Ni@propertydef number_visits(self):return self.parent.child_number_visits[self.action]@number_visits.setterdef number_visits(self, value):self.parent.child_number_visits[self.action] = value# ti@propertydef total_value(self):return self.parent.child_total_value[self.action]@total_value.setterdef total_value(self, value):self.parent.child_total_value[self.action] = value# pUCT# https://courses.cs.washington.edu/courses/cse599i/18wi/resources/lecture19/lecture19.pdfdef child_Q(self) -> np.ndarray:return self.child_total_value / (1 + self.child_number_visits)def child_U(self) -> np.ndarray:return math.sqrt(self.number_visits) * (self.child_priors / (1 + self.child_number_visits))def best_child(self) -> int:
#         print(self.child_Q() + self.child_U())return np.argmax(self.child_Q() + self.child_U())# traversaldef select_leaf(self):current = selfwhile current.is_expanded:# pUCTbest_action = current.best_child()current = current.maybe_add_child(best_action)return currentdef expand(self, child_priors):self.is_expanded = Trueself.child_priors = child_priorsdef maybe_add_child(self, action):global name_idif action not in self.children:# 新增 child 节点时,切换 player 身份(白子 => 黑子,黑子 => 白子)name_id += 1self.children[action] = UCTNode(name_id, self.state.play(action), action, parent=self)return self.children[action]def backup(self, value_estimate: float):current = selfwhile current.parent is not None:current.number_visits += 1current.total_value += (value_estimate * self.state.to_play)current = current.parent

Q + U

# 黑子白子的交替
# Select 的依据是 UCT:Q+U
# edge:P(child priors)
# node:V(value)
# f_\theta => (p, v)
Image(url='https://www.moderndescartes.com/static/deep_dive_mcts/alphago_uct_diagram.png', width=700)

在这里插入图片描述

  • Ranking = Quality + Uncertainty (Q + U)
    • Quality: exploitation
    • Uncertainty: exploration
      • FOMO(fear of missing out)
      • P from policy network

Q = t i 1 + n i U = ln ⁡ N i × P 1 + n i \begin{split} &Q=\frac{t_i}{1+n_i}\\ &U=\sqrt{\ln N_i}\times \frac{P}{1+n_i} \end{split} Q=1+nitiU=lnNi ×1+niP

定义游戏状态

# 交替落子 minimax setting;白子的 v(value) 是黑子的 -v;
class GameState:def __init__(self, to_play=1):self.to_play = to_playdef play(self, action):return GameState(to_play=-self.to_play)

策略网络与值网络

  • 结合使用策略网络(Policy network)来指导搜索方向, 并使用价值网络来评估棋局的潜在价值, 可以显著减少搜索树的大小,提高搜索的效率。
    • 策略网络(Policy network)能够从先前的对局中学习到有效的走棋模式和策略,这相当于在搜索过程中加入了大量的“先验知识”(child_priors)。
  • 价值网络(value network)可以给出对当前棋局胜负的直接评估,而不需要到达游戏的终局。这种评估能力对于减少搜索深度、加速决策过程至关重要。
class NeuralNet():@classmethoddef evaluate(self, game_state):# return policy_network(state), value_network(state)# policy_network(state): return pi(a|s)# value_network(state): return v(s)return np.random.random([362]), np.random.random()

最后是UCT搜索算法

class DummyNode(object):def __init__(self):self.parent = Noneself.child_total_value = collections.defaultdict(float)self.child_number_visits = collections.defaultdict(float)
def print_tree_level_width(root: UCTNode):if not root:returnqueue = [(root, 0)]  # 初始化队列,元素为 (节点, 层级)current_level = 0level_nodes = []while queue:node, level = queue.pop(0)  # 从队列中取出当前节点和它的层级# 当进入新的一层时,打印上一层的信息并重置if level > current_level:print(f"Level {current_level} width: {len(level_nodes)}")level_nodes = [f'{node.action}']  # 重置当前层的节点列表current_level = levelelse:level_nodes.append(f'{node.action}')# 将当前节点的所有子节点加入队列for child in node.children.values():queue.append((child, level + 1))# 打印最后一层的信息print(f"Level {current_level} width: {len(level_nodes)}")
def UCT_search(state, num_reads):# repeated simuations?root = UCTNode(0, state, action=None, parent=DummyNode())for i in tqdm(range(num_reads)):# 每次都是从根节点出发leaf = root.select_leaf()# child_priors: [0, 1]child_priors, value_estimate = NeuralNet().evaluate(leaf.state)leaf.expand(child_priors)leaf.backup(value_estimate)
#         print(i)
#         print_tree_level_width(root)return root, np.argmax(root.child_number_visits)# return root, root.best_child()

运行搜索算法:

num_reads = 100000
import time
tick = time.time()
root, _ = UCT_search(GameState(), num_reads)
tock = time.time()
print("Took %s sec to run %s times" % (tock - tick, num_reads))
import resource
print("Consumed %sKB memory" % resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)
"""0%|          | 0/100000 [00:00<?, ?it/s]
Took 5.709271430969238 sec to run 100000 times
Consumed 758408KB memory
"""

打印:

print_tree_level_width(root)# Level 0 width: 1
# Level 1 width: 360
# Level 2 width: 71329
# Level 3 width: 28310

使用igraph可视化:

# import igraph as ig
# g = ig.Graph(directed=True)# # 用于跟踪已添加节点的字典
# nodes_dict = {}# def add_nodes_and_edges(node, parent_id=None):
#     # 添加当前节点(如果尚未添加)
#     if node not in nodes_dict:
#         nodes_dict[node.name] = len(nodes_dict)
#         g.add_vertices(1)#     current_id = nodes_dict[node.name]#     # 添加从父节点到当前节点的边
#     if parent_id is not None:
#         g.add_edges([(parent_id, current_id)])#     # 递归为子节点做同样的处理
#     for child in node.children.values():
#         add_nodes_and_edges(child, current_id)# # 从根节点开始添加节点和边
# add_nodes_and_edges(root)
# layout = g.layout("tree", root=[0])# # 设置节点名称
# g.vs["label"] = list(nodes_dict.keys())# # 可视化
# ig.plot(g, layout=layout, bbox=(300, 300), margin=20)

相关文章:

【学习笔记】pytorch强化学习

https://www.bilibili.com/video/BV1zC411h7B8 文章目录 [mcts] 01 mcts 基本概念基本原理&#xff08;UCB&#xff09;及两个示例[mcts] 02 mcts from scartch&#xff08;UCTNode&#xff0c;uct_search, pUCT&#xff0c;树的可视化&#xff09; [mcts] 01 mcts 基本概念基本…...

C++学习之线程同步

目录 1.线程同步相关概念 2.锁属性-建议锁 3.Mutex互斥锁操作 4.互斥锁使用注意事项 5.互斥量的初始化方法 6.死锁 7.读写锁特性 8.读写锁操作函数 9.读写锁使用示例 10.条件变量操作函数 11.生产者消费者模型简单分析 12.条件变量实现生产者消费者模型代码预览 13…...

定积分的应用(4.39-4.48)

battle cry 前言4.394.404.414.424.434.444.454.464.474.48 前言 题目确实比较多。slow down and take your time. 4.39 狂算了一遍&#xff0c;然后发现不是计算出问题了&#xff0c;是积分上下限写错了。还有把函数代进去也出了一点问题。 点火公式一家人我不记得&#x…...

Java EE期末总结(第三章)

目录 一、JavaBean 1、规范与定义 2、与JavaBean相关的JSP动作标签 二、MV开发模式&#xff08;JSPJavaBean&#xff09; 三、Servlet组件 1、Servlet定义 2、基于HTTP请求的Servlet开发 3、Sevlet执行原理 4、控制器程序的分层设计&#xff08;DAO&#xff09;模式 5、…...

Data_Socket和UDP_Socket

Data_Socket 和 UDP_Socket 是两种不同类型的网络套接字&#xff0c;它们用于不同的协议和应用场景。以下是它们的主要区别&#xff1a; 协议类型&#xff1a; UDP_Socket&#xff1a;使用的是 UDP&#xff08;User Datagram Protocol&#xff09; 协议&#xff0c;这是一种无连…...

6547网:蓝桥STEMA考试 Scratch 试卷(2025年3月)

『STEMA考试是蓝桥青少教育理念的一部分&#xff0c;旨在培养学生的知识广度和独立思考能力。考试内容主要考察学生的未来STEM素养、计算思维能力和创意编程实践能力。』 一、选择题 第一题 运行下列哪个程序后&#xff0c;飞机会向左移动&#xff1f; ( ) A. …...

使用MATIO库读取Matlab数据文件中的多维数组

使用MATIO库读取Matlab数据文件中的多维数组 MATIO是一个用于读写Matlab数据文件(.mat)的开源C库。下面是一个完整的示例程序&#xff0c;展示如何使用MATIO库读取Matlab数据文件中的多维数组。 示例程序 #include <stdio.h> #include <stdlib.h> #include <…...

Spring @Transactional 注解是如何工作的?

Transactional 注解是 Spring 框架中用于声明式事务管理的核心注解。它可以应用于类或方法&#xff0c;用于指定事务的属性&#xff0c;例如传播行为、隔离级别、超时时间、只读标志等。下面详细解释 Transactional 注解的工作原理&#xff1a; 1. 启用事务管理&#xff1a; …...

spring security 过滤器链使用

Spring Security 的过滤器链提供了灵活的安全控制机制&#xff0c;以下是其在实际开发中的 常见用法 及对应的过滤器配置示例&#xff1a; 一、认证方式配置 1. 表单登录认证 • 过滤器&#xff1a;UsernamePasswordAuthenticationFilter • 配置&#xff1a; http.formLogi…...

k8s 自动伸缩的场景与工作原理

k8s 自动伸缩的场景与工作原理 在现代云原生架构中&#xff0c;应用的访问量和资源需求常常存在波动。为了解决高峰时资源不足、低谷时资源浪费的问题&#xff0c;Kubernetes 提供了自动伸缩功能。自动伸缩可以根据预设的指标&#xff08;如 CPU 利用率、内存占用、网络流量等…...

SYN Flooding攻击原理

SYN Flooding攻击原理详解 SYN Flooding&#xff08;SYN洪泛攻击&#xff09;是一种典型的拒绝服务攻击&#xff08;DoS/DDoS&#xff09;&#xff0c;利用TCP协议的三次握手缺陷耗尽目标系统资源。以下是其工作原理、影响及防御措施的全面解析&#xff1a; 1. TCP三次握手回顾…...

【爬虫案例】采集 Instagram 平台数据几种方式(python脚本可直接运行)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、概述1.1 Instagram基础信息1.2 Instagram平台架构核心技术栈1.3 采集提示1.4 几种采集方案对比二、四种采集方案分析三、写爬虫采集Instagram案例3.1 采集作品信息并下载视频或图片(无需登录)3.2 explore接口的采…...

通过构造函数和几何条件,研究了不同函数的最近点存在性、性质及单调性

解&#xff1a; &#xff08;1&#xff09;对于函数 f ( x ) 1 x f(x) \frac{1}{x} f(x)x1​ 和点 M ( 1 , 0 ) M(1, 0) M(1,0)&#xff0c;构造函数 s ( x ) ( x − 1 ) 2 ( 1 x ) 2 s(x) (x - 1)^2 \left(\frac{1}{x}\right)^2 s(x)(x−1)2(x1​)2。求导得到 s ′ …...

项目复杂业务的数据流解耦处理方案整理

目前项目中使用mobx&#xff0c;项目比较久了&#xff0c;每个Store的内容是越来越多了&#xff0c;逻辑也是越来越复杂&#xff0c;如果不梳理估计以后模块的层级会很乱。 之前整理了一些数据流管理的对比实践和最佳方案的梳理&#xff0c;最后写来写去感觉还是要整理一个架构…...

手部穴位检测技术:基于OpenCV和MediaPipe的实现

手部穴位检测是医学和健康管理领域的重要技术之一。通过准确识别手部的关键穴位,可以为中医诊断、康复治疗以及健康监测提供支持。本文将介绍一种基于OpenCV和MediaPipe的手部穴位检测方法,展示如何利用计算机视觉技术实现手部关键点的检测,并进一步标注手部的穴位位置。 技…...

Pycharm 启动时候一直扫描索引/更新索引 Update index/Scanning files to index

多个项目共用一个虚拟环境&#xff0c;有助于加快PyCharm 启动吗 chatgpt 4o认为很有帮助&#xff0c;gemini 2.5pro认为没鸟用&#xff0c;我更认可gemini的观点。不知道他们谁在一本正经胡说八道。 -------- 打开pycharm的时候&#xff0c;下方的进度条一直显示在扫描文件…...

解锁健康密码,拥抱品质生活

在生活节奏不断加快的今天&#xff0c;健康养生已成为人们关注的焦点。它不仅关乎当下生活质量&#xff0c;更是对未来幸福的投资。从日常生活的点滴出发&#xff0c;掌握正确养生方法&#xff0c;我们就能轻松收获健康。​ 饮食是健康的基石。我们应当遵循 “食物多样&#x…...

安卓开发工程师- Intent 机制

Intent 的作用是什么&#xff1f; Intent&#xff08;意图&#xff09;是 Android 中用于组件之间通信的一种机制。它主要用于以下几种场景&#xff1a; 启动 Activity&#xff1a;从一个 Activity 跳转到另一个 Activity。启动 Service&#xff1a;用于启动后台服务或与服务…...

iOS 使用 - 修改屏幕为黑白显示(墨水屏)

iOS 18 设置 – 辅助功能 – 显示与文字大小 – 色彩滤镜 打开色彩滤镜&#xff0c;选择 灰度&#xff0c;最下方调节 强度值 怀念起那个用电子词典的岁月&#xff0c;一个个字母键入&#xff0c;就可以获得很多知识。 触屏时代&#xff0c;一切好像更简单了&#xff0c;但也更…...

小白速通:Verilog流水线实现及时序分析

目录 题目&#xff1a;时序分析&#xff1a;时钟频率为50MHz数据1: a10, b20, c30, d40, e2数据2: a5, b15, c25, d35, e3数据3: a8, b12, c16, d24, e4 流水线效率分析 题目&#xff1a; verilog中&#xff0c;y(abcd)*e&#xff0c;时钟频率为50Mhz&#xff0c;用流水线的形式…...

微软的 Copilot 现在可以浏览网页并为您执行操作

在庆祝其 50 岁生日之际&#xff0c;微软正在向其人工智能驱动的 Copilot 聊天机器人传授一些新技巧。 从 BASIC 到 AI&#xff0c;改变世界的公司&#xff1a;微软 微软表示&#xff0c;Copilot 现在可以在“大多数网站”上采取行动&#xff0c;使其能够预订门票、预订餐厅等…...

【C++】vector的模拟实现

文章目录 前言一. vector的底层二. 关于容量和大小的函数2.1 size和capacity2.2 reserve2.3 resize2.4 empty 三. vector的默认成员函数3.1 构造函数3.1.1 无参构造函数3.1.2 构造初始化为n个val值3.1.3 用initializer_list构造初始化3.1.4 使用迭代器区间进行构造初始化 3.2 拷…...

C# Winform 入门(9)之如何封装并调用dll

封装dll 首先创建 .Net平台 类库 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _09.Encapsulation_dll {public class Program{/// <summary>/// 求两个double类型的数值的和/// &l…...

【C语言】内存函数

大家好&#xff0c;很高兴又和大家见面了&#xff01;&#xff01;&#xff01; 在C语言标准库中&#xff0c;有一些直接对内存进行操作的函数&#xff0c;我们将其称之为内存函数&#xff0c;这些函数位于头文件<string.h>&#xff0c;在网站https://cplusplus.com/ref…...

SDL视频显示函数

文章目录 1. **`SDL_Init()`**2. **`SDL_CreateWindow()`**3. **`SDL_CreateRenderer()`**4. **`SDL_CreateTexture()`**5. **`SDL_UpdateTexture()`**6. **`SDL_RenderCopy()`**7. **`SDL_RenderPresent()`**8. **`SDL_Delay()`**9. **`SDL_Quit()`**总结示例代码:代码说明:…...

博客文章:深入分析 PyMovie - 基于 Python和 MoviePy 的视频管理工具

这是一个使用 wxPython 构建界面、moviepy 处理视频的自定义 GUI 应用程序。该工具提供了视频播放、元数据提取、格式转换、视频裁剪和截图等功能。通过分析其设计和实现&#xff0c;我们将了解其工作原理、优点和潜在的改进空间。 C:\pythoncode\new\output\pymovieSample.py …...

Redis中AOF的实现方式和AOF重写

一、AOF 的实现方式 核心原理 AOF 通过将写操作命令以追加方式记录到日志文件中&#xff0c;重启时通过重放命令恢复数据。与 RDB 的快照机制不同&#xff0c;AOF 是增量记录&#xff0c;更适用于数据一致性要求较高的场景。写入流程 命令执行&#xff1a;客户端发送写命令&am…...

Supervisor的安装和使用

Supervisor 使用笔记&#xff08;CentOS 8 环境&#xff09; 本周&#xff0c;老师让我使用supervisor管理项目服务&#xff0c;当时第一次听说过这个进程管理工具&#x1f636;‍&#x1f32b;️&#xff0c;就上网搜了搜安装和使用&#xff0c;又用ai查了一些细节&#xff0…...

JVM 内存区域详解

JVM 内存区域详解 Java 虚拟机&#xff08;JVM&#xff09;的内存区域划分为多个部分&#xff0c;每个部分有特定的用途和管理机制。以下是 JVM 内存区域的核心组成及其功能&#xff1a; 一、运行时数据区&#xff08;Runtime Data Areas&#xff09; 1. 线程共享区域 内存…...

【java】在 Java 中,获取一个类的`Class`对象有多种方式

在 Java 中&#xff0c;获取一个类的Class对象有多种方式。Class对象代表了 Java 中的一个类或接口的运行时类信息&#xff0c;可以用于反射操作。以下是获取Class对象的几种常见方法&#xff1a; 1.使用.class属性 每个类都有一个.class属性&#xff0c;可以直接获取该类的Cl…...

蓝桥杯:对字符串处理常用知识笔记

一、前面四个是计算带有空格字符串的的长度计算 C语言代码 #include<string.h> #include<stdio.h> int main() { char s[105]; gets(s); printf("%d", strlen(s)); return 0; } 算法2 C 代码&#xff08;常用&#xff09; #include <iostream> #in…...

c++网络编程,信号透传可能是什么意思

在 C 网络编程中&#xff0c;**信号透传**&#xff08;Signal Pass-Through&#xff09;通常 refers to the concept of allowing signals to propagate through a network protocol stack without being interrupted or modified. 具体来说&#xff0c;信号透传可以涉及到几个…...

数据结构与算法学习笔记----贪心·绝对值不等式

数据结构与算法学习笔记----贪心绝对值不等式 author: 明月清了个风 first publish time: 2025.4.5 ps⭐️感觉其实是一个数学的问题&#xff0c; Acwing 104. 货仓选址 [原题链接](104. 货仓选址 - AcWing题库) 在一条数轴上有 N N N家商店&#xff0c;他们的坐标分别为 A…...

CUDA学习--体验GPU性能

学习来源&#xff1a;2 CUDA Python--并行计算基础-卷积计算以及共享内存_哔哩哔哩_bilibili 处理一张图片的处理速度对比 import cv2 from numba import cuda import time import math cuda.jit() def process_gpu(img,channels):tx cuda.blockIdx.x*cuda.blockDim.xcuda…...

博途 TIA Portal之1200做主站与200SMART的S7通讯

有时候,我们与之作S7通讯的西门子系PLC并不是同一个厂商或是同一时期供货的,也有可能不在一个编程软件中。此时进行S7能讯会有所不同。本文将演示博途与200SMART做S7通讯。 1、硬件准备 1200PLC一以,200SMART一台,网线2根,交换机一台。 2、关于编程 1200做主站,因此需…...

a标签download下载图片

‌a标签的download属性是HTML5中新增的一个属性&#xff0c;用于指定链接点击时直接下载文件&#xff0c;而不是在浏览器中打开文件。‌ 基本用法 ‌指定下载文件名‌&#xff1a;在a标签中添加download属性&#xff0c;并指定一个文件名。例如&#xff1a; <a href"…...

#SVA语法滴水穿石# (013)关于 disable iff、matched 、expect 的用法

SystemVerilog 断言&#xff08;SVA&#xff09;中 disable iff、matched 和 expect 的语法知识。 1. disable iff (condition) 功能与定义 作用&#xff1a;当指定条件&#xff08;condition&#xff09;为真时&#xff0c;禁用当前属性的检查。 常用于复位&#xff08;rese…...

Day2-2:前端项目uniapp壁纸实战

再在wallpaper新建一个目录components 在components下新建组件common-title 记得点击创建同名目录 在index加 <view class"select"><common-title></common-title></view> 图片换了下&#xff0c;原来的有点丑&#xff0c;图片可按自己喜欢…...

pycharm如何通过跳板机连接服务器在本地debug

现在假设你有一个服务器&#xff0c;需要跳板机登陆&#xff0c;但是你从跳板机到服务器&#xff0c;只知道能直接通过ssh连接。 首先你可以现在本地创建一个 SSH 配置文件&#xff08;~/.ssh/config&#xff09;&#xff1a; Host jumpHostName 跳板机地址Port 端口User 用户…...

Mysql explain中列的解析

EXPLAIN列的解释&#xff1a; table&#xff1a;显示这一行的数据是关于哪张表的 type&#xff1a;这是重要的列&#xff0c;显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL possible_keys&#xff1a;查询可以利用的索引&#…...

场馆预定系统小程序PHP+uniapp

场馆预定系统小程序&#xff1a;基于PHPUniApp的多场景体育场馆智慧化解决方案 随着全民健身意识的提升&#xff0c;体育场馆的数字化管理需求日益增长。场馆预定系统小程序凭借其轻量化、高便捷性&#xff0c;成为体育馆、羽毛球馆、兵乒球馆等场所提升运营效率的核心工具。本…...

05.unity 游戏开发-3D工程的创建及使用方式和区别

05.unity 游戏开发-3D工程的创建及使用方式和区别 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是Python基础语法。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性&#xff0c;希望对您有用~ unity简介…...

php8 命名参数使用教程

简介 PHP 8 引入 命名参数&#xff08;Named Arguments&#xff09;&#xff0c;允许在调用函数时按参数名传递值&#xff0c;而不是按照参数位置。这增强了代码的可读性、灵活性&#xff0c;并减少参数顺序依赖。 基本用法 传统位置参数&#xff08;Positional Arguments&a…...

Transformer与注意力机制详解

1 Transformer与注意力机制详解 本文直观上详细介绍了大语言模型中十分重要的结构——Transformer,及其核心:注意力机制的原理。 1. Transformer结构 基础结构如下图所示,左侧由一系列Encoder block(编码器)构成,接收字词句输入;右侧由一系列Decoder block(解码器)…...

xLua环境控制+xLua的Lua调用C#的1

编写自定义加载器加载指定路径的Lua文件&#xff1a; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using XLua;//Lua是脚本语言&#xff0c;编写代码脚本是实现功能最重要的方式 public class Loader : MonoBehaviour …...

RabbitMQ应用问题

RabbitMQ应用问题 一.幂等性1.简述概念2.MQ的幂等性介绍3.解决幂等性问题(1)全局唯一ID(2)业务逻辑判断 二.顺序性保障1.简单介绍2.无法保证顺序性的场景3.保障方案1)单队列消费者2)分区消费3)消息确认机制4)业务逻辑控制 三.消息积压问题1.原因分析2.解决方案 一.幂等性 1.简…...

轻量化大模型微调工具XTuner指令微调实战(下篇)

接着上篇文章《轻量化大模型微调工具XTuner指令微调实战&#xff08;上篇&#xff09;》来接着写教程。 一、模型转换 模型训练后会自动保存成 PTH 模型&#xff08;例如 iter_500.pth&#xff09;&#xff0c;我们需要利用 xtuner convert pth_to_hf 将其转换为 HuggingFace…...

Redis数据结构之ZSet

目录 1.概述2.常见操作2.1 ZADD2.2 ZRANGE2.3 ZREVRANGE2.4 ZRANGEBYSCORE2.5 ZSCORE2.6 ZCARD2.6 ZREM2.7 ZINCRBY2.8 ZCOUNT2.9 ZMPOP2.10 ZRANK2.11 ZREVRANK 3.总结 1.概述 ZSet和Set一样也是String类型元素的集合&#xff0c;且不允许重复的成员&#xff0c;不同的是ZSet…...

STM32提高篇: CAN通讯

STM32提高篇: CAN通讯 一.CAN通讯介绍1.物理层2.协议层二.STM32CAN外设1.CAN控制器的3种工作模式2.CAN控制器的3种测试模式3.功能框图三.CAN的寄存器介绍1.环回静默模式测试2.双击互发测试四.CAN的HAL代码解读一.CAN通讯介绍 CAN(Controller Area Network 控制器局域网,简称…...

贪心算法之最小生成树问题

1. 贪心算法的基本思想 贪心算法在每一步都选择局部最优的边&#xff0c;希望最终得到整体最优的生成树。常见的两种 MST 算法为 Kruskal 算法 和 Prim 算法。这两者均满足贪心选择性质和最优子结构性质&#xff0c;即&#xff1a; 贪心选择性质&#xff1a;局部最优选择&…...