【RL】Monte Carlo Learning(蒙特卡洛学习)

Lecture 5: Monte Carlo Learning

The simplest MC-based RL algorithm: MC Basic

理解MC basic算法的关键是理解如何将policy iteration算法迁移到model-free的条件下。

Policy iteration算法在每次迭代过程中有两步:
{ Policy evaluation:  v π k = r π k + γ P π v π k Policy improvement:  π k + 1 = argmax π ( r π + γ P π v π k ) \begin{cases} \text{Policy evaluation: } \mathbf{v}_{\pi_k} = \mathbf{r}_{\pi_k} +\gamma \mathbf{P}_{\pi} \mathbf{v}_{\pi_k} \\ \text{Policy improvement: } \mathbf{\pi}_{k+1} = \text{argmax}_{\pi} (\mathbf{r}_{\pi} + \gamma \mathbf{P}_{\pi} \mathbf{v}_{\pi_k}) \end{cases} {Policy evaluation: vπk=rπk+γPπvπkPolicy improvement: πk+1=argmaxπ(rπ+γPπvπk)
Policy improvement阶段的元素表现形式为:
π k + 1 ( s ) = argmax π ∑ a π ( a ∣ s ) [ ∑ r p ( r ∣ s , a ) + γ ∑ s ′ p ( s ′ ∣ s , a ) v π k ( s ′ ) ] = argmax π ∑ a π ( a ∣ s ) q π k ( s , a ) \begin{align*} \pi_{k+1}(s) &= \text{argmax}_{\pi} \sum_a \pi(a | s) \left[ \sum_r p(r | s, a) + \gamma \sum_{s'}p(s' | s, a) v_{\pi_k}(s') \right] \\ &= \text{argmax}_{\pi} \sum_a \pi(a | s)q_{\pi_k}(s, a) \end{align*} πk+1(s)=argmaxπaπ(as)[rp(rs,a)+γsp(ss,a)vπk(s)]=argmaxπaπ(as)qπk(s,a)
其中,关键是 q π k ( s , a ) q_{\pi_k}(s, a) qπk(s,a)

action value 的两种表达形式

Expression 1: model-based 方法
q π k ( s , a ) = ∑ r p ( r ∣ s , a ) + γ ∑ s ′ p ( s ′ ∣ s , a ) v π k ( s ′ ) q_{\pi_k}(s, a) = \sum_r p(r | s, a) + \gamma \sum_{s'}p(s' | s, a) v_{\pi_k}(s') qπk(s,a)=rp(rs,a)+γsp(ss,a)vπk(s)
Expression 2: model-free方法
q π k ( s , a ) = E [ G t ∣ S t = s , A t = a ] q_{\pi_k}(s, a) = \mathbb{E}[G_t | S_t = s, A_t = a] qπk(s,a)=E[GtSt=s,At=a]
因此,对于model-free的RL算法,可以直接利用数据(samples或experiences)使用expression 2的方法计算 q π k ( s , a ) q_{\pi_k}(s, a) qπk(s,a)

action values的Monte Carlo estimation步骤:

  • ( s , a ) (s, a) (s,a)开始,按照policy π k \pi_k πk,生成一个episode。

  • 计算episode的return g ( s , a ) g(s, a) g(s,a)

  • 对不同的 g ( s , a ) g(s, a) g(s,a)采用,计算 G t G_t Gt
    q π k ( s , a ) = E [ G t ∣ S t = s , A t = a ] q_{\pi_k}(s, a) = \mathbb{E}[G_t | S_t = s, A_t = a] qπk(s,a)=E[GtSt=s,At=a]

  • 假设已经获得一个episode集合,那么即拥有 { g ( j ) ( s , a ) } \{ g^{(j)}(s, a) \} {g(j)(s,a)},则
    q π k ( s , a ) = E [ G t ∣ S t = s , A t = a ] ≈ 1 N ∑ i = 1 N g ( j ) ( s , a ) q_{\pi_k}(s, a) = \mathbb{E}[G_t | S_t = s, A_t = a] \approx \frac{1}{N} \sum_{i=1}^N g^{(j)}(s, a) qπk(s,a)=E[GtSt=s,At=a]N1i=1Ng(j)(s,a)

上述算法的基本理念是:当model不可获得时,可以使用data。

MC Basic algorithm:

对于给定的初始policy π 0 \pi_0 π0,在第 k k k次迭代中,有两个主要的步骤

step 1: policy evaluation。对所有的 ( s , a ) (s, a) (s,a)获取 q π k ( s , a ) q_{\pi_k}(s, a) qπk(s,a) 。具体来说,对每一个action-state对,运行得到无限数量(或足够多)的episode。它们的平均return即是 q π k ( s , a ) q_{\pi_k}(s, a) qπk(s,a)的估计。

step 2: policy improvement。对所有 s ∈ S s \in \mathcal{S} sS,计算 π k + 1 ( s ) = argmax π ∑ a π ( a ∣ s ) q π k ( s , a ) \pi_{k+1}(s) = \text{argmax}_{\pi} \sum_a \pi(a | s)q_{\pi_k}(s, a) πk+1(s)=argmaxπaπ(as)qπk(s,a)。当 a k ∗ = argmax a q π k ( s , a ) a^*_k = \text{argmax}_a q_{\pi_k}(s,a) ak=argmaxaqπk(s,a)时,贪心optimal policy为 π k + 1 ( a k ∗ ∣ s ) = 1 \pi_{k+1}(a^*_k|s)=1 πk+1(aks)=1

注意,MC Basic算法与policy iteration算法是一致的,除了:

MC Basic算法直接估计 q π k ( s , a ) q_{\pi_k}(s, a) qπk(s,a)而不是计算 v π k ( s ) v_{\pi_k}(s) vπk(s)

在这里插入图片描述

  • MC Basic是policy iteration算法的一种变体。
  • model-free算法是在model-based算法的基础上建立的。 因此,在研究model-free算法之前,有必要先了解model-based算法
  • MC Basic对于揭示基于 MC 的model-free强化学习的核心思想很有用,但由于效率低而不实用。
  • 为什么 MC Basic 估计的是action value 而不是state value? 这是因为state value不能直接用来改进policy。 当模型不可用时,应该直接估计action value。
  • 由于policy iteration是收敛的,因此在给定足够的episode的情况下,MC Basic也保证是收敛的。

Example:

在这里插入图片描述

Task:上图展示的是初始policy,使用MC Basic算法寻找最优policy。

r boundary = − 1 r_{\text{boundary}} = -1 rboundary=1 r forbidden = − 1 r_{\text{forbidden}} = -1 rforbidden=1 r target = 1 r_\text{target}=1 rtarget=1 γ = 0.9 \gamma=0.9 γ=0.9

Outline:对于给定的policy π k \pi_k πk

step 1:policy evaluation。计算 q π k ( s , a ) q_{\pi_k}(s,a) qπk(s,a)。共有
9  states × 5  actions = 45  state-action pairs 9 \text{ states} × 5 \text{ actions} =45 \text{ state-action pairs} 9 states×5 actions=45 state-action pairs
step2: policy improvement。贪心的选择action
a ∗ ( s ) = argmax a i q π k ( s , a ) a^*(s) = \text{argmax}_{a_i}q_{\pi_k}(s, a) a(s)=argmaxaiqπk(s,a)
以计算 q π k ( s 1 , a ) q_{\pi_k}(s_1, a) qπk(s1,a)为例:

step 1: policy evaluation。

  • 由于当前的policy是确定性的,一个episode就足以得到action value。

  • 如果当前policy是随机的,则需要无限数量的episode(或至少许多)。

  • ( s 1 , a 1 ) (s_1, a_1) (s1,a1)开始,episode是 s 1 → a 1 s 1 → a 1 s 1 → a 1 ⋯ s_1 \xrightarrow[]{a_1} s_1 \xrightarrow[]{a_1} s_1\xrightarrow[]{a_1} \cdots s1a1 s1a1 s1a1 ,action value为:
    q π 0 ( s 1 , a 1 ) = − 1 + γ ( − 1 ) + γ 2 ( − 1 ) + ⋯ q_{\pi_0}(s_1, a_1) = -1 + \gamma (-1) + \gamma^2 (-1) + \cdots qπ0(s1,a1)=1+γ(1)+γ2(1)+

  • ( s 1 , a 2 ) (s_1, a_2) (s1,a2)开始,episode是 s 1 → a 2 s 2 → a 3 s 5 → a 3 ⋯ s_1 \xrightarrow[]{a_2} s_2 \xrightarrow[]{a_3} s_5\xrightarrow[]{a_3} \cdots s1a2 s2a3 s5a3 ,action value为:
    q π 0 ( s 1 , a 2 ) = 0 + γ 0 + γ 2 0 + γ 3 ( 1 ) + γ 4 ( 1 ) + ⋯ q_{\pi_0}(s_1, a_2) = 0 + \gamma 0 + \gamma^2 0 + \gamma^3(1) + \gamma^4(1) + \cdots qπ0(s1,a2)=0+γ0+γ20+γ3(1)+γ4(1)+

  • ( s 1 , a 3 ) (s_1, a_3) (s1,a3)开始,episode是 s 1 → a 3 s 4 → a 2 s 5 → a 3 ⋯ s_1 \xrightarrow[]{a_3} s_4 \xrightarrow[]{a_2} s_5\xrightarrow[]{a_3} \cdots s1a3 s4a2 s5a3 ,action value为:
    q π 0 ( s 1 , a 2 ) = 0 + γ 0 + γ 2 0 + γ 3 ( 1 ) + γ 4 ( 1 ) + ⋯ q_{\pi_0}(s_1, a_2) = 0 + \gamma 0 + \gamma^2 0 + \gamma^3(1) + \gamma^4(1) + \cdots qπ0(s1,a2)=0+γ0+γ20+γ3(1)+γ4(1)+

  • ( s 1 , a 4 ) (s_1, a_4) (s1,a4)开始,episode是 s 1 → a 4 s ‘ → a 1 s 1 → a 1 ⋯ s_1 \xrightarrow[]{a_4} s_` \xrightarrow[]{a_1} s_1\xrightarrow[]{a_1} \cdots s1a4 sa1 s1a1 ,action value为:
    q π 0 ( s 1 , a 4 ) = − 1 + γ ( − 1 ) + γ 2 ( − 1 ) + ⋯ q_{\pi_0}(s_1, a_4) = -1 + \gamma (-1) + \gamma^2 (-1) + \cdots qπ0(s1,a4)=1+γ(1)+γ2(1)+

  • ( s 1 , a 5 ) (s_1, a_5) (s1,a5)开始,episode是 s 1 → a 5 s 1 → a 1 s 1 → a 1 ⋯ s_1 \xrightarrow[]{a_5} s_1 \xrightarrow[]{a_1} s_1\xrightarrow[]{a_1} \cdots s1a5 s1a1 s1a1 ,action value为:
    q π 0 ( s 1 , a 5 ) = 0 + γ ( − 1 ) + γ 2 ( − 1 ) + ⋯ q_{\pi_0}(s_1, a_5) = 0 + \gamma (-1) + \gamma^2 (-1) + \cdots qπ0(s1,a5)=0+γ(1)+γ2(1)+

step 2: policy improvement。

  • 通过观察action value,可得:
    q π 0 ( s 1 , a 2 ) = q π 0 ( s 1 , a 3 ) q_{\pi_0}(s_1, a_2) = q_{\pi_0}(s_1, a_3) qπ0(s1,a2)=qπ0(s1,a3)
    是最大的。

  • 因此,policy可以被提高为:
    π 1 ( a 2 ∣ s 2 ) = 1        or        π 1 ( a 3 ∣ s 1 ) = 1 \pi_1(a_2 | s_2) = 1 \;\;\; \text{or} \;\;\; \pi_1(a_3 | s_1) = 1 π1(a2s2)=1orπ1(a3s1)=1
    无论哪种方式, s 1 s_1 s1 的新policy都变得最优。

对于这个简单的例子来说,一次迭代就足够了!

检查episode长度的影响

使用 MC Basic 搜索不同episode长度的最优policy。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 当episode长度很短时,只有接近目标的state才具有非零的state value。
  • 随着episode长度的增加,离target较近的state比较远的state更早具有非零值。
  • episode长度应该足够长。
  • episode长度不必无限长。

Use date more efficiently: MC Exploring Starts

MC Basic 算法:

  • 优点:核心思想清晰可见。
  • 缺点:太简单而不实用。

考虑一个grid-world的例子,遵循policy π \pi π,可以得到一个episode,例如
s 1 → a 2 s 2 → a 4 s 1 → a 2 s 2 → a 3 s 5 → a 1 ⋯ s_1 \xrightarrow[]{a_2} s_2 \xrightarrow[]{a_4} s_1 \xrightarrow[]{a_2} s_2 \xrightarrow[]{a_3} s_5 \xrightarrow[]{a_1} \cdots s1a2 s2a4 s1a2 s2a3 s5a1
visit:每次state-action对出现在episode中,就称为该state-action对的访问

使用数据的方法:Initial-visit method

  • 只计算return并估计 q π ( s 1 , a 2 ) q_{\pi}(s_1, a_2) qπ(s1,a2)
  • MC Basic算法
  • 不能充分利用数据

episode也visit其他state-action对

在这里插入图片描述

其可以估计 q π ( s 1 , a 2 ) q_{\pi}(s_1, a_2) qπ(s1,a2) q π ( s 2 , a 4 ) q_{\pi}(s_2, a_4) qπ(s2,a4) q π ( s 2 , a 3 ) q_{\pi}(s_2, a_3) qπ(s2,a3) q π ( s 5 , a 1 ) q_{\pi}(s_5, a_1) qπ(s5,a1) ⋯ \cdots

Data-efficient方法:

  • first-visit方法
  • every-visit方法

基于 MC 的 RL 的另一个方面是何时更新policy。 有两种方法:

  • 第一种方法是,在policy evaluation步骤中,收集从state-action对开始的所有episode,然后使用平均return来近似action value。

    • 这是MC Basic算法采用的
    • 这种方法的问题是agent必须等到所有episodes都收集完毕。
  • 第二种方法使用单个episode的return来近似action value。

    这样就可以episode-by-episode完善policy。

第二种方法分析

  • 也许,单episode的return并不能准确地近似对应的action value。
  • 但是,在上一章介绍的truncated policy iteration算法中已经做到了这一点。

Generalized policy iteration:

  • 不是一个特定的算法
  • 它是指policy-evaluation和policy-improvement过程之间切换的总体思路或框架。
  • 许多model-based和model-free的强化学习算法都属于这个框架。

如果想要更有效地使用数据和更新估计,就可以得到一种称为 MC Exploring Starts 的新算法:

在这里插入图片描述

What is exploring starts?

  • Exploring starts意味着我们需要从每个state-action对开始生成足够多的episode。
  • MC Basic 和 MC Exploring Starts 都需要这个假设。

Why do we need to consider exploring starts?

  • 理论上,只有充分探索每个state的每个action value,才能正确选择最优动作。
    相反,如果没有探索某个action,则该action可能恰好是最佳action,因此会被错过。
  • 在实践中,exploring starts是很难实现的。 对于许多应用程序,尤其是那些涉及与环境的物理交互的应用程序,很难从每个state-action对开始收集episode。

因此理论与实践存在差距!

那么可以取消exploring starts的要求吗? 接下来将展示可以通过使用soft policy来做到这一点。

MC without exploring starts: MC ε \varepsilon ε-Greedy

如果采取任何action的概率为正,则policy被称为soft policy。

Why introduce soft policies?

  • 通过soft policy,一些足够长的episode可以访问每个state-action对足够多次。
  • 然后,不需要从每个state-action对开始都有大量的episode。 因此,可以消除exploring starts的要求。

ε \varepsilon ε-greedy policies
π ( a ∣ s ) = { 1 − ε ∣ A ( s ) ∣ ( ∣ A ( s ) ∣ − 1 ) for the greedy action ε ∣ A ( s ) ∣ for other  ∣ A ( s ) ∣ − 1  actions \pi(a|s) = \begin{cases} 1 - \frac{\varepsilon }{|\mathcal{A}(s)|}(|\mathcal{A}(s)| - 1) & \text{for the greedy action} \\ \frac{\varepsilon }{|\mathcal{A}(s)|} & \text{for other } |\mathcal{A}(s)| - 1 \text{ actions} \end{cases} π(as)={1A(s)ε(A(s)1)A(s)εfor the greedy actionfor other A(s)1 actions
其中, ε ∈ [ 0 , 1 ] \varepsilon \in [0, 1] ε[0,1]并且 A ( s ) \mathcal{A}(s) A(s) s s s的action的数量。

选择贪婪action的机会总是大于其他action。因为:
1 − ε ∣ A ( s ) ∣ ( ∣ A ( s ) ∣ − 1 ) = 1 − ε + ε ∣ A ( s ) ∣ ≥ ε ∣ A ( s ) ∣ 1 - \frac{\varepsilon }{|\mathcal{A}(s)|}(|\mathcal{A}(s)| - 1) = 1 - \varepsilon + \frac{\varepsilon }{|\mathcal{A}(s)|} \ge \frac{\varepsilon }{|\mathcal{A}(s)|} 1A(s)ε(A(s)1)=1ε+A(s)εA(s)ε
Why use ε-greedy?

平衡利用(exploitation)与探索(exploration)。

  • ε = 0 \varepsilon = 0 ε=0时,变得贪婪。更少的探索(exploration),更多的利用(exploitation)。
  • ε = 1 \varepsilon = 1 ε=1时,变为均匀分布。更多探索(exploration),更少利用(exploitation)。

How to embed ε − \varepsilon - εgreedy into the MC-based RL algorithms?

原本,MC Basic 和 MC Exploring Starts 中的policy improvement步骤是为了解决:
π k + 1 ( s ) = argmax x ∈ Π ∑ a π ( a ∣ s ) q π k ( s , a ) \pi_{k+1}(s) = \text{argmax}_{x \in \Pi} \sum_a \pi(a | s)q_{\pi_k}(s, a) πk+1(s)=argmaxxΠaπ(as)qπk(s,a)
其中, Π \Pi Π代表所有可能的policy。其中,最优的policy为:
π k + 1 ( a ∣ s ) = { 1 a = a k ∗ 0 a ≠ s k ∗ \pi_{k+1}(a | s) = \begin{cases} 1 & a = a^*_k\\ 0 & a \ne s^*_k \end{cases} πk+1(as)={10a=aka=sk
其中, a k ∗ = argmax a q π k ( s , a ) a^*_k = \text{argmax}_a q_{\pi_k}(s, a) ak=argmaxaqπk(s,a)

现在,policy improvement步骤改变为计算:
π k + 1 ( s ) = argmax x ∈ Π ε ∑ a π ( a ∣ s ) q π k ( s , a ) \pi_{k+1}(s) = \text{argmax}_{x \in \Pi_\varepsilon } \sum_a \pi(a | s)q_{\pi_k}(s, a) πk+1(s)=argmaxxΠεaπ(as)qπk(s,a)
其中, Π ε \Pi_\varepsilon Πε 表示所有具有固定值 ε \varepsilon ε ε \varepsilon ε-greedy policy的集合。

最优的policy为:
π k + 1 ( a ∣ s ) = { 1 − ε ∣ A ( s ) ∣ ( ∣ A ( s ) ∣ − 1 ) a = a k ∗ ε ∣ A ( s ) ∣ a ≠ a k ∗ \pi_{k+1}(a|s) = \begin{cases} 1 - \frac{\varepsilon }{|\mathcal{A}(s)|}(|\mathcal{A}(s)| - 1) & a = a^*_k \\ \frac{\varepsilon }{|\mathcal{A}(s)|} & a \ne a^*_k \end{cases} πk+1(as)={1A(s)ε(A(s)1)A(s)εa=aka=ak

  • MC ε \varepsilon ε-Greedy 与 MC Exploring Starts 相同,只是前者使用 $\varepsilon $-greedy 策略。
  • 它不需要exploring starts,但仍然需要以不同的形式访问所有state-action对。

在这里插入图片描述

Can a single episode visit all state-action pairs?

ε \varepsilon ε=1时,policy(均匀分布)的探索能力最强。

在这里插入图片描述

ε \varepsilon ε较小时,策略的探索能力也较小。

在这里插入图片描述

Compared to greedy policies

  • 优点是 ε \varepsilon ε-greedy policy的具有更强的探索能力,因此不需要exploring starts条件。
  • 缺点是 ε \varepsilon ε-greedy policy一般来说不是最优的(我们只能证明总是存在最优的greedy policy)。
    • MC ε \varepsilon ε-greedy算法给出的最终policy仅在所有 ε \varepsilon ε-greedy policy的集合 Π ε \Pi_\varepsilon Πε中是最优的。
    • ε \varepsilon ε不能太大

Example

r boundary = − 1 r_{\text{boundary}} = -1 rboundary=1 r forbidden = − 10 r_{\text{forbidden}}=-10 rforbidden=10 r target = 1 r_{\text{target}} = 1 rtarget=1 γ = 0.9 \gamma=0.9 γ=0.9

在这里插入图片描述

在这里插入图片描述

ε \varepsilon ε增大时,policy的最优性能变得更差!最优 ε \varepsilon ε-greedy policy与greedy policy不一致。

Summary

  • Mean estimation by the Monte Carlo methods
  • Three algorithms:
    • MC Basic
    • MC Exploring Starts
    • MC ε \varepsilon ε-Greedy
  • Relationship among the three algorithms
  • Optimality vs exploration of ε \varepsilon ε-greedy policies

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

山西电力市场日前价格预测【2024-02-16】

日前价格预测 预测说明: 如上图所示,预测明日(2024-02-16)山西电力市场全天平均日前电价为55.97元/MWh。其中,最高日前电价为314.75元/MWh,预计出现在18:45。最低日前电价为0.00元/MWh,预计出现…

Conda管理Python不同版本教程

Conda管理Python不同版本教程 目录 0.前提 1.conda常用命令 2.conda管理python库 不太推荐 pyenv管理Python不同版本教程(本人另一篇博客,姊妹篇) 0.前提 ①anaconda、miniconda(2个的下载仓库)在win上推荐前者&a…

为什么将二维码分解成文字? 二维码在线转文字的方法

将二维码分解成文字的主要目的是为了方便人们获取二维码中的信息便于使用。二维码是一种由黑白方块组成的图案,可以存储大量的数据,如网址、联系方式、产品信息等。然而,对于一些特定的场景或个人需求,无法直接扫描二维码。因此&a…

ubuntu22.04@laptop OpenCV Get Started: 013_contour_detection

ubuntu22.04laptop OpenCV Get Started: 013_contour_detection 1. 源由2. 应用Demo2.1 C应用Demo2.2 Python应用Demo 3. contour_approx应用3.1 读取图像并将其转换为灰度格式3.2 应用二进制阈值过滤算法3.3 查找对象轮廓3.4 绘制对象轮廓3.5 效果3.6 CHAIN_APPROX_SIMPLE v.s…

vue的生命周期图解

vue的生命周期图解 添加链接描述 vue的生命周期函数及过程的简述: vue的生命周期函数,其实就是vm的生命周期; 创建:beforeCreate、created 挂载:beforeMount、mounted 更新:beforeUpdate、updated [ˌʌpˈ…

数字化转型导师坚鹏:数字化思维创新与BLM政府数字化转型战略

数字化思维创新与BLM政府数字化转型战略 ——以BLM模型为核心,践行知行合一思想,实现知行果合一 课程背景: 很多政府存在以下问题: 不知道如何系统地开展数字化转型工作? 不清楚如何高效地执行数字化转型战略&a…

解读OpenAI视频生成模型Sora背后的原理:Diffusion Transformer

Diffusion Models视频生成-博客汇总 前言:OpenAI最近推出的视频生成模型Sora在效果上实现了真正的遥遥领先,很多博主都介绍过Sora,但是深入解读背后原理的博客却非常少。Sora的原理最主要的是核心模型主干《Scalable Diffusion Models with T…

【大厂AI课学习笔记】【2.1 人工智能项目开发规划与目标】(3)数据准备初步

今天来学习数据准备。 一个AI项目要包括构建数据集、数据清理和数据融合、数据采集、特征工程、算法改进和其他步骤。 数据采集和数据清洗,也就是数据准备,要占到人工智能项目一半以上的工作量。 训练的数据量越大,模型越准确。 建立数据标…

php 函数(方法)、日期函数

php 函数、日期函数 1. php函数2. 日期函数 1. php函数 <?php// 创建一个函数 function hello($who) {echo $who.Hello World!; }hello("老张");给参数一个默认值&#xff0c;当然自己有变量走自己的 2. 日期函数 <?php/** date(Y-m-d H:i:s)返回的时间是…

数据库MySQL中出现乱码和表格不对齐怎么解决

MySQL中出现乱码问题及解决办法&#xff1a; 情况类似&#xff1a; 首先进入到数据库中&#xff0c;命令&#xff1a;mysql -h localhost -uroot -p或者mysql -uroot -p;进入数据库后选择一个你的数据库查看表中的中文是否乱码 以上是数据库中表格出现乱码情况&#xff0c;原…

文件上传漏洞--Upload-labs--Pass06--空格绕过

一、什么是空格绕过 在Windows系统中&#xff0c;Windows特性会自动删除文件后缀名后的空格&#xff0c;这使我们看 .php 和 .php 二者没有任何区别&#xff0c;实际上二者是有区别的。若网页源码没有使用 trim()函数 来进行去除空格的操作&#xff0c;就会使网页存在 空格绕…

x86使用内敛汇编实现简单的临界段保护

临界资源保护 实现方法 禁用中断 __attribute__((used)) static inline uint32_t read_eflags (void){uint32_t eflags;ASM_V("pushf\n\tpop %%eax":"a"(eflags));return eflags; } __attribute__((used)) static inline void write_eflags (uint32_t e…

蓝桥杯官网填空题(寻找整数)

问题描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 有一个不超过 10^17 的正整数 n&#xff0c;知道这个数除以 2 至 49 后的余数如下表所示&#xff0c;求这个正整数最小是多少。 运行限制 最大运行时间&#xff1a;…

搭建游戏服务器需要高防御的服务器吗?

随着网络技术的不断发展&#xff0c;游戏行业也迎来了前所未有的发展机遇。然而随着游戏用户的不断增加&#xff0c;游戏服务器的安全问题也日益突出。一些攻击者可能会对游戏服务器进行攻击&#xff0c;例如DDoS攻击、CC攻击等&#xff0c;导致服务器无法正常运行&#xff0c;…

面试经典150题【1-10】

文章目录 面试经典150题【1-10】88. 合并两个有序数组27.移除元素26.删除有序数组中的重复项80.删除有序数组中的重复项II169.多数元素189.轮转数组121.买卖股票的最佳时机1122. 买卖股票的最佳时机 II55.跳跃游戏![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ff…

8.8 矢量图层点要素点聚合(Point cluster)使用

文章目录 前言点聚合&#xff08;Point cluster&#xff09;QGis代码实现 总结 前言 本章介绍如何使用点聚合&#xff08;Point cluster&#xff09;说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 点聚合&#xff08;Point cluster&#xff09; 点要素过…

实例讲解join方法的使用

Python的join()方法用于将序列中的元素以指定的字符连接生成一个新的字符串 语法 str.join(sequence) 参数 sequence 要连接的元素序列、字符串、元组、字典 返回值 返回通过指定字符连接序列中的元素后生成的新的字符串 实例 str "-"; seq ("a"…

Facebook MarketPlace自养号测评在海外FB商城如何精准引流私域?(上)

2024直击痛点&#xff1a;Facebook MarketPlace 如何引流裂变 (Facebook商城)? “Facebook MarketPlace&#xff08;FB商城&#xff09;、Instagram、Whatsapp、Twitter、Reddit、Youtube、Line、VK等怎样超低成本进行海外精准获客&#xff08;引流&#xff09;”&#xff0c…

网页打开本地exe

制作注册表文件tim.reg&#xff0c; Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\timClient] "timClient" "URL Protocol"""[HKEY_CLASSES_ROOT\timClient\DefaultIcon] "D:\\Program Files (x86)\\Tencent\\TIM\\Bin\\QQSc…

微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用

&#x1f3f7;️个人主页&#xff1a;鼠鼠我捏&#xff0c;要死了捏的主页 &#x1f3f7;️系列专栏&#xff1a;Golang全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&…