多智能体强化学习论文导读

news2025/9/19 19:34:57

Adaptive Value Decomposition with Greedy Marginal Contribution Computation for Cooperative Multi-Agent Reinforcement Learning

Dec-POMDP

本文的研究对象是 decentralized partially observable Markov decision process (Dec-POMDP), 我们首先来看一下它和经典的MDP有什么不同?

(1) 奖励设定不同, 这里没有给到每一个agent的奖励, 只有一个整体奖励(team reward) r t o t ( s , u ) r_{tot}(\bm{s}, \bm{u}) rtot(s,u).
(2) 每个agent i i i 观测到的不是它自己的状态 s i s_{i} si, 它的观测要根据具体的设定来确定, 为表示区分常用 o i o_{i} oi 来表示.
(3) 新增了一个叫做 view range 的概念, 每个 agent 都有一个 view range, 在这个范围里面的其他 agent 对它来说是有关联的, 也就是它们之间会相互影响, 且它的观测信息里包含它们的信息, 超出这个范围的 agent 视为无关, 完全独立, 其状态也不可见.

一些基本的符号: N N N: agent数量.

本文做了如下的一些假设:

reward 机制

考虑 agent i i i 的奖励, 定义 agent i i i 视野范围内的 agent 集合为它的团队(team), 记其数量为 M i M_{i} Mi, 作者认为 i i i 自己的奖励 r t e a m i r_{team}^{i} rteami 与 joint state, joint action 有关, 而根据设定(3), 只有 view range 里的 agent 对它有影响, 因此只需包含 view range 里的 agent 的状态和动作, 根据设定, view range 里其他 agent 的状态信息在 o i o_{i} oi 中包含, 在此基础上加上其它 agent 采取的动作 u i − u_{i}^{-} ui, 以及agent i i i 本身的动作 u i u_i ui, 即可得到 joint action, 所有 agent 获得的奖励之和是 team reward r t o t r_{tot} rtot, 即

r t o t ( s , u ) = ∑ i = 1 N r t e a m i ( o i , u i − , u i ) r_{tot}(\bm{s}, \bm{u})=\sum_{i=1}^{N}r_{team}^{i}(o_{i}, u_{i}^{-}, u_{i}) rtot(s,u)=i=1Nrteami(oi,ui,ui)
对于 r t e a m i r_{team}^{i} rteami 的具体形式, 作者也做了如下的论断: 每一个 agent 都有一个 team, 同时它还可能在其他 agent的 team 里面, 作者认为 Q t o t Q_{tot} Qtot 的构成形式是, 每个 agent 的 team 都有一个 reward, 加和得到 Q t o t Q_{tot} Qtot, 在一个 team 里面, team reward 又均匀分配给每个 agent. 每个 agent 最终得到的 reward 就是它从它所参与到的team 的 reward 里面分到的 reward 累加得到的. 打个比方, 有 10 个人, 每个人都有一个公司, 同时也在别人的公司里参股, 到年底分红时, (认为分红是均分), 每个人得到的钱是它创办/参股的公司的分红加和. 用符号语言描述如下:

r t o t ( s , u ) = ∑ i = 1 N r ^ 1 ( o i , u i ) + ∑ 1 ≤ i < j ≤ N r ^ 2 ( o i , o j , u i , u j ) + . . . + r ^ N ( o 1 , . . . , o N , u 1 , . . . , u N ) r_{tot}(\mathbf{s},\mathbf{u}) = \sum\limits_{i=1}^{N}\hat{r}_{1}(o_{i}, u_{i}) + \sum\limits_{1\leq i<j\leq N} \hat{r}_{2}(o_{i},o_{j}, u_{i}, u_{j})+...+ \hat{r}_{N}(o_{1},..., o_{N}, u_{1}, ..., u_{N}) rtot(s,u)=i=1Nr^1(oi,ui)+1i<jNr^2(oi,oj,ui,uj)+...+r^N(o1,...,oN,u1,...,uN)

其中 r ^ n ( . . . ) \hat{r}_{n}(...) r^n(...) 表示由这 n n n 个 agent 组成的所有 team 的 reward 之和, 如果这个team 不存在这一项就是 0 0 0, r ^ 2 ( o i , o j , u i , u j ) \hat{r}_{2}(o_{i},o_{j}, u_{i}, u_{j}) r^2(oi,oj,ui,uj) 是指 i i i, j j j 组成的 team (例如 i i i 为中心, 包含 j j j 的team 和 j j j 为中心, 包含 i i i 的 team) 的 reward.

