Q學習(Q-Learning)詳解

在這里插入圖片描述

?作者簡介:2022年博客新星 第八。熱愛國學的Java后端開發者,修心和技術同步精進。
🍎個人主頁:Java Fans的博客
🍊個人信條:不遷怒,不貳過。小知識,大智慧。
💞當前專欄:機器學習分享專欄
?特色專欄:國學周更-心性養成之路
🥭本文內容:Q學習(Q-Learning)詳解

文章目錄

    • 引言
    • 一、基本原理
      • 1. 強化學習的基本概念
      • 2. Q值的定義
      • 3. Q學習的目標
      • 4. 學習過程
      • 5. 收斂性
    • 二、數學模型
      • 1. 狀態空間和動作空間
      • 2. Q值函數
      • 3. 貝爾曼方程
      • 4. Q值更新公式
      • 5. 收斂性
      • 6. 策略提取
    • 三、實現步驟
      • 1. 環境設置
      • 2. 初始化Q值表
      • 3. 選擇策略
      • 4. 循環迭代
      • 5. 終止條件
      • 6. 策略提取
    • 四、應用場景
      • 1. 游戲AI
      • 2. 機器人控制
      • 3. 推薦系統
    • 結論

引言

??在人工智能的快速發展中,強化學習作為一種重要的學習范式,逐漸引起了廣泛的關注。它通過與環境的交互來學習最優策略,使得智能體能夠在復雜的決策問題中做出有效的選擇。其中,Q學習(Q-Learning)作為一種經典的無模型強化學習算法,以其簡單易懂和高效的特性,成為了研究者和工程師們的熱門選擇。

??Q學習的核心在于通過學習一個Q值函數來評估在特定狀態下采取某個動作的價值,從而指導智能體在環境中進行決策。無論是在游戲、機器人控制,還是在金融交易和推薦系統等領域,Q學習都展現出了強大的應用潛力。

??本文將深入探討Q學習的基本原理、數學模型、實現步驟以及其在實際中的應用場景,旨在為讀者提供一個全面的理解,幫助他們在相關領域的研究和實踐中更好地應用這一技術。

一、基本原理

Q學習是一種基于值的強化學習算法,旨在通過與環境的交互來學習最優策略。其基本原理可以從以下幾個方面進行詳細闡述:

1. 強化學習的基本概念

強化學習的核心在于智能體(Agent)、環境(Environment)、狀態(State)、動作(Action)和獎勵(Reward)。智能體通過在環境中采取動作來影響狀態,并根據環境反饋的獎勵來調整其行為。強化學習的目標是最大化智能體在與環境交互過程中獲得的累積獎勵。

  • 智能體:執行動作并學習的主體。
  • 環境:智能體所處的外部系統,智能體通過與環境交互來學習。
  • 狀態:環境的具體情況,描述了智能體所處的情境。
  • 動作:智能體在特定狀態下可以選擇的行為。
  • 獎勵:智能體在執行動作后從環境中獲得的反饋,通常是一個數值,表示該動作的好壞。

2. Q值的定義

Q學習的核心是Q值(Action-Value Function),它表示在特定狀態下采取某個動作所能獲得的期望回報。Q值的定義為:

Q ( s , a ) = E [ R t ∣ S t = s , A t = a ] Q(s, a) = \mathbb{E}[R_t | S_t = s, A_t = a] Q(s,a)=E[Rt?St?=s,At?=a]

其中:

  • Q ( s , a ) Q(s, a) Q(s,a):在狀態 s s s下采取動作 a a a的Q值。
  • R t R_t Rt?:在時間步 t t t獲得的獎勵。

Q值函數的目標是通過學習來估計在每個狀態下采取每個動作的長期回報。

3. Q學習的目標

Q學習的目標是學習一個最優的Q值函數,即找到一個策略,使得在每個狀態下選擇的動作能夠最大化未來的累積獎勵。最優Q值函數通常用 Q ? ( s , a ) Q^*(s, a) Q?(s,a)表示,滿足以下貝爾曼方程:

Q ? ( s , a ) = E [ R t + γ max ? a ′ Q ? ( S t + 1 , a ′ ) ∣ S t = s , A t = a ] Q^*(s, a) = \mathbb{E}[R_t + \gamma \max_{a'} Q^*(S_{t+1}, a') | S_t = s, A_t = a] Q?(s,a)=E[Rt?+γamax?Q?(St+1?,a)St?=s,At?=a]

