【强化学习的数学原理】第02课-贝尔曼公式-笔记
学习资料:bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接:强化学习的数学原理 西湖大学 赵世钰
文章目录
- 一、为什么return重要?如何计算return?
- 二、state value的定义
- 三、Bellman公式的详细推导
- 四、公式向量形式与求解
- 五、Action value的定义
- 六、本节课内容summary
一、为什么return重要?如何计算return?
上面三幅图分别代表三个策略,从直观上我们可以判断,左边策略是最好的,因为它不经过forbidden area就能到达终点;中间策略是最差的,因为它经过了forbidden area;右边策略是既不好也不差的,因为它有一定的概率经过forbioden area到达终点,也有一定的概率不经过forbidden area而直接到达终点。
那么,该如何用数学的方式来直观地表达不同策略的优劣呢?答案就是用return来表示。
对于左边策略,计算return1:
对于中间策略,计算return2:
对于右边策略,计算return3:
严格来说这个return3已经不再是return的概念了,因为return的定义表明,return是根据一个轨迹trajectory计算出来的,而这里的return3是根据两个轨迹共同计算出来的。这里的return3其实是后面state value的概念。
得出结果,return1>return3>return2。所以,可以用return来直观地表达不同策略的优劣。
那么该如何计算return呢?
请看下图推导过程。发现从不同状态出发得到的return,依赖于从其他状态得到的return
。这个idea在强化学习中被称为bootstrapping,常常指从自己出发,不断迭代所得到的结果。因此,下面有4个未知数v1-v4,同时也有4个方程,所以可以使用线性代数的方法解出未知数。
上图中的式子其实就是贝尔曼公式,但只适用于确定性问题。上面这个式子告诉我们:一个状态的value实际上依赖于其他状态的value。
下图是一个应用的小例子,可以辅助理解。
二、state value的定义
下图介绍了一些符号。
注意:
(1) R t + 1 R_{t+1} Rt+1其实也可以写成 R t R_{t} Rt,就是说在状态 S t S_{t} St下选择了动作 A t A_{t} At,得到了奖励 R t R_{t} Rt。这是说得通的,但一般都习惯性地写成 R t + 1 R_{t+1} Rt+1。
(2)S、A、R都是随机变量,所以可以对它们求期望等操作。
(3)这个single-step process是由概率分布决定的。(见下图三行蓝字)
(4)我们假设我们已知模型,即已知概率分布。
考虑下面的trajectory。在状态 S t S_{t} St下选择了动作 A t A_{t} At,得到了奖励 R t R_{t} Rt,转移到状态 S t + 1 S_{t+1} St+1,再选择动作 A t + 1 A_{t+1} At+1……对这一个trajectory,可以求discounted return,结果用 G t G_t Gt表示。
有了上面的铺垫,下面来讨论state value。下图是对state value的定义。 G t G_t Gt表示一个trajectory的discounted return,而state value就是 G t G_t Gt的期望值/平均值,这个期望值是在当前状态s下来计算的,也就是对多个trajectory的平均。
state value表示为 v π ( s ) v_π(s) vπ(s),也可以表示为 v ( s , π ) v(s, π) v(s,π)。
注意:
(1) v π ( s ) v_π(s) vπ(s)是关于s的一个函数,所以从不同的状态s出发,会得到不同的trajectory,因而discounted return也不同,期望值也不同。
(2) v π ( s ) v_π(s) vπ(s)是一个与策略相关的函数。不同的策略也会带来不同的state value。
(3) v π ( s ) v_π(s) vπ(s)代表状态s的价值,如果某一个状态s的state value更大,则代表从该状态s出发,可能得到更多的return。
(4)return 和 state value 有什么区别?return是针对单个trajectory求出来的奖励,而state value是对多个trajectory得到的奖励再求平均值。
例:针对图中3个策略分别计算其state value。
三、Bellman公式的详细推导
下图回顾了trajectory的含义,以及 G t G_t Gt可以被写成当前的即时回报 R t + 1 R_{t+1} Rt+1与未来回报 G t + 1 G_{t+1} Gt+1的和。然后我们再看state value的定义,state value本质上是对多个trajectory的累计回报求均值,而求均值这个操作是可以被拆分的,因此可以转化成下图中蓝字所呈现的形式。其中, E [ R t + 1 ∣ S t = s ] E[R_{t+1}|S_t=s] E[Rt+1∣St=s] 表示在状态s下获得的即时回报 R t + 1 R_{t+1} Rt+1的期望, E [ G t + 1 ∣ S t = s ] E[G_{t+1}|S_t=s] E[Gt+1∣St=s] 表示在状态s下,从下一个状态出发,走过多个trajectory的累计回报的均值。下面,分别计算 E [ R t + 1 ∣ S t = s ] E[R_{t+1}|S_t=s] E[Rt+1∣St=s] 和 E [ G t + 1 ∣ S t = s ] E[G_{t+1}|S_t=s] E[Gt+1∣St=s] 。
首先,计算 E [ R t + 1 ∣ S t = s ] E[R_{t+1}|S_t=s] E[Rt+1∣St=s]。 E [ R t + 1 ∣ S t = s ] E[R_{t+1}|S_t=s] E[Rt+1∣St=s] 表示在状态s下获得的即时回报 R t + 1 R_{t+1} Rt+1的期望。在状态s下,我可以选择动作 a 1 a_1 a1, a 2 a_2 a2, a 3 a_3 a3…,而对于其中任意一个动作 a i a_i ai,都有可能带来不同的即时回报 r 1 r_1 r1, r 2 r_2 r2, r 3 r_3 r3…,所有这些即时回报的均值就是我们要求的 R t + 1 R_{t+1} Rt+1。所以,要求 E [ R t + 1 ∣ S t = s ] E[R_{t+1}|S_t=s] E[Rt+1∣St=s],先算在状态s下可能选择哪些动作a,以及选择动作a的概率 π ( a ∣ s ) π(a|s) π(a∣s)有多大,如下图推导过程中第1行所示。然后再算 E [ R t + 1 ∣ S t = s , A t = a ] E[R_{t+1}|S_t=s, A_t=a] E[Rt+1∣St=s,At=a],即在状态s的情况下,选择动作a可能会带来哪些回报r,带来回报r的概率 p ( r ∣ s , a ) p(r|s,a) p(r∣s,a) 有多大。
然后,计算 E [ G t + 1 ∣ S t = s ] E[G_{t+1}|S_t=s] E[Gt+1∣St=s] 。 E [ G t + 1 ∣ S t = s ] E[G_{t+1}|S_t=s] E[Gt+1∣St=s] 表示在状态s下,从下一个状态出发,走过多个trajectory的累计回报的均值。
先看下面推导过程中的第1行。要算 E [ G t + 1 ∣ S t = s ] E[G_{t+1}|S_t=s] E[Gt+1∣St=s],也就是要算从当前状态s出发,能够到达哪些状态?这些状态的每一个 G t + 1 G_{t+1} Gt+1 分别是什么?把所有的 G t + 1 G_{t+1} Gt+1 都求出来,再取一个均值,就得到了 E [ G t + 1 ∣ S t = s ] E[G_{t+1}|S_t=s] E[Gt+1∣St=s]。第1行中的 p ( s ′ ∣ s ) p(s'|s) p(s′∣s) 表示从当前状态s出发,转移到状态s’的概率。 E [ G t + 1 ∣ S t = s , S t + 1 = s ′ ] E[G_{t+1}|S_t=s, S_{t+1}=s'] E[Gt+1∣St=s,St+1=s′] 表示当前状态为s,下一个状态为s’时所获得的state value。
再看下面推导过程中的第2行。第2行其实是对第1行进行了简化。根据马尔科夫决策过程的无记忆性(memoryless property),在t+1时刻所获得的累计回报return G t + 1 G_{t+1} Gt+1 只和 t+1 时刻的状态有关,和 t 时刻的状态是没关系的,所以可以去掉公式中的 S t = s S_t=s St=s 部分。
再看下面推导过程中的第3行。 E [ G t + 1 ∣ S t + 1 = s ′ ] E[G_{t+1}|S_{t+1}=s'] E[Gt+1∣St+1=s′] 其实就是 v π ( s ′ ) v_π(s') vπ(s′) ,可以再进一步简化。
再看下面推导过程中的第4行。 p ( s ′ ∣ s ) p(s'|s) p(s′∣s) 表示从当前状态s出发,转移到状态s’的概率,可对其进一步扩展。表示从当前状态s出发,选择状态a,转移到状态s’的概率 p ( s ′ ∣ s , a ) p(s'|s, a) p(s′∣s,a),再乘上从当前状态s出发,选择动作a的概率 π ( a ∣ s ) π(a|s) π(a∣s)。
现在,可以给出贝尔曼公式的表达式。
Highlights:
(1)贝尔曼公式描述了不同状态的state value之间的关系。比如,在上式中,状态s的state value 和状态s’的state value,两者的关系就可以通过贝尔曼公式表达出来。
(2)公式包含两项,一部分是即时奖励,一部分是未来奖励。
(3)这个式子不仅仅针对一个状态s,对于状态空间S中的任意一个状态s,上述式子都是成立的。所以如果有n个状态,就对应着n个式子。
(4) v π ( s ) v_π(s) vπ(s) 的计算可以通过bootstrapping的方法。(n个方程,n个未知数,联立求解。)
(5)贝尔曼公式是依赖于policy π ( a ∣ s ) π(a|s) π(a∣s) 的。所以对于任何一个policy π ( a ∣ s ) π(a|s) π(a∣s) ,如果把state value计算出来,那也就能够评判这个policy π ( a ∣ s ) π(a|s) π(a∣s) 的好坏了。这个过程就是policy evaluation。
(6) p ( s ′ ∣ s , a ) p(s'|s, a) p(s′∣s,a) 和 p ( r ∣ s , a ) p(r|s, a) p(r∣s,a) 被称作dynamic model。在本节学习过程中,假设这个model是已知的。若不知道这个model,仍然可以计算出state value,这是model free reinforcement learning相关的算法。
下面是一个小练习。参考下面这张图,根据贝尔曼公式,写出这张图对应的贝尔曼方程。得到最下面的结果。其实最终结果也可以通过直接手写方便地得到,0表示即时奖励(r=0), v π ( s 3 ) v_π(s_3) vπ(s3)表示未来的奖励,再乘上一个折扣因子γ即可。
四、公式向量形式与求解
把贝尔曼公式转换成 Matrix-vector form,更加有利于我们去求解。先对贝尔曼公式进行烟花,转换成下图所示的“即时奖励+未来奖励”的形式。
为了识别不同的状态,在下图的贝尔曼公式中,给状态标上号。如下图所示, v π ( s i ) v_{\pi}(s_i) vπ(si)等于即时奖励 r Π ( s i ) r_Π(s_i) rΠ(si)再加上未来奖励。从状态 s i s_i si 跳转到下一个状态有j中可能性,用转移概率乘上每个状态的state value,就是未来奖励。这个公式可以简化成下图中蓝字的形式。
举一个具体的例子,当只有4种状态的时候,贝尔曼公式可以写成下图的矩阵表示。
这是另一个例子:
为什么要求解state value?
求解出state value后,方便我们去评价一个policy究竟是好还是坏。这也被称作policy evaluation
。
如何求解state value?
策略一: closed-form solution
但是,如果状态空间比较大,那么矩阵的维数也比较大,不方便求解。
策略二: iterative solution
在k=0时,假设对于所有的状态s, v π ( s ) v_{\pi}(s) vπ(s) 都等于0,把0带入到贝尔曼公式进行计算,得到k=1时的所有 v π ( s ) v_{\pi}(s) vπ(s) , 再把所有k=1时的 v π ( s ) v_{\pi}(s) vπ(s) 代入到贝尔曼公式进行计算,得到k=2时的所有 v π ( s ) v_{\pi}(s) vπ(s) …… 一直以此类推下去。可以证明,当k趋向于 无穷的时候, v k v_k vk 会收敛到 v π v_\pi vπ (证明过程略)。
下图展示了两个比较好的策略所计算出的state value.可以发现, (1)靠近target area的格子,它们的state value都比较大,远离target area的格子,它们的state value都比较小;(2)仔细观察能发现,上下两个策略略有不同,但他们算出来的state value都是一样的。所以即使策略不同,算出来的state value也可能相同。
下面是两个比较差的策略。格子的state value基本都是负值。因此可以更直观地发现,可以通过计算state value来评判一个policy是不是好。
五、Action value的定义
state value 和 action value有什么区别和联系呢?
state value 指的是从一个状态出发所得到的average return;
action value 指的是从一个状态出发,并且选择了一个action,所得到的average return。
为什么要关注action value?
因为强化学习的目标是得到一个最优策略,策略实际上是由一系列的action组成(在哪个状态应该选择什么样的action)。那么,对于若干可选的action,我可以选择哪些呢?这就需要根据action value来做判断。
下图是关于action value的定义。有两点需要注意:
(1)action value 是一个关于状态-动作对 ( s , a ) (s, a) (s,a) 的函数。
(2)action value 的值依赖于策略 π {\pi} π。
在数学上,action value 和 state value 有哪些联系?
本节开头种提到,state value 和 action value 实际上就差了一个动作a。所以 state value 可以写成 action value 再乘上 π ( a ∣ s ) \pi(a|s) π(a∣s) 的形式。如下图所示。
根据之前的推导,贝尔曼公式可以写成下图公式(3)的形式。通过比较式(2)和式(3),可以推导出action value的表达式。如下图种式(4)所示。
公式(2)告诉我们,如果知道了action value,就可以算出state value。
公式(4)告诉我们,如果知道了state value,可以算出action value。
下图是一个例子,看图写action value。因为这个图比较简单,所以可以通过判断“即时奖励”和“未来奖励”的方式很快手写出来。
Highlights:
(1)action value是非常重要的,可以帮助我们确定该选择哪个action。
(2)如何计算action value?有两种方法。第一,可以先把state value都算出来,再套公式计算action value。第二,可以通过数据的方式,不计算state value而直接计算出action value(未来会介绍)。
六、本节课内容summary
相关文章:
【强化学习的数学原理】第02课-贝尔曼公式-笔记
学习资料:bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接:强化学习的数学原理 西湖大学 赵世钰 文章目录 一、为什么return重要?如何计算return?二、state value的定义三、Bellman公式的详细推导四、公式向量形式…...
C语言-数学基础问题
一.奇数、偶数问题 1.从键盘上输入一个整数,判断并输出它是奇数还是偶数。 //从键盘上输入一个整数,判断并输出它是奇数还是偶数。 main() {int i;printf("输入一个整数:\n");scanf("%d",&i);if(i%20)printf("它是偶数\n…...
2024算法基础公选课练习四(综合2)
一、前言 最后几个题确实有难度,这次有两题没整出来 二、题目总览 三、具体题目 3.1 问题 A: 水题系列1-B(班级排位) 思路 最暴力的思路是写线段树,然后暴力枚举两个端点,总体时间复杂度为O(n^2*logn)最坏会到1e9的数量级,可能…...
小程序-使用 iconfont 图标库报错:Failed to load font
官方默认可以忽略此错误,在清除缓存后首次刷新会显示此错误,重新渲染错误消失 解决方法: 在 iconfont 图标库选择项目设置 选中 Base64 保存,重新点击链接 -> 复制代码到项目中 操作步骤:...
鲸鱼机器人和乐高机器人的比较
鲸鱼机器人和乐高机器人各有其独特的优势和特点,家长在选择时可以根据孩子的年龄、兴趣、经济能力等因素进行综合考虑,选择最适合孩子的教育机器人产品。 优势 鲸鱼机器人 1)价格亲民:鲸鱼机器人的产品价格相对乐高更为亲民&…...
解决单元测试时找不到类名
场景: springboot单元测试mockito对mapper进行mock时: tk.mybatis.mapper.mapperexception: 无法获取实体类 XX.xx 对应的表名 分析: 使用了一个方法:Example examplenew Example(User.class); 进入源码后发现Entityhelper没…...
簡單易懂:如何在Windows系統中修改IP地址?
無論是為了連接到一個新的網路,還是為了解決網路連接問題,修改IP地址都是一個常見的操作。本文將詳細介紹如何在Windows系統中修改IP地址,包括靜態IP地址的設置和動態IP地址的獲取。 IP地址是什麼? IP地址是互聯網協議地址的簡稱…...
(详细文档!)java swing学生信息管理系统 +mysql
第一章:系统功能分析 1.1、系统简介与开发背景 学生信息管理系统是在信息化时代,特别是在教育领域中产生的。随着学校规模的不断扩大和信息化技术的不断发展,传统的纸质档案管理方式已经无法满足学校对学生信息管理的需求,因此需…...
OSG开发笔记(三十三):同时观察物体不同角度的多视图从相机技术
若该文为原创文章,未经允许不得转载 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/143932273 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 长沙红胖子Qt…...
[极客大挑战 2019]BabySQL--详细解析
信息搜集 进入界面: 输入用户名为admin,密码随便输一个: 发现是GET传参,有username和password两个传参点。 我们测试一下password点位能不能注入: 单引号闭合报错,根据报错信息,我们可以判断…...
Java的字符串操作(二)(代码示例)
1. 字符串的定义 // 直接赋值方式定义字符串 String str1 "Hello World";// 使用new关键字定义字符串 String str2 new String("Hello World");// 可以通过打印对象的哈希码来查看是否是同一个对象(在一定程度上反映引用情况) Sy…...
2024-2025 ICPC, NERC, Southern and Volga Russian Regional Contest(ABCGJLN)
文章目录 N. Fixing the Expression思路code J. Waiting for...思路code C. DIY思路code L. Bridge Renovation思路code A. Bonus Project思路code G. Guess One Character思路code B. Make It Equal思路code N. Fixing the Expression 思路 签到题,只改变中间的字…...
SpringBoot(9)-Dubbo+Zookeeper
目录 一、了解分布式系统 二、RPC 三、Dubbo 四、SpringBootDubboZookeeper 4.1 框架搭建 4.2 实现RPC 一、了解分布式系统 分布式系统:由一组通过网络进行通信,为了完成共同的任务而协调工作的计算机节点组成的系统 二、RPC RPC:远程…...
现代密码学
概论 计算机安全的最核心三个关键目标(指标)/为:保密性 Confidentiality、完整性 Integrity、可用性 Availability ,三者称为 CIA三元组 数据保密性:确保隐私或是秘密信息不向非授权者泄漏,也不被非授权者使…...
websocket是什么?
一、定义 Websocket是一种在单个TCP连接上进行全双工通信的协议,它允许服务器主动向客户端推送数据,而不需要客户端不断的轮询服务器来获取数据 与http协议不同,http是一种无状态的,请求,响应模式的协议(单向通信)&a…...
idea怎么打开两个窗口,运行两个项目
今天在开发项目的时候,前端希望运行一下以前的项目,于是就需要开两个 idea 窗口,运行两个项目 这里记录一下如何设置:首先依次点击: File -> Settings -> Appearance & Behavior ->System Settings 看到如…...
aws服务--机密数据存储KMS(1)介绍和使用
在AWS(Amazon Web Services)中存储机密数据时,安全性和合规性是最重要的考虑因素。AWS 提供了多个服务和工具,帮助用户确保数据的安全性、机密性以及合规性。AWS Secrets Manager、KMS(Key Management Service)是推荐的存储机密数据的AWS服务和最佳实践。这里先看KMS。 …...
怎么编译OpenWrt镜像?-基于Widora开发板
1.准备相应的环境,我使用的环境是VMware16ubuntu20.04,如图1所示安装编译所需的依赖包; sudo apt-get install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 python2.7 unzip zlib1g-…...
Android opencv使用Core.hconcat 进行图像拼接
Android 集成OpenCV-CSDN博客 import org.opencv.android.Utils; import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.imgcodecs.Imgcodecs; import android.graphics.Bitmap; import android.graphics.BitmapFactor…...
小杨的N字矩阵c++
题目描述 小杨想要构造一个m*m 的 N 字矩阵( m为奇数),这个矩阵的从左上角到右下角的对角线、第1 列和第m 列都 是半角加号 ,其余都是半角减号 - 。例如,一个 5*5 的 N 字矩阵如下: --- -- -- -- --- 请…...
C 语言面向对象
面向对象的基本特性:封装,继承,多态 1.0 面向过程概念 当我们在编写程序时,通常采用以下步骤: 1. 将问题的解法分解成若干步骤 2. 使用函数分别实现这些步骤 3. 依次调用这些函数 这种编程风格的被称作 面向过程…...
初试无监督学习 - K均值聚类算法
文章目录 1. K均值聚类算法概述2. k均值聚类算法演示2.1 准备工作2.2 生成聚类用的样本数据集2.3 初始化KMeans模型对象,并指定类别数量2.4 用样本数据训练模型2.5 用训练好的模型生成预测结果2.6 输出预测结果2.7 可视化预测结果 3. 实战小结 1. K均值聚类算法概述…...
部署实战(二)--修改jar中的文件并重新打包成jar文件
一.jar文件 JAR 文件就是 Java Archive ( Java 档案文件),它是 Java 的一种文档格式JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中,多出了一个META-INF/MANIFEST.MF 文件META-INF/MANIFEST.MF 文件在生成 JAR 文件的时候…...
C++中的原子操作:原子性、内存顺序、性能优化与原子变量赋值
一、原子操作与原子性 原子操作(atomic operation)是并发编程中的一个核心概念,指的是在多线程环境中,一个操作一旦开始,就不会被其他线程的操作打断,直至该操作完成。这种不可分割的特性保证了操作的原子…...
【JavaEE初阶】多线程初阶下部
文章目录 前言一、volatile关键字volatile 能保证内存可见性 二、wait 和 notify2.1 wait()方法2.2 notify()方法2.3 notifyAll()方法2.4 wait 和 sleep 的对比(面试题) 三、多线程案例单例模式 四、总结-保证线程安全的思路五、对比线程和进程总结 前言…...
数据结构(Java版)第二期:包装类和泛型
目录 一、包装类 1.1. 基本类型和对应的包装类 1.2. 装箱和拆箱 1.3. 自动装箱和自动拆箱 二、泛型的概念 三、引出泛型 3.1. 语法规则 3.2. 泛型的优点 四、类型擦除 4.1. 擦除的机制 五、泛型的上界 5.1. 泛型的上界的定义 5.2. 语法规则 六、泛型方法 6.1…...
[原创](Modern C++)现在C++的关键性概念: 通俗易懂的解释“多态“与“虚函数“的内在关系
常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共23年] 职业生涯: 21年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi、XCode、Eclipse、C Bui…...
python操作Elasticsearch
使用elasticsearch 6.x版本,操作es数据。 #! -*- coding:utf-8 -* import timefrom elasticsearch import Elasticsearch, helpersclass EstUtil:_instance Nonedef __new__(cls, *args, **kwargs):if not cls._instance:cls._instance super(EstUtil, cls).__ne…...
【数据分享】2024年我国省市县三级的住宿服务设施数量(8类住宿设施/Excel/Shp格式)
宾馆酒店、旅馆招待所等住宿服务设施的配置情况是一个城市公共基础设施完善程度的重要体现,一个城市住宿服务设施种类越丰富,数量越多,通常能表示这个城市的公共服务水平越高! 本次我们为大家带来的是我国各省份、各地级市、各区…...
从尾到头打印链表 剑指offer
题目描述 输入一个链表的头节点,从尾到头反过来打印出每个节点的值。 链表节点定义如下: struct ListNode {int m_nKey;ListNode*m_pNext; }; 代码实现 栈实现: 递归实现: 但是用递归实现可能存在的问题:...
【测试工具JMeter篇】JMeter性能测试入门级教程(二)出炉,测试君请各位收藏了!!!
上篇文章:CSDN 我们介绍了JMeter的一些原理介绍,以及安装配置和启动流程,本文我们就来讲讲JMeter如何使用。 一、JMeter目录结构组成 1. 根目录 Jmeter安装包解压后的根目录如下图: 1.1 backups目录:脚本备份目录&am…...
【JavaEE】Servlet:表白墙
文章目录 一、前端二、前置知识三、代码1、后端2、前端3、总结 四、存入数据库1、引入 mysql 的依赖,mysql 驱动包2、创建数据库数据表3、调整上述后端代码3.1 封装数据库操作,和数据库建立连接3.2 调整后端代码 一、前端 <!DOCTYPE html> <ht…...
WPF中如何让Textbox显示为一条直线
由于Textbox直接使用是一条直线 设置如下代码 可以让Textbox变为直线输入 <Style TargetType"TextBox"x:Key"UsernameTextBoxStyle"><Setter Property"Template"><Setter.Value><ControlTemplate TargetType"{x:Typ…...
多维数组与特殊矩阵:存储与压缩
多维数组与特殊矩阵:存储与压缩 一、多维数组的存储 (一)基本概念 多维数组是线性表的推广,例如二维数组可以看作是元素为一维数组的线性表,三维数组可以看作是元素为二维数组的线性表,以此类推。在内存…...
第三讲 架构详解:“隐语”可信隐私计算开源框架
目录 隐语架构 隐语架构拆解 产品层 算法层 计算层 资源层 互联互通 跨域管控 本文主要是记录参加隐语开源社区推出的第四期隐私计算实训营学习到的相关内容。 隐语架构 隐语架构拆解 产品层 产品定位: 通过可视化产品,降低终端用户的体验和演…...
springboot项目使用maven打包,第三方jar问题
springboot项目使用maven package打包为可执行jar后,第三方jar会被打包进去吗? 答案是肯定的。做了实验如下: 第三方jar的项目结构及jar包结构如下:(该第三方jar采用的是maven工程,打包为普通jar…...
突破内存限制:Mac Mini M2 服务器化实践指南
本篇文章,我们聊聊如何使用 Mac Mini M2 来实现比上篇文章性价比更高的内存服务器使用,分享背后的一些小的思考。 希望对有类似需求的你有帮助。 写在前面 在上文《ThinkPad Redis:构建亿级数据毫秒级查询的平民方案》中,我们…...
【Linux】Linux系统电源状态
前言 本文主要介绍Linux系统电源状态。 Linux内核代码声明如下,位于kernel/power/suspend.c。 参考链接 Linux系统电源状态 在Linux操作系统中,将电源划分为如下几个状态: ACPI StateLinux StateDescriptionS0On(on)WorkingS1Standby(sta…...
《用Python画蔡徐坤:艺术与编程的结合》
简介 大家好!今天带来一篇有趣的Python编程项目,用代码画出知名偶像蔡徐坤的形象。这个项目使用了Python的turtle库,通过简单的几何图形和精心设计的代码来展示艺术与编程的结合。 以下是完整的代码和效果介绍,快来试试看吧&…...
ARM(安谋) China处理器
0 Preface/Foreword 0.1 参考博客 Cortex-M23/M33与STAR-MC1星辰处理器 ARM China,2018年4月established,独立运行。 1 处理器类型 1.1 周易AIPU 1.2 STAR-MC1(星辰处理器) STAT-MC1,主要为满足AIOT应用性能、功…...
硬中断关闭后的堆栈抓取方法
一、背景 性能和稳定性是一个计算机工程里的一个永恒的主题。其中尤其稳定性这块的问题发现和问题分析及问题解决就依赖合适的对系统的观测的手段,帮助我们发现问题,识别问题原因最后才能解决问题。稳定性问题里尤其底层问题里,除了panic问题…...
电影风格城市夜景旅拍Lr调色教程,手机滤镜PS+Lightroom预设下载!
调色教程 电影风格城市夜景旅拍通过 Lightroom 调色,将城市夜晚的景色打造出如同电影画面般的质感和氛围。以独特的色彩和光影处理,展现出城市夜景的魅力与神秘。 预设信息 调色风格:电影风格预设适合类型:人像,街拍…...
基于FPGA的2FSK调制-串口收发-带tb仿真文件-实际上板验证成功
基于FPGA的2FSK调制 前言一、2FSK储备知识二、代码分析1.模块分析2.波形分析 总结 前言 设计实现连续相位 2FSK 调制器,2FSK 的两个频率为:fI15KHz,f23KHz,波特率为 1500 bps,比特0映射为f 载波,比特1映射为 载波。 1)…...
【Python】构建事件驱动架构:用Python实现实时应用的高效系统
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 事件驱动架构(Event-Driven Architecture,EDA)是一种基于事件流动进行系统设计的模式,广泛应用于游戏开发、实时监控和分布式系统中。它通过解耦事件的生产者和消费者,提升系统的可扩展性和灵活性。本文章从…...
安装 Docker(使用国内源)
一、安装Docker-ce 1、下载阿里云的repo源 [rootlocalhost ~]# yum install yum-utils -y && yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo && yum makecache # 尝试列出 docker-ce 的版本 [rootlocalh…...
001 MATLAB介绍
前言: 软件获取渠道有很多,难点也就是百度网盘下载慢; 线上版本每月有时间限制。 01 MATLAB介绍 性质: MATLAB即Matrix Laboratory 矩阵实验室的意思,是功能强大的计算机高级语言, 已广泛应用于各学科研究部门、…...
vscode利用ofExtensions插件可以调试单进程Openfoam,但是不能调试mpi多进程案例
问题: 准备调试流固耦合案例,包括流体和固体的,但是用ofextensions插件。但是流体的话使用的是域分解方法,将大的单元分成了小的单元用mpi并行处理,里面的program必须输入"/usr/bin/mpirun", // 这里改为使…...
2022年计算机网络408考研真题解析
第一题: 解析:网络体系结构-数据链路层 在ISO网络参考模型中,运输层,网络层和数据链路层都实现了流量的控制功能,其中运输层实现的是端到端的流量控制,网络层实现的是整个网络的流量控制,数据链…...
React-useEffect的使用
useEffect react提供的一个常用hook,用于在函数组件中执行副作用操作,比如数据获取、订阅或手动更改DOM。 基本用法: 接受2个参数: 一个包含命令式代码的函数(副作用函数)。一个依赖项数组,用…...
python学习笔记(10)算法(3)列表
一、列表 列表(list)是一个抽象的数据结构概念,它表示元素的有序集合,支持元素访问、修改、添加、删除和遍历 等操作,无须使用者考虑容量限制的问题。列表可以基于链表或数组实现。 ‧ 链表天然可以看作一个列表&#…...