每一个 agent 的 reward 如下:

r t e a m i ( o i , u i − , u i ) = r ^ 1 ( o i , u i ) + 1 2 ∑ 1 ≤ j ≤ N , j ≠ i r ^ 2 ( o i , o j , u i , u j ) + . . . + 1 N r ^ N ( o 1 , . . . , o N , u 1 , . . . , u N ) r_{team}^{i}(o_{i}, u_{i}^{-}, u_{i}) = \hat{r}_{1}(o_{i}, u_{i}) + \frac{1}{2}\sum\limits_{1 \leq j\leq N, j\neq i} \hat{r}_{2}(o_{i},o_{j}, u_{i}, u_{j})+...+ \frac{1}{N}\hat{r}_{N}(o_{1},..., o_{N}, u_{1}, ..., u_{N}) rteami(oi,ui,ui)=r^1(oi,ui)+211jN,j=ir^2(oi,oj,ui,uj)+...+N1r^N(o1,...,oN,u1,...,uN)

价值函数

team reward 对应得到的 Q 函数: Q t o t π ( s , u ) Q_{tot}^{\bm \pi}(\bm{s}, \bm{u}) Qtotπ(s,u),
Q t o t π ( s , u ) = E τ ∼ π ∣ s 0 = s , u 0 = u { ∑ t = 0 ∞ γ t r t o t } = E τ ∼ π ∣ s 0 = s , u 0 = u { ∑ t = 0 ∞ γ t ∑ i = 1 N r t e a m i } = ∑ i = 1 N E τ ∼ π ∣ s 0 = s , u 0 = u { ∑ t = 0 ∞ γ t r t e a m i } Q_{tot}^{\bm\pi}(\bm{s}, \bm{u})=\mathbb{E}_{\bm\tau\sim \bm\pi|_{\bm{s_{0}}=\bm{s}, \bm{u_{0}}=\bm{u}}}\{\sum_{t=0}^{\infty}\gamma^{t}r_{tot}\}=\mathbb{E}_{_{\bm\tau\sim \bm\pi|_{\bm{s_{0}}=\bm{s}, \bm{u_{0}}=\bm{u}}}}\{\sum_{t=0}^{\infty}\gamma^{t}\sum_{i=1}^{N}r_{team}^{i}\} \\=\sum_{i=1}^{N}\mathbb{E}_{_{\bm\tau\sim \bm\pi|_{\bm{s_{0}}=\bm{s}, \bm{u_{0}}=\bm{u}}}}\{\sum_{t=0}^{\infty}\gamma^{t}r_{team}^{i}\} Qtotπ(s,u)=Eτπs0=s,u0=u{t=0γtrtot}=Eτπs0=s,u0=u{t=0γti=1Nrteami}=i=1NEτπs0=s,u0=u{t=0γtrteami}
定义 E τ ∼ π ∣ s 0 = s , u 0 = u { ∑ t = 0 ∞ γ t r t e a m i } = Q i π ( s i , u i − , u i ) \mathbb{E}_{_{\bm\tau\sim \bm\pi|_{\bm{s_{0}}=\bm{s}, \bm{u_{0}}=\bm{u}}}}\{\sum_{t=0}^{\infty}\gamma^{t}r_{team}^{i}\}=Q^{\bm{\pi}}_{i}(s_{i}, u_{i}^{-}, u_{i}) Eτπs0=s,u0=u{t=0γtrteami}=Qiπ(si,ui,ui), 这里 Q i π ( s i , u i − , u i ) Q^{\bm{\pi}}_{i}(s_{i}, u_{i}^{-}, u_{i}) Qiπ(si,ui,ui) 被称作agent i i i 的 individual Q 函数,则 Q t o t ( s , u ) Q_{tot}(\bm{s}, \bm{u}) Qtot(s,u) 可以分解成这种形式:

Q t o t π ( s , u ) = ∑ i = 1 N Q i π ( s i , u i − , u i ) Q_{tot}^{\bm\pi}(\bm{s}, \bm{u})=\sum_{i=1}^{N}Q^{\bm{\pi}}_{i}(s_{i}, u_{i}^{-}, u_{i}) Qtotπ(s,u)=i=1NQiπ(si,ui,ui)
还可以得到如下的结论: u ∗ = arg max ⁡ u Q t o t ( s , u ) \bm{u}^{*}=\argmax_{\bm u}Q_{tot}(\bm{s}, \bm{u}) u=argmaxuQtot(s,u) 满足