其中, γ \gamma γ是折扣因子,表示未來獎勵的重要性。

4. 學習過程

Q學習的學習過程主要包括以下幾個步驟:

  1. 初始化Q值表:通常將所有Q值初始化為零或小的隨機值。

  2. 選擇動作:根據當前狀態選擇一個動作,通常使用ε-貪婪策略。該策略在探索和利用之間進行權衡,以確保智能體能夠探索新的狀態和動作。

  3. 執行動作:在環境中執行所選動作,觀察結果狀態和獲得的獎勵。

  4. 更新Q值:根據獲得的獎勵和下一個狀態的最大Q值更新當前狀態的Q值。更新公式為:

    Q ( s , a ) ← Q ( s , a ) + α ( r + γ max ? a ′ Q ( s ′ , a ′ ) ? Q ( s , a ) ) Q(s, a) \leftarrow Q(s, a) + \alpha \left( r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right) Q(s,a)Q(s,a)+α(r+γamax?Q(s,a)?Q(s,a))

    其中, α \alpha α是學習率,控制新信息對舊信息的影響程度。

  5. 迭代:重復上述步驟,直到Q值收斂或達到預設的迭代次數。

5. 收斂性

Q學習的收斂性是其重要特性之一。在滿足一定條件下(如充分探索狀態和動作空間),Q學習能夠保證收斂到最優Q值函數。具體來說,隨著學習的進行,Q值將逐漸逼近真實的Q值,從而找到最優策略。

二、數學模型

Q學習的數學模型是其核心部分,涉及到狀態、動作、獎勵以及Q值的定義和更新。以下將詳細闡述Q學習的數學模型,包括狀態空間、動作空間、Q值函數、貝爾曼方程以及Q值更新公式。

1. 狀態空間和動作空間

在Q學習中,環境的狀態空間和動作空間是基本構成要素:

  • 狀態空間 ( S S S):表示環境中所有可能的狀態的集合。每個狀態 s ∈ S s \in S sS描述了環境的特定情境。
  • 動作空間 ( A A A):表示智能體在每個狀態下可以選擇的所有可能動作的集合。每個動作 a ∈ A a \in A aA是智能體在狀態 s s s下可以采取的行為。

2. Q值函數

Q值函數是Q學習的核心,表示在特定狀態下采取某個動作的期望回報。Q值函數定義為:

Q ( s , a ) = E [ R t ∣ S t = s , A t = a ] Q(s, a) = \mathbb{E}[R_t | S_t = s, A_t = a] Q(s,a)=E[Rt?St?=s,At?=a]

其中:

  • Q ( s , a ) Q(s, a) Q(s,a):在狀態 s s s下采取動作 a a a的Q值。
  • R t R_t Rt?:在時間步 t t t獲得的獎勵。

Q值函數的目標是通過學習來估計在每個狀態下采取每個動作的長期回報。

3. 貝爾曼方程

貝爾曼方程是Q學習的理論基礎,描述了Q值之間的關系。對于最優Q值函數 Q ? ( s , a ) Q^*(s, a) Q?(s,a),貝爾曼方程可以表示為:

Q ? ( s , a ) = E [ R t + γ max ? a ′ Q ? ( S t + 1 , a ′ ) ∣ S t = s , A t = a ] Q^*(s, a) = \mathbb{E}[R_t + \gamma \max_{a'} Q^*(S_{t+1}, a') | S_t = s, A_t = a] Q?(s,a)=E[Rt?+γamax?Q?(St+1?,a)St?=s,At?=a]

其中:

  • R t R_t Rt?:在狀態 s s s下采取動作 a a a后獲得的即時獎勵。
  • γ \gamma γ:折扣因子,表示未來獎勵的重要性,取值范圍為 [ 0 , 1 ] [0, 1] [0,1]
  • S t + 1 S_{t+1} St+1?:執行動作 a a a后轉移到的新狀態。
  • max ? a ′ Q ? ( S t + 1 , a ′ ) \max_{a'} Q^*(S_{t+1}, a') maxa?Q?(St+1?,a):在新狀態 S t + 1 S_{t+1} St+1?下所有可能動作的最大Q值。

貝爾曼方程表明,當前狀態下采取某個動作的Q值等于即時獎勵加上未來狀態的最大Q值的折扣期望。

4. Q值更新公式

Q學習的關鍵在于如何更新Q值。Q值的更新公式為:

Q ( s , a ) ← Q ( s , a ) + α ( r + γ max ? a ′ Q ( s ′ , a ′ ) ? Q ( s , a ) ) Q(s, a) \leftarrow Q(s, a) + \alpha \left( r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right) Q(s,a)Q(s,a)+α(r+γamax?Q(s,a)?Q(s,a))

其中:

  • Q ( s , a ) Q(s, a) Q(s,a):在狀態 s s s下采取動作 a a a的當前Q值。
  • α \alpha α:學習率,控制新信息對舊信息的影響程度,取值范圍為 [ 0 , 1 ] [0, 1] [0,1]
  • r r r:在狀態 s s s下采取動作 a a a后獲得的即時獎勵。
  • γ \gamma γ:折扣因子,表示未來獎勵的重要性,取值范圍為 [ 0 , 1 ] [0, 1] [0,1]
  • s ′ s' s:執行動作 a a a后轉移到的新狀態。
  • max ? a ′ Q ( s ′ , a ′ ) \max_{a'} Q(s', a') maxa?Q(s,a):在新狀態 s ′ s' s下所有可能動作的最大Q值。

更新公式的含義是:當前Q值通過加上一個修正項來更新,修正項由即時獎勵和未來最大Q值的折扣期望組成。學習率 α \alpha α決定了新信息對舊信息的影響程度。

5. 收斂性

Q學習的收斂性是其重要特性之一。在滿足一定條件下(如充分探索狀態和動作空間),Q學習能夠保證收斂到最優Q值函數。具體來說,隨著學習的進行,Q值將逐漸逼近真實的Q值,從而找到最優策略。

根據強化學習的理論,Q學習的收斂性可以通過以下條件來保證:

  • 每個狀態-動作對 ( s , a ) (s, a) (s,a)在學習過程中被充分探索。
  • 學習率 α \alpha α滿足條件: ∑ t = 1 ∞ α t = ∞ \sum_{t=1}^{\infty} \alpha_t = \infty t=1?αt?= ∑ t = 1 ∞ α t 2 < ∞ \sum_{t=1}^{\infty} \alpha_t^2 < \infty t=1?αt2?<

6. 策略提取

一旦Q值收斂,最優策略可以通過選擇在每個狀態下具有最大Q值的動作來提取。最優策略 π ? \pi^* π?可以表示為:

π ? ( s ) = arg ? max ? a Q ? ( s , a ) \pi^*(s) = \arg\max_{a} Q^*(s, a) π?(s)=argamax?Q?(s,a)

這意味著在每個狀態 s s s下,智能體將選擇Q值最大的動作,從而實現最優決策。

三、實現步驟

Q學習的實現步驟可以分為多個階段,從環境的設置到Q值的更新,整個過程相對系統化。以下將詳細闡述Q學習的實現步驟。

1. 環境設置

在開始實現Q學習之前,首先需要定義環境。這包括狀態空間、動作空間和獎勵機制。

  • 狀態空間 ( S S S):定義環境中所有可能的狀態。狀態可以是離散的(如棋盤上的位置)或連續的(如機器人的位置和速度)。
  • 動作空間 ( A A A):定義智能體在每個狀態下可以選擇的所有可能動作。動作可以是離散的(如上下左右移動)或連續的(如調整速度)。
  • 獎勵機制:設計獎勵函數,定義智能體在執行特定動作后獲得的反饋。獎勵可以是正值(表示好的行為)、負值(表示不好的行為)或零(表示中立的行為)。

2. 初始化Q值表

在Q學習中,Q值表用于存儲每個狀態-動作對的Q值。初始化Q值表的步驟如下:

  • 創建一個二維數組或字典,行表示狀態,列表示動作。
  • 將所有Q值初始化為零或小的隨機值。通常,初始化為零是一個常見的選擇。
import numpy as npnum_states = 5  # 狀態數量
num_actions = 2  # 動作數量
Q = np.zeros((num_states, num_actions))  # 初始化Q值表

3. 選擇策略

在Q學習中,選擇策略決定了智能體在每個狀態下如何選擇動作。常用的策略是ε-貪婪策略,該策略在探索和利用之間進行權衡:

  • 探索:以概率ε選擇一個隨機動作,以便探索新的狀態。
  • 利用:以概率1-ε選擇當前Q值最高的動作,以便利用已有的知識。
def choose_action(state, epsilon):if np.random.rand() < epsilon:return np.random.randint(num_actions)  # 隨機選擇動作else:return np.argmax(Q[state])  # 選擇最大Q值的動作

4. 循環迭代

Q學習的核心在于通過多次迭代來更新Q值。每次迭代的步驟如下:

  1. 初始化狀態:隨機選擇一個初始狀態。
  2. 選擇動作:根據當前狀態和選擇策略選擇一個動作。
  3. 執行動作:在環境中執行所選動作,觀察結果狀態和獲得的獎勵。
  4. 更新Q值:根據獲得的獎勵和下一個狀態的最大Q值更新當前狀態的Q值。
  5. 更新狀態:將當前狀態更新為新狀態。
  6. 終止條件:檢查是否滿足終止條件,如達到最大迭代次數或Q值收斂。

以下是一個完整的迭代過程示例:

num_episodes = 1000  # 訓練輪數
alpha = 0.1  # 學習率
gamma = 0.9  # 折扣因子
epsilon = 0.1  # 探索率for episode in range(num_episodes):state = np.random.randint(num_states)  # 隨機初始狀態done = Falsewhile not done:action = choose_action(state, epsilon)  # 選擇動作new_state, reward, done = environment.step(state, action)  # 執行動作并觀察結果# 更新Q值Q[state, action] += alpha * (reward + gamma * np.max(Q[new_state]) - Q[state, action])state = new_state  # 更新狀態

5. 終止條件

在實現Q學習時,需要設定終止條件,以決定何時停止訓練。常見的終止條件包括:

  • 達到最大迭代次數:設定一個固定的訓練輪數,如1000輪。
  • Q值收斂:當Q值的變化小于某個閾值時,認為Q值已經收斂,可以停止訓練。

6. 策略提取

一旦Q值收斂,可以從Q值表中提取最優策略。最優策略是指在每個狀態下選擇Q值最大的動作:

def extract_policy(Q):return np.argmax(Q, axis=1)  # 返回每個狀態下的最優動作

四、應用場景

Q學習作為一種強大的強化學習算法,廣泛應用于多個領域。以下將結合具體代碼詳細闡述幾個典型的應用場景,包括游戲AI、機器人控制和推薦系統。

1. 游戲AI

在游戲中,Q學習可以用于訓練智能體,使其能夠在復雜的游戲環境中學習最優策略。以下是一個簡單的“迷宮”游戲的示例,智能體需要找到從起點到終點的最短路徑。

import numpy as np
import random# 定義環境
class MazeEnvironment:def __init__(self):self.state_space = 5  # 狀態數量self.action_space = 4  # 動作數量(上、下、左、右)self.state = 0  # 初始狀態self.goal_state = 4  # 目標狀態def step(self, action):# 定義狀態轉移和獎勵機制if action == 0:  # 上self.state = max(0, self.state - 1)elif action == 1:  # 下self.state = min(self.state_space - 1, self.state + 1)elif action == 2:  # 左self.state = max(0, self.state - 1)elif action == 3:  # 右self.state = min(self.state_space - 1, self.state + 1)# 獎勵機制if self.state == self.goal_state:return self.state, 1, True  # 到達目標,獲得獎勵1else:return self.state, -0.1, False  # 未到達目標,獲得小的懲罰# Q學習算法
def q_learning_maze(episodes):env = MazeEnvironment()Q = np.zeros((env.state_space, env.action_space))  # 初始化Q值表alpha = 0.1  # 學習率gamma = 0.9  # 折扣因子epsilon = 0.1  # 探索率for episode in range(episodes):state = random.randint(0, env.state_space - 1)  # 隨機初始狀態done = Falsewhile not done:# ε-貪婪策略選擇動作if random.uniform(0, 1) < epsilon:action = random.randint(0, env.action_space - 1)  # 隨機選擇else:action = np.argmax(Q[state])  # 選擇最大Q值的動作new_state, reward, done = env.step(action)  # 執行動作并觀察結果# 更新Q值Q[state, action] += alpha * (reward + gamma * np.max(Q[new_state]) - Q[state, action])state = new_state  # 更新狀態return Q# 訓練智能體
Q_values = q_learning_maze(1000)
print("Q值表:")
print(Q_values)

2. 機器人控制

在機器人控制中,Q學習可以幫助機器人在動態環境中學習如何執行任務。例如,訓練一個機器人在一個簡單的網格環境中移動到目標位置。

class RobotEnvironment:def __init__(self):self.state_space = 16  # 4x4網格self.action_space = 4  # 動作數量(上、下、左、右)self.state = 0  # 初始狀態self.goal_state = 15  # 目標狀態def step(self, action):# 定義狀態轉移row, col = divmod(self.state, 4)if action == 0 and row > 0:  # 上row -= 1elif action == 1 and row < 3:  # 下row += 1elif action == 2 and col > 0:  # 左col -= 1elif action == 3 and col < 3:  # 右col += 1self.state = row * 4 + col# 獎勵機制if self.state == self.goal_state:return self.state, 1, True  # 到達目標,獲得獎勵1else:return self.state, -0.1, False  # 未到達目標,獲得小的懲罰# Q學習算法
def q_learning_robot(episodes):env = RobotEnvironment()Q = np.zeros((env.state_space, env.action_space))  # 初始化Q值表alpha = 0.1  # 學習率gamma = 0.9  # 折扣因子epsilon = 0.1  # 探索率for episode in range(episodes):state = random.randint(0, env.state_space - 1)  # 隨機初始狀態done = Falsewhile not done:# ε-貪婪策略選擇動作if random.uniform(0, 1) < epsilon:action = random.randint(0, env.action_space - 1)  # 隨機選擇else:action = np.argmax(Q[state])  # 選擇最大Q值的動作new_state, reward, done = env.step(action)  # 執行動作并觀察結果# 更新Q值Q[state, action] += alpha * (reward + gamma * np.max(Q[new_state]) - Q[state, action])state = new_state  # 更新狀態return Q# 訓練機器人
Q_values_robot = q_learning_robot(1000)
print("機器人Q值表:")
print(Q_values_robot)

3. 推薦系統

在推薦系統中,Q學習可以用于優化用戶的推薦策略。通過將用戶的行為視為狀態,Q學習可以幫助系統學習如何為用戶推薦最合適的內容。

class RecommendationEnvironment:def __init__(self, num_users, num_items):self.num_users = num_usersself.num_items = num_itemsself.state = 0  # 當前用戶self.action_space = num_items  # 動作數量(推薦的物品)def step(self, action):# 模擬用戶對推薦物品的反饋reward = np.random.choice([0, 1], p=[0.5, 0.5])  # 隨機反饋self.state = (self.state + 1) % self.num_users  # 切換到下一個用戶return self.state, reward, self.state == 0  # 返回新狀態、獎勵和是否結束# Q學習算法
def q_learning_recommendation(episodes, num_users, num_items):env = RecommendationEnvironment(num_users, num_items)Q = np.zeros((num_users, num_items))  # 初始化Q值表alpha = 0.1  # 學習率gamma = 0.9  # 折扣因子epsilon = 0.1  # 探索率for episode in range(episodes):state = 0  # 從第一個用戶開始done = Falsewhile not done:# ε-貪婪策略選擇動作if random.uniform(0, 1) < epsilon:action = random.randint(0, env.action_space - 1)  # 隨機選擇else:action = np.argmax(Q[state])  # 選擇最大Q值的動作new_state, reward, done = env.step(action)  # 執行動作并觀察結果# 更新Q值Q[state, action] += alpha * (reward + gamma * np.max(Q[new_state]) - Q[state, action])state = new_state  # 更新狀態return Q# 訓練推薦系統
Q_values_recommendation = q_learning_recommendation(1000, 5, 10)
print("推薦系統Q值表:")
print(Q_values_recommendation)

結論

??Q學習作為一種經典的強化學習算法,以其簡單而有效的學習機制在多個領域展現出了強大的應用潛力。從游戲AI到機器人控制,再到推薦系統,Q學習通過與環境的交互不斷優化決策策略,幫助智能體在復雜的情境中做出最佳選擇。本文詳細闡述了Q學習的基本原理、數學模型、實現步驟以及具體應用場景,旨在為讀者提供一個全面的理解。

??隨著技術的不斷進步,Q學習的應用范圍將進一步擴大,尤其是在智能系統和自動化領域。未來,結合深度學習等先進技術,Q學習有望在更復雜的環境中實現更高效的學習和決策。希望本文能夠激發讀者對Q學習的興趣,并為其在實際項目中的應用提供有價值的參考。


??碼文不易,本篇文章就介紹到這里,如果想要學習更多Java系列知識點擊關注博主,博主帶你零基礎學習Java知識。與此同時,對于日常生活有困擾的朋友,歡迎閱讀我的第四欄目:《國學周更—心性養成之路》,學習技術的同時,我們也注重了心性的養成。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62915.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62915.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62915.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

樹狀數組詳解

概述 樹狀數組&#xff08;Binary Indexed Tree&#xff0c;簡稱BIT&#xff09;&#xff0c;是一種數據結構&#xff0c;用于處理區間查詢和更新問題。它是一種可以高效地在對數級別時間復雜度內進行單點更新和區間查詢的數據結構。樹狀數組通常用于解決以下兩類問題&#xf…

freeswitch(開啟支持MCU視頻會議,使用mod_av模塊)

親測版本centos 7.9系統–》 freeswitch1.10.9 本人freeswitch安裝路徑(根據自己的路徑進入) /usr/local/freeswitch/etc/freeswitch場景說明: 有些場景想使用視頻會議MCU融合畫面進行開會使用方法: 第一步:下載插件 yum install -y epel-release yum install

【大數據技術基礎】【記錄Ubuntu 16.04升級到18.04】Ubuntu的一個版本升級到另一個版本

在 Ubuntu 操作系統中進行軟件更新和系統升級 Ubuntu Kylin 16.04 LTS 系統進行系統升級到 Ubuntu 18.04.6 LTS 版本 升級提示&#xff1a;系統彈出提示框&#xff0c;告知用戶有新版本的 Ubuntu 可用&#xff0c;詢問用戶是否想要升級。 認證窗口&#xff1a;顯示了一個認證…

這是一個vue3 + scss的數字滾動效果

介紹: 當數字變化時&#xff0c;只改變變化的數字位&#xff0c;其余的不變&#xff0c;可以遞增、遞減、驟變、負數也可以&#xff0c;但是樣式要根據具體的項目需求去改&#xff1b; 效果1、增加數字&#xff1a; 效果2、減少數字&#xff1a; 使用方法&#xff1a; <te…

TortoiseGit的下載、安裝和配置

一、TortoiseGit的簡介 tortoiseGit是一個開放的git版本控制系統的源客戶端&#xff0c;支持Winxp/vista/win7.該軟件功能和git一樣 不同的是&#xff1a;git是命令行操作模式&#xff0c;tortoiseGit界面化操作模式&#xff0c;不用記git相關命令就可以直接操作&#xff0c;讀…

最新版Chrome瀏覽器加載ActiveX控件之Adobe PDF閱讀器控件

背景 Adobe PDF閱讀器控件是一個ActiveX控件&#xff0c;用于在Windows平臺上顯示和操作PDF文件。它提供了一系列方法和屬性&#xff0c;可以實現對PDF文件的加載、顯示、搜索、打印、保存等操作。 allWebPlugin中間件是一款為用戶提供安全、可靠、便捷的瀏覽器插件服務的中間件…

linux在沒網的情況下如何校驗時間 超詳細拿來即用

一、沒有校時服務器的話 1、手動修改 sudo date --set"2024-06-17 13:44:00"二、有校時服務器的話 1、手動校時 ntpdate 14.193.73.22、自動校時 寫一個校時服務腳本 14.193.73.2 是校驗時間服務器 #!/bin/sh while true dontpdate 14.193.73.2sleep 5;hwclock…

源碼分析之Openlayers中的控件篇Control基類介紹

概述 Openlayers 中內置了9類控件&#xff0c;這9類控件都是基于Control類&#xff0c;而Control類則是繼承于BaseObject類&#xff0c;如下圖所示&#xff1a; 如上&#xff0c;這9類控件分別是&#xff1a; Attribution&#xff1a;屬性控件FullScreen:全屏控件MousePositi…

計算機網絡知識點全梳理(二.HTTP知識點總結)

目錄 HTTP基本概念 HTTP優缺點 HTTP優點&#xff08;1.1&#xff09; HTTP缺點 HTTP與HTTPS HTTP 與 HTTPS 的區別 HTTPS 解決 HTTP 的哪些安全問題&#xff1f; HTTPS 如何解決安全問題&#xff1f; HTTPS 連接建立的過程&#xff1a; HTTP/1.1、HTTP/2、HTTP/3 演…

第P2周:Pytorch實現CIFAR10彩色圖片識別

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 目標 實現CIFAR-10的彩色圖片識別實現比P1周更復雜一點的CNN網絡 具體實現 &#xff08;一&#xff09;環境 語言環境&#xff1a;Python 3.10 編 譯 器: …

Quant connect的優勢和不足,學習曲線難

Quant connect的優勢和不足 Quant connect作為一個成熟的算法交易平臺&#xff0c;具有許多優勢&#xff0c;包括&#xff1a; 強大的回測功能&#xff1a;Quant connect提供了豐富的數據源和回測功能&#xff0c;可以對各種交易策略進行全面的回測和分析。 容易上手&#xf…

深入理解 Ansible Playbook:組件與實戰

目錄 1 playbook介紹 2 YAML語言 2.1語法簡介 2.2數據類型 3 Playbook核心組件 3.1 hosts組件 3.2 remote_user組件 3.3 task列表和action組件 3.4 handlers 3.5 tags組件 3.6 其他組件說明 1 playbook介紹 playbook 劇本是由一個或多個"play"組成的列表。…

2024年食堂采購系統源碼技術趨勢:如何開發智能的供應鏈管理APP

本篇文章&#xff0c;小編將與大家一同探討2024年食堂采購系統的技術趨勢&#xff0c;并提供開發更智能的供應鏈管理APP的策略。 一、2024年食堂采購系統的技術趨勢 1.人工智能與機器學習的深度應用 在2024年&#xff0c;AI和機器學習在食堂采購系統中的應用將更加普遍。這些…

代碼隨想錄-算法訓練營-番外(圖論01:圖論理論基礎,所有可到達的路徑)

day01 圖論part01 今日任務:圖論理論基礎/所有可到達的路徑 代碼隨想錄圖論視頻部分還沒更新 https://programmercarl.com/kamacoder/圖論理論基礎.html#圖的基本概念 day01 所有可達路徑 鄰接矩陣 import java.util.Scanner;import java.util.List;import java.util.ArrayL…

系統架構的演變

什么是系統架構&#xff1f; 系統架構是系統的一種整體的高層次的結構表示&#xff0c;它確定了系統的基本組織、組件之間的關系、組件與環境的關系&#xff0c;以及指導其設計和發展的原則。隨著技術的發展和業務需求的增長&#xff0c;系統架構經歷了從簡單到復雜、從集中到…

c++總復習

C 中多態性在實際項目中的應用場景 圖形繪制系統 描述&#xff1a;在一個圖形繪制軟件中&#xff0c;可能有多種圖形&#xff0c;如圓形、矩形、三角形等。這些圖形都有一個共同的操作&#xff0c;比如繪制&#xff08;draw&#xff09;。通過多態性&#xff0c;可以定義一個基…

pip離線安裝一個github倉庫

要使用pip安裝一個本地Git倉庫&#xff0c;你可以按照以下步驟操作&#xff1a; 確保你已經克隆了Git倉庫到本地。 進入倉庫所在的目錄。 使用pip安裝。 以下是具體的命令&#xff1a; 克隆Git倉庫到本地&#xff08;替換下面的URL為你的倉庫URL&#xff09; git clone https…

【從零開始入門unity游戲開發之——C#篇04】棧(Stack)和堆(Heap),值類型和引用類型,以及特殊的引用類型string

文章目錄 知識回顧一、棧&#xff08;Stack&#xff09;和堆&#xff08;Heap&#xff09;1、什么是棧和堆2、為什么要分棧和堆3、棧和堆的區別棧堆 4、總結 二、值類型和引用類型1、那么值類型和引用類型到底有什么區別呢&#xff1f;值類型引用類型 2、總結 三、特殊的引用類…

【C語言實現:用隊列模擬棧與用棧模擬隊列(LeetCode 225 232)】

LeetCode刷題記錄 &#x1f310; 我的博客主頁&#xff1a;iiiiiankor&#x1f3af; 如果你覺得我的內容對你有幫助&#xff0c;不妨點個贊&#x1f44d;、留個評論?&#xff0c;或者收藏?&#xff0c;讓我們一起進步&#xff01;&#x1f4dd; 專欄系列&#xff1a;LeetCode…

【Python】Selenium 爬蟲的使用技巧和案例

引言 Selenium 是 Python 中功能強大的自動化測試工具,因其能夠操控瀏覽器進行模擬操作,被廣泛應用于網頁數據爬取。相比傳統的 requests 等庫,Selenium 能更好地應對動態加載內容和復雜交互場景。本文將詳細介紹 Selenium 爬蟲的使用技巧,并提供實際案例來幫助讀者快速上…