u i ∗ = arg max ⁡ u i Q i π ( s i , u i ∗ − , u i ) u_{i}^{*}=\argmax_{u_{i}} Q^{\bm{\pi}}_{i}(s_{i}, u_{i}^{*-}, u_{i}) ui=uiargmaxQiπ(si,ui∗−,ui)

也就是说最佳的 joint action 一定是一个纳什均衡, 每一个 agent 站在自己的角度来看待自己的动作都是最优的.

策略

本文没有采用 actor network 来近似 policy, policy 的近似形式如下: 刚刚定义的 Q i π ( s i , u i − , u i ) Q^{\bm{\pi}}_{i}(s_{i}, u_{i}^{-}, u_{i}) Qiπ(si,ui,ui) 被称作 centralized Q 函数, 下文中的下标中标注 c c c, 作者还为每个 agent 定义了一个函数 decentralized Q: Q i ( s i , u i ) Q_{i}(s_{i}, u_{i}) Qi(si,ui), 下文中的下标中标注 p p p, 且认为策略是对于这个 Q 函数 greedy 的:
π ( s i ) = arg max ⁡ u i Q p , i ( s i , u i ) \pi(s_{i})=\argmax_{u_{i}} {Q_{p,i}(s_{i}, u_{i})} π(si)=uiargmaxQp,i(si,ui)

Q value function 的近似

Q i Q_{i} Qi 近似地取成如下形式: Q p , i ( s i , u i ) ≈ Q p , i ( τ i , u i ) Q_{p,i}(s_{i}, u_{i})\approx Q_{p,i}(\tau_{i}, u_{i}) Qp,i(si,ui)Qp,i(τi,ui), 其中 τ i , t = { o i , 1 , u i , 1 , . . . , o i , t } \tau_{i, t}=\{o_{i,1}, u_{i,1}, ..., o_{i,t}\} τi,t={oi,1,ui,1,...,oi,t}, 称为 history. Q c , i π ( s i , u i − , u i ) Q^{\bm{\pi}}_{c,i}(s_{i}, u_{i}^{-}, u_{i}) Qc,iπ(si,ui,ui) 同理.

Q p Q_p Qp 的 target

M i = 0 M_i = 0 Mi=0 时, Q c , i π ( s i , u i − , u i ) Q^{\bm{\pi}}_{c,i}(s_{i}, u_{i}^{-}, u_{i}) Qc,iπ(si,ui,ui) 退化为只与 s i , u i s_i, u_i si,ui 有关, 因此文中把 Q c , i π ( s i , u i − , u i ) Q^{\bm{\pi}}_{c,i}(s_{i}, u_{i}^{-}, u_{i}) Qc,iπ(si,ui,ui) 表示为

Q c , i π ( s i , u i − , u i ) = { Q c o l l , i π ( s i , u i − , u i ) , M i > 0 Q a l o n e , i π ( s i , u i ) , M i = 0 Q_{c,i}^{\bm \pi}(s_{i}, u_{i}^{-}, u_{i}) = \begin{cases} & Q_{coll, i}^{\bm \pi}(s_{i}, u_{i}^{-}, u_{i}),& M_{i} \gt 0 \\ & Q_{alone,i}^{\bm \pi}(s_{i}, u_{i}),&M_{i} = 0 \end{cases} Qc,iπ(si,ui,ui)={Qcoll,iπ(si,ui,ui),Qalone,iπ(si,ui),Mi>0Mi=0
coll 是 collaborate 的缩写.

⋆ \star Q p Q_{p} Qp 的 target 如下:

L p ( μ ) = { E [ Q p , i ( τ i , u i ) − ϕ i ∗ ( τ i , u i ) ] 2 , M i > 0 E [ Q p , i ( τ i , u i ) − Q a l o n e , i π ( τ i , u i ) ] , M i = 0 L_{p}(\mu) = \begin{cases} & \mathbb{E}[Q_{p,i}(\tau_{i}, u_{i})-\phi_{i}^{*}(\tau_{i}, u_{i})]^2, & M_{i} \gt 0 \\ & \mathbb{E}[Q_{p,i}(\tau_{i}, u_{i})-Q_{alone,i}^{\bm \pi}(\tau_{i},u_{i})], & M_{i}=0 \end{cases} Lp(μ)={E[Qp,i(τi,ui)ϕi(τi,ui)]2,E[Qp,i(τi,ui)Qalone,iπ(τi,ui)],Mi>0Mi=0

其中 ϕ i ∗ ( τ i , u i ) = Q c o l l , i π ( τ i , u i ∗ − , u i ) − Q c o l l , i π ( τ i , u i ∗ − , u i s e l f i s h ) \phi_{i}^{*}(\tau_{i}, u_{i})=Q_{coll, i}^{\bm \pi}(\tau_{i}, u_{i}^{*-}, u_{i})-Q_{coll, i}^{\bm \pi}(\tau_{i}, u_{i}^{*-}, u_{i}^{selfish}) ϕi(τi,ui)=Qcoll,iπ(τi,ui∗−,ui)Qcoll,iπ(τi,ui∗−,uiselfish)
( u i ∗ − , u i ∗ ) = arg max ⁡ u i − , u i ( Q c o l l i ( τ i , u i − , u i ) ) (u_{i}^{*-}, u_{i}^{*})=\argmax_{u_{i}^{-}, u_{i}}(Q_{coll}^{i}(\tau_{i}, u_{i}^{-}, u_{i})) (ui∗−,ui)=argmaxui,ui(Qcolli(τi,ui,ui))
ϕ i ∗ ( τ i , u i ) \phi_{i}^{*}(\tau_{i}, u_{i}) ϕi(τi,ui) 的意思是动作 u i u_{i} ui 相较于完全 selfish 的动作的 advantage, 作者认为完全 selfish 的动作通常是最差的, 只有趋于合作才能提高 reward.
其他 agent 的动作为何选用 u i ∗ − u_{i}^{*-} ui∗−? 文中解释: we encourage the agent to learn each action’s value based on the optimistic belief that the possibility of other agents to take non-cooperative action is zero so that all other agents would cooperate with itself. As the main problem in the non-monotonic environment is that agents tend to take lazy actions fearing other agents not cooperating, this optimistic belief can facilitate exploration by increasing the probability of sampling cooperative actions and promises that agents will jump off the suboptimal policy to converge to the optimal cooperative policy. 简言之, 作者就是防止 agent 因为害怕其它 agent 不合作而采用不合作的动作, 所以在为 agent 选择动作的时候强行施加了一个 optimistic assumption, 让 agent 始终认为其他 agent 会和它合作.

selfish 的动作怎么选? 文中提出令 u i s e l f i s h = arg max ⁡ u i Q a l o n e , i π ( τ i , u i ) u_{i}^{selfish}=\argmax_{u_{i}}Q_{alone,i}^{\bm\pi}(\tau_{i}, u_{i}) uiselfish=argmaxuiQalone,iπ(τi,ui). 当 M i = 0 M_{i}=0 Mi=0 时, 说明它的 view range 里只有它自己, 此时的 Q a l o n e , i π Q_{alone,i}^{\bm \pi} Qalone,iπ 可以认为是 selfish 的, 因此 selfish 的动作可以这么取.

采用 attention 机制对其他agent的信息进行 encode

为介绍原理, 我们引入论文 Actor-Attention-Critic for Multi-Agent Reinforcement Learning 中相关部分的介绍:
加入 agent i i i 收到了一组其他 agent 的观测和动作信息: observation o = { o i } \bm{o}=\{o_{i}\} o={oi}, i = 1 , . . . , N i=1,..., N i=1,...,N 和 action a = { a i } \bm{a}=\{a_{i}\} a={ai}, i = 1 , . . . , N i=1,..., N i=1,...,N, attention 机制是这样对其进行 encode 的:
(1) 对每个 agent 的 observation 和 action 进行编码, 采用一个 one-layer MLP 作为 embedding function, 记为 e k = g ( o k , a k ) e_{k}=g(o_{k},a_{k}) ek=g(ok,ak);
(2) 计算每个 agent j ≠ i j\neq i j=i 的信息重要程度, 以一个权重系数 α j \alpha_{j} αj 表示, 称为 “attention 系数”:
α j ∝ exp ⁡ ( e j T W k e y T W q u e r y e i ) α_j \propto \exp(e_{j}^T W_{key}^TW_{query}e_i) αjexp(ejTWkeyTWqueryei)
这里 W k e y W_{key} Wkey W q u e r y W_{query} Wquery 都是一个长宽等于 embedding 长度的方阵, 是可学习的变量组成的, 分别对 e j e_{j} ej e i e_{i} ei 的信息进行二次提取, 提取后的信息称为 key 和 query. 其设计思想是这样的, e j T W k e y T W q u e r y e i e_{j}^T W_{key}^TW_{query}e_i ejTWkeyTWqueryei 实际上是对二次提取后的 embedding 信息进行一个内积, 计算其相近的程度, 这里 exp ⁡ \exp exp 函数防止梯度消失. 这里认为 embedding 和 e i e_{i} ei 的 embedding 相似程度高的 agent 是重要的 agent, 因此又以其作为权重系数.
(3) 计算其他 agent 的信息 encode 的结果:
x i = ∑ j ≠ i α j h ( V g ( o i , a i ) ) x_{i} = \sum\limits_{j\neq i}\alpha_{j}h(Vg(o_{i}, a_{i})) xi=j=iαjh(Vg(oi,ai))
其中 V V V 是一个 shared matrix, 也是可学习的参数组成的, h h h 是 element-wise nonlinearity, 也就是激活函数, h ( V g ( o i , a i ) ) h(Vg(o_{i}, a_{i})) h(Vg(oi,ai)) 记作 v j v_{j} vj.

算法流程

在这里插入图片描述

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

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

相关文章

用HTTP proxy module配置一个而反向代理服务器

反向代理与正向代理 摘抄&#xff1a;https://cloud.tencent.com/developer/article/1418457 正向代理 正向代理&#xff08;forward proxy&#xff09;&#xff1a;是一个位于客户端和目标服务器之间的服务器(代理服务器)&#xff0c;为了从目标服务器取得内容&#xff0c;…

2023-04-11 无向图的匹配问题

无向图的匹配问题 之所以把无向图的这个匹配问题放到最后讲是因为匹配问题借鉴了有向图中一些算法的思想 1 最大匹配和完美匹配 二分图回顾 二分图&#xff1a;把一个图中的所有顶点分成两部分&#xff0c;如果每条边的两端分别属于不同部分&#xff0c;则这个图是二分图。更多…

银行数字化转型导师坚鹏:金融科技与数字化转型成功案例

金融科技与数字化转型成功案例课程背景&#xff1a; 数字化转型背景下&#xff0c;很多银行存在以下问题&#xff1a; 不清楚金融科技如何赋能数字化转型&#xff1f; 不清楚银行金融科技体系的建设情况&#xff1f; 不了解银行数字化转型标杆成功案例&#xff1f; 课程特色…

AD六层板布线经验累积

目录 1、布局&#xff1a; 2、创建电源类PWR 3、高速部分可以加屏蔽罩&#xff0c; 4、EMMC和NANDFLASH采取兼容放置&#xff08;创建联合&#xff09; 5、HDMI设计 6、就近原则摆放 7、AV端口 8、模拟信号&#xff08;1字型或L型走线&#xff09; 9、WIFI模块 10、局…

Python+ChatGPT实战之进行游戏运营数据分析

文章目录一、数据二、目标三、解决方案1. DAU2. 用户等级分布3. 付费率4. 收入情况5. 付费用户的ARPU最近ChatGPT蛮火的&#xff0c;今天试着让ta写了一篇数据分析实战案例&#xff0c;大家来评价一下&#xff01;一、数据 您的团队已经为您提供了一些游戏数据&#xff0c;包括…

考研数二第十七讲 反常积分与反常积分之欧拉-泊松(Euler-Poisson)积分

反常积分 反常积分又叫广义积分&#xff0c;是对普通定积分的推广&#xff0c;指含有无穷上限/下限&#xff0c;或者被积函数含有瑕点的积分&#xff0c;前者称为无穷限广义积分&#xff0c;后者称为瑕积分&#xff08;又称无界函数的反常积分&#xff09;。 含有无穷上限/下…

基于粒子群优化算法的分布式电源选址与定容【多目标优化】【IEEE33节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

接口自动化测试面试常问的题目及答案,你都会了吗?

目录 前言 接口自动化测试的优势是什么&#xff1f; 你使用过哪些接口自动化测试工具&#xff1f; 你如何设计一个接口自动化测试用例&#xff1f; 接口自动化测试中常见的测试类型有哪些&#xff1f; 你如何解决接口自动化测试中遇到的问题&#xff1f; 如何进行接口自动…

专属大模型来了!还有ECS降价40%、50款产品免费试用|阿里云峰会亮点一览

4 月 11 日&#xff0c;阿里巴巴集团董事会主席兼 CEO、阿里云智能集团 CEO 张勇在云峰会上表示&#xff0c;阿里巴巴所有产品未来将接入“通义千问”大模型&#xff0c;进行全面改造。 自 2019 年起&#xff0c;阿里即开始进行大模型研究&#xff0c;并在近期推出阶段性的研究…

Google Play 政策更新 | 2023 年 4 月

我们一如既往地努力让 Google Play 成为值得开发者和用户信赖的安全平台&#xff0c;欢迎您通过 Google Play PolicyBytes 中文视频了解本次政策更新的具体内容&#xff0c;更及时更清晰地掌握 Google Play 最新政策。△ Google Play 政策更新 | 2023 年 4 月Bilibili 视频链接…

ch03-PyTorch模型搭建

ch03-PyTorch模型搭建0.引言1.模型创建步骤与 nn.Module1.1. 网络模型的创建步骤1.2. nn.Module1.3. 总结2.模型容器与 AlexNet 构建2.1. 模型容器2.1.1.nn.Sequential2.1.2.nn.ModuleList2.1.3.nn.ModuleDict2.2. AlexNet 构建2.3. 总结3.nn 网络层&#xff1a;卷积层3.1. 1d/…

图像语义分割与目标检测概述

在计算机视觉领域,不仅有图像分类的任务&#xff0c;还有很多更复杂的任务&#xff0c;如对图像中的目标进行检测和识别&#xff0c;对图像进行实例分割和语义分割等。其中在基于卷积神经网络的深度学习算法出现后&#xff0c;图像的语义分割和目标检测的精度也有了质的提升。 …

绘制ROC曲线及P-R曲线

绘制ROC曲线及P-R曲线 描述 ROC曲线&#xff08;Receiver Operating Characteristic Curve&#xff09;以假正率&#xff08;FPR&#xff09;为X轴、真正率&#xff08;TPR&#xff09;为y轴。曲线越靠左上方说明模型性能越好&#xff0c;反之越差。ROC曲线下方的面积叫做AUC…

视频动态库测试及心得

视频动态库测试及心得 这几天一直在弄动态库测试&#xff0c;h给的写好的动态库--预处理模块的库。视频处理项目一部分&#xff0c;需要连接实际情况测试。 需求&#xff1a; 1.把实际相机连接到&#xff0c;并读取实时数据流&#xff0c;保存到双循环链表里面; 2.测试背景建模…

wsl安装torch_geometric

在官网选择需要的版本 选择安装途径&#xff0c;选择runfile 执行第一行&#xff0c;会下载一个文件到目录下 需要降低C的版本&#xff0c;否则 执行sudo sh cuda_11.1.0_455.23.05_linux.run,会出现 查看对应的文件&#xff0c;会有 可以加上override参数之后&#xff0c;…

了解 WAIT_ABANDONED 返回值的重要性

互斥锁(Mutex)和其他同步对象之间的重要区别之一是&#xff1a;互斥锁具有所有者。如果拥有互斥锁的线程退出而没有释放互斥锁&#xff0c;则互斥锁会自动释放。 但如果发生这种情况&#xff0c;你就有大麻烦了。 许多人忽略的一件事是同步函数&#xff08;如 WaitForSingleO…

如何写一个优质高效的网络项目实施方案?这篇文章值得收藏!

随着互联网技术的不断发展&#xff0c;网络项目的实施成为了许多企业和组织的重要任务。网络项目实施方案是指在进行网络项目实施时&#xff0c;为了保障项目的顺利进行&#xff0c;达到项目目标和交付要求&#xff0c;所制定的详细计划和操作指南。一个好的网络项目实施方案对…

数据结构 - 快排 | C

目录快速排序①hoare版本思路分析代码实现时间复杂度<整体优化><局部优化>②挖坑法思路分析代码实现③前后指针法思路分析代码实现④非递归快排思路分析代码实现以上代码汇总快速排序 ①hoare版本 思路分析 以上图为例&#xff1a; 指定一个数为a[key] 6&#x…

使用大华惠智双目半球网络摄像机DH-IPC-HD4140X-E2获取人流量统计数据

记录一下使用Java的SpringBoot大华SDK在智慧公厕项目中使大华惠智双目半球网络摄像机DH-IPC-HD4140X-E2获取人流量统计数据 首先根据说明书登录摄像头&#xff0c;一般摄像头都有自己的账号和密码(可能是admin admin 也可能是admin 888888 还有可能是admin 12345)&#xff0c;…

VMware ESXi 7.0 U3l Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

ESXi 7 U3 标准版集成 Intel 网卡、USB 网卡 和 NVMe 驱动 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-7-u3-sysin/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 2023-03-31&#xff0c;发布 ESXi 7.0U…