《深度學習進階》第7集:深度實戰 通過訓練一個智能體玩游戲 來洞察 強化學習(RL)與決策系統

深度學習進階 | 第7集:深度實戰 通過訓練一個智能體玩游戲 來洞察 強化學習(RL)與決策系統

在深度學習的廣闊領域中,強化學習(Reinforcement Learning, RL)是一種獨特的范式,它通過智能體與環境的交互來學習如何做出最優決策。從自動駕駛到游戲AI,再到自然語言處理,強化學習的應用正在不斷擴展。本文將帶你深入了解強化學習的核心概念、經典算法以及前沿應用,并通過一個實戰項目幫助你掌握其實際操作。


知識點

1. 強化學習的基本概念

強化學習的核心思想是“試錯學習”。智能體(Agent)通過與環境(Environment)的交互,逐步學會采取行動以最大化累積獎勵(Reward)。以下是幾個關鍵術語:

  • 狀態(State):智能體對環境的觀察結果,表示當前所處的情況。
  • 動作(Action):智能體可以采取的行為。
  • 獎勵(Reward):智能體在某一狀態下采取某一動作后獲得的反饋信號,用于指導學習。
  • 策略(Policy):智能體根據當前狀態選擇動作的規則。
  • 價值函數(Value Function):衡量某一狀態下未來可能獲得的累積獎勵的期望值。

強化學習的目標是找到一個最優策略,使得智能體在長期中能夠獲得最大的累積獎勵。


2. Q-Learning 與深度 Q 網絡(DQN)

Q-Learning 是一種經典的強化學習算法,基于價值迭代的思想。它通過更新 Q 值表(Q-Table)來估計每個狀態-動作對的價值。然而,當狀態空間和動作空間較大時,傳統的 Q-Learning 難以應對。

為了解決這一問題,DeepMind 提出了深度 Q 網絡(Deep Q-Network, DQN),將神經網絡引入 Q-Learning 中,用以近似 Q 值函數。DQN 的核心創新包括:

  • 經驗回放(Experience Replay):存儲智能體的歷史經驗,并隨機采樣進行訓練,打破數據之間的相關性。
  • 目標網絡(Target Network):使用一個獨立的網絡來計算目標 Q 值,穩定訓練過程。

DQN 在 Atari 游戲中的成功應用標志著深度強化學習的崛起。


3. 近端策略優化(PPO)與 Actor-Critic 方法

除了基于價值的方法(如 DQN),強化學習還包括基于策略的方法。Actor-Critic 是一種結合了策略優化和價值評估的框架:

  • Actor:負責生成策略,直接輸出動作。
  • Critic:負責評估策略的好壞,提供價值函數的估計。

近端策略優化(Proximal Policy Optimization, PPO)是目前最流行的策略優化算法之一。它的主要特點是:

  • 使用一個“剪切”的目標函數,限制策略更新的幅度,避免訓練不穩定。
  • 計算效率高,適合大規模任務。

PPO 在連續控制任務(如機器人運動)和復雜游戲環境中表現出色。


實戰項目:使用 DQN 玩 Atari 游戲

項目背景

我們將使用 DQN 算法訓練一個智能體玩經典的 Atari 游戲《Breakout》。這款游戲的目標是控制擋板擊打小球,擊碎磚塊并得分。

實現步驟

  1. 環境搭建

    • 使用 OpenAI Gym 提供的 Atari 環境。
    • 安裝必要的依賴庫,如 gymtensorflowpytorch
  2. 模型設計

    • 構建一個卷積神經網絡(CNN)作為 Q 網絡,輸入為游戲畫面,輸出為每個動作的 Q 值。
    • 設置目標網絡和經驗回放緩沖區。
  3. 訓練過程

    • 初始化智能體和環境。
    • 在每一步中,智能體根據 ε-greedy 策略選擇動作,并與環境交互。
    • 將經驗存儲到緩沖區中,并隨機采樣進行訓練。
    • 定期更新目標網絡的參數。
  4. 測試與評估

    • 在訓練完成后,測試智能體的表現。
    • 可視化游戲畫面和獎勵曲線。

示例代碼片段

import gym
import numpy as np
import tensorflow as tf# 創建 Atari 環境
env = gym.make("Breakout-v0")# 定義 DQN 網絡
class DQN(tf.keras.Model):def __init__(self, num_actions):super(DQN, self).__init__()self.conv1 = tf.keras.layers.Conv2D(32, 8, strides=4, activation='relu')self.conv2 = tf.keras.layers.Conv2D(64, 4, strides=2, activation='relu')self.conv3 = tf.keras.layers.Conv2D(64, 3, strides=1, activation='relu')self.flatten = tf.keras.layers.Flatten()self.fc = tf.keras.layers.Dense(512, activation='relu')self.q_values = tf.keras.layers.Dense(num_actions)def call(self, inputs):x = self.conv1(inputs)x = self.conv2(x)x = self.conv3(x)x = self.flatten(x)x = self.fc(x)return self.q_values(x)# 訓練邏輯(簡化版)
num_episodes = 1000
for episode in range(num_episodes):state = env.reset()total_reward = 0while True:action = agent.select_action(state)  # 根據策略選擇動作next_state, reward, done, _ = env.step(action)agent.store_experience(state, action, reward, next_state, done)agent.train()  # 更新 Q 網絡total_reward += rewardstate = next_stateif done:breakprint(f"Episode {episode}: Total Reward = {total_reward}")

圖示

強化學習框架圖

在這里插入圖片描述

圖1:強化學習的基本框架,包括智能體、環境、狀態、動作和獎勵。

游戲畫面截圖

圖2:使用 DQN 訓練的智能體在《Breakout》游戲中的表現。


為促進大家實戰經驗,下面我將設計一個基于 pygame 的簡化版《Breakout》游戲,并使用深度 Q 網絡(DQN)來訓練智能體玩這個游戲。以下是完整的實戰案例、代碼和部署過程,分為5個部分:游戲開發DQN 實現環境封裝和訓練智能體整合到游戲中游戲渲染


實戰拓展1:基于 Pygame 的 Breakout 游戲

游戲規則

  • 玩家控制一個擋板(paddle),通過左右移動接住反彈的小球。
  • 小球撞擊磚塊后會消除磚塊并得分。
  • 如果小球掉落到屏幕底部,游戲結束。

游戲代碼

import pygame
import random# 初始化 Pygame
pygame.init()# 屏幕尺寸
SCREEN_WIDTH = 400
SCREEN_HEIGHT = 500
BLOCK_WIDTH = 50
BLOCK_HEIGHT = 20
PADDLE_WIDTH = 80
PADDLE_HEIGHT = 10
BALL_RADIUS = 8# 顏色定義
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)# 初始化屏幕
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Breakout")# 定義擋板類
class Paddle:def __init__(self):self.width = PADDLE_WIDTHself.height = PADDLE_HEIGHTself.x = (SCREEN_WIDTH - self.width) // 2self.y = SCREEN_HEIGHT - 30self.speed = 7def move(self, direction):if direction == "LEFT" and self.x > 0:self.x -= self.speedelif direction == "RIGHT" and self.x < SCREEN_WIDTH - self.width:self.x += self.speeddef draw(self):pygame.draw.rect(screen, BLUE, (self.x, self.y, self.width, self.height))# 定義小球類
class Ball:def __init__(self):self.radius = BALL_RADIUSself.x = SCREEN_WIDTH // 2self.y = SCREEN_HEIGHT // 2self.dx = random.choice([-4, 4])self.dy = -4def move(self):self.x += self.dxself.y += self.dy# 邊界碰撞檢測if self.x <= 0 or self.x >= SCREEN_WIDTH:self.dx = -self.dxif self.y <= 0:self.dy = -self.dydef draw(self):pygame.draw.circle(screen, RED, (self.x, self.y), self.radius)# 定義磚塊類
class Block:def __init__(self, x, y):self.width = BLOCK_WIDTHself.height = BLOCK_HEIGHTself.x = xself.y = yself.alive = Truedef draw(self):if self.alive:pygame.draw.rect(screen, WHITE, (self.x, self.y, self.width, self.height))# 初始化游戲對象
paddle = Paddle()
ball = Ball()
blocks = []
for row in range(5):for col in range(SCREEN_WIDTH // BLOCK_WIDTH):blocks.append(Block(col * BLOCK_WIDTH, row * BLOCK_HEIGHT + 50))# 主循環
clock = pygame.time.Clock()
running = True
score = 0while running:screen.fill(BLACK)for event in pygame.event.get():if event.type == pygame.QUIT:running = False# 擋板控制keys = pygame.key.get_pressed()if keys[pygame.K_LEFT]:paddle.move("LEFT")if keys[pygame.K_RIGHT]:paddle.move("RIGHT")# 小球移動ball.move()# 小球與擋板碰撞檢測if (paddle.x < ball.x < paddle.x + paddle.width) and (paddle.y < ball.y + ball.radius < paddle.y + paddle.height):ball.dy = -ball.dy# 小球與磚塊碰撞檢測for block in blocks:if block.alive and block.x < ball.x < block.x + block.width and block.y < ball.y < block.y + block.height:block.alive = Falseball.dy = -ball.dyscore += 10# 繪制游戲對象paddle.draw()ball.draw()for block in blocks:block.draw()# 顯示分數font = pygame.font.SysFont(None, 36)score_text = font.render(f"Score: {score}", True, WHITE)screen.blit(score_text, (10, 10))# 檢查游戲結束if ball.y > SCREEN_HEIGHT:running = Falsepygame.display.flip()clock.tick(60)pygame.quit()

實戰拓展2:使用 DQN 訓練智能體

DQN 實現

我們將使用 tensorflow 構建 DQN 模型,并訓練智能體玩上述游戲。

1. 環境封裝

為了將游戲適配到強化學習框架中,我們需要將其封裝為一個環境。

import numpy as npclass BreakoutEnv:def __init__(self):self.screen_width = SCREEN_WIDTHself.screen_height = SCREEN_HEIGHTself.paddle = Paddle()self.ball = Ball()self.blocks = [Block(col * BLOCK_WIDTH, row * BLOCK_HEIGHT + 50)for row in range(5) for col in range(SCREEN_WIDTH // BLOCK_WIDTH)]self.score = 0self.done = Falsedef reset(self):self.paddle = Paddle()self.ball = Ball()self.blocks = [Block(col * BLOCK_WIDTH, row * BLOCK_HEIGHT + 50)for row in range(5) for col in range(SCREEN_WIDTH // BLOCK_WIDTH)]self.score = 0self.done = Falsereturn self._get_state()def step(self, action):if action == 0:self.paddle.move("LEFT")elif action == 1:self.paddle.move("RIGHT")self.ball.move()# 碰撞檢測reward = 0for block in self.blocks:if block.alive and block.x < self.ball.x < block.x + block.width and block.y < self.ball.y < block.y + block.height:block.alive = Falseself.ball.dy = -self.ball.dyreward += 10self.score += 10if (self.paddle.x < self.ball.x < self.paddle.x + self.paddle.width) and \(self.paddle.y < self.ball.y + self.ball.radius < self.paddle.y + self.paddle.height):self.ball.dy = -self.ball.dyif self.ball.y > self.screen_height:self.done = Truereward = -100return self._get_state(), reward, self.donedef _get_state(self):# 返回當前狀態(簡化版)return np.array([self.ball.x, self.ball.y, self.ball.dx, self.ball.dy, self.paddle.x])def render(self):pass  # 可以調用 Pygame 渲染邏輯
2. DQN 模型與訓練
import tensorflow as tf
from collections import deque
import randomclass DQNAgent:def __init__(self, state_size, action_size):self.state_size = state_sizeself.action_size = action_sizeself.memory = deque(maxlen=2000)self.gamma = 0.95  # 折扣因子self.epsilon = 1.0  # 探索率self.epsilon_min = 0.01self.epsilon_decay = 0.995self.learning_rate = 0.001self.model = self._build_model()def _build_model(self):model = tf.keras.Sequential([tf.keras.layers.Dense(24, input_dim=self.state_size, activation='relu'),tf.keras.layers.Dense(24, activation='relu'),tf.keras.layers.Dense(self.action_size, activation='linear')])model.compile(loss='mse', optimizer=tf.keras.optimizers.Adam(learning_rate=self.learning_rate))return modeldef remember(self, state, action, reward, next_state, done):self.memory.append((state, action, reward, next_state, done))def act(self, state):if np.random.rand() <= self.epsilon:return random.randrange(self.action_size)q_values = self.model.predict(state)return np.argmax(q_values[0])def replay(self, batch_size):if len(self.memory) < batch_size:returnminibatch = random.sample(self.memory, batch_size)for state, action, reward, next_state, done in minibatch:target = rewardif not done:target = reward + self.gamma * np.amax(self.model.predict(next_state)[0])target_f = self.model.predict(state)target_f[0][action] = targetself.model.fit(state, target_f, epochs=1, verbose=0)if self.epsilon > self.epsilon_min:self.epsilon *= self.epsilon_decay# 訓練邏輯
env = BreakoutEnv()
state_size = 5  # 狀態維度
action_size = 2  # 動作維度(左移、右移)
agent = DQNAgent(state_size, action_size)
batch_size = 32
episodes = 1000for e in range(episodes):state = env.reset()state = np.reshape(state, [1, state_size])total_reward = 0while True:action = agent.act(state)next_state, reward, done = env.step(action)next_state = np.reshape(next_state, [1, state_size])agent.remember(state, action, reward, next_state, done)state = next_statetotal_reward += rewardif done:print(f"Episode: {e}/{episodes}, Score: {total_reward}, Epsilon: {agent.epsilon:.2f}")breakif len(agent.memory) > batch_size:agent.replay(batch_size)

通過上述代碼,我們實現了一個基于 pygame 的簡化版《Breakout》游戲,并使用 DQN 算法訓練了一個智能體來玩這個游戲。你可以在此基礎上進一步優化模型和算法,例如引入卷積神經網絡(CNN)處理圖像輸入,或者嘗試更高級的強化學習算法(如 PPO)。

在實際開發中,環境封裝和模型訓練可以分開實現,也可以合并到一個文件中。選擇哪種方式取決于項目的規模和復雜性。下面我將詳細解釋如何組織代碼,并說明如何將訓練好的智能體與游戲整合。


實戰拓展3:環境封裝和模型訓練的組織方式

選項 1:合并在一個文件中

如果項目規模較小(如本例中的簡化版《Breakout》),可以將環境封裝和模型訓練放在同一個文件中。這樣做的好處是便于調試和快速迭代。

文件結構
breakout_dqn.py
內容
  • BreakoutEnv 類:負責游戲邏輯和狀態管理。
  • DQNAgent 類:負責構建和訓練 DQN 模型。
  • 主程序部分:包含訓練邏輯。

這種方式適合初學者或小型項目,因為所有代碼都在一個文件中,易于理解。


選項 2:分為多個文件

對于更大、更復雜的項目,建議將環境封裝和模型訓練分開,以便更好地組織代碼和復用模塊。

文件結構
project/
│
├── breakout_env.py       # 游戲環境封裝
├── dqn_agent.py          # DQN 智能體實現
└── train.py              # 訓練腳本
各文件內容
  1. breakout_env.py

    • 包含 BreakoutEnv 類,定義游戲邏輯和狀態管理。
    • 提供接口(如 reset()step())供強化學習算法調用。
  2. dqn_agent.py

    • 包含 DQNAgent 類,定義 DQN 模型和訓練邏輯。
    • 負責智能體的動作選擇、經驗回放和模型更新。
  3. train.py

    • 導入 BreakoutEnvDQNAgent
    • 定義訓練主循環,包括初始化環境、訓練智能體和保存模型。

這種方式更適合大型項目,便于維護和擴展。


實戰拓展4: 訓練完成后如何與游戲整合

訓練完成后,我們需要加載訓練好的模型,并將其與游戲整合,讓智能體自動玩游戲。以下是具體步驟:

步驟 1:保存訓練好的模型

在訓練過程中,定期保存模型權重,以便后續加載。

# 在訓練腳本中保存模型
agent.model.save("dqn_model.h5")

步驟 2:加載模型并運行智能體

創建一個新的腳本(例如 play.py),用于加載訓練好的模型,并讓智能體自動玩游戲。

示例代碼
import pygame
import numpy as np
from breakout_env import BreakoutEnv
from tensorflow.keras.models import load_model# 初始化 Pygame
pygame.init()# 加載訓練好的模型
model = load_model("dqn_model.h5")# 初始化游戲環境
env = BreakoutEnv()
state = env.reset()
state = np.reshape(state, [1, env.state_size])# 游戲主循環
running = True
clock = pygame.time.Clock()
while running:for event in pygame.event.get():if event.type == pygame.QUIT:running = False# 使用模型預測動作q_values = model.predict(state)action = np.argmax(q_values[0])# 執行動作并獲取下一狀態next_state, reward, done = env.step(action)next_state = np.reshape(next_state, [1, env.state_size])state = next_state# 渲染游戲畫面env.render()if done:print("Game Over!")breakclock.tick(60)pygame.quit()

實戰拓展5: 如何渲染游戲畫面

為了讓智能體在游戲中自動玩,我們需要在 BreakoutEnv 中實現 render() 方法,使用 pygame 繪制游戲畫面。

修改 BreakoutEnvrender() 方法

def render(self):screen.fill(BLACK)self.paddle.draw()self.ball.draw()for block in self.blocks:block.draw()# 顯示分數font = pygame.font.SysFont(None, 36)score_text = font.render(f"Score: {self.score}", True, WHITE)screen.blit(score_text, (10, 10))pygame.display.flip()

實戰小結

  • 代碼組織

    • 小型項目:可以將環境封裝和模型訓練合并到一個文件中。
    • 大型項目:建議將環境封裝、智能體實現和訓練邏輯分別放在不同的文件中。
  • 訓練后的整合

    • 訓練完成后,保存模型權重。
    • 創建一個新的腳本,加載模型并讓智能體自動玩游戲。
    • BreakoutEnv 中實現 render() 方法,繪制游戲畫面。

通過以上步驟,你可以完成從環境設計、模型訓練到智能體自動玩游戲的完整流程。希望這些內容對你有所幫助!如果有其他問題,歡迎隨時提問!

前沿關聯

AlphaGo:強化學習的經典案例

AlphaGo 是由 DeepMind 開發的圍棋 AI,它結合了蒙特卡洛樹搜索(MCTS)和深度強化學習。通過自我對弈,AlphaGo 不斷優化策略,最終擊敗了世界冠軍李世石。

ChatGPT:強化學習在 NLP 中的應用

ChatGPT 使用強化學習從人類反饋中學習(Reinforcement Learning from Human Feedback, RLHF)。通過獎勵模型的指導,ChatGPT 能夠生成更符合人類偏好的高質量文本。


總結

強化學習是一種強大的工具,能夠在復雜的決策任務中發揮重要作用。從經典的 Q-Learning 到現代的 DQN 和 PPO,強化學習算法不斷演進。通過本集的學習,你不僅掌握了強化學習的核心概念,還完成了一個實際的 DQN 項目。希望你能在此基礎上繼續探索,將強化學習應用于更多領域!

下一集預告:第8集將探討生成對抗網絡(GANs)及其在圖像生成中的應用。

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

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

相關文章

Linux端口映射

1. 方法一使用firewalld 1.1 開啟偽裝IP firewall-cmd --permanent --add-masquerade 1.2 配置端口轉發&#xff0c;將到達本機的12345端口的訪問轉發到另一臺服務器的22端口 firewall-cmd --permanent --add-forward-portport12345:prototcp:toaddr192.168.172.131:toport…

文本處理Bert面試內容整理-BERT的基本原理是什么?

BERT(Bidirectional Encoder Representations from Transformers)的基本原理可以從以下幾個方面來理解: 1. 雙向上下文建模 BERT的一個核心創新是它通過雙向(bidirectional)建模上下文來理解詞語的意義。傳統的語言模型(如GPT)是單向的,即它們只考慮文本的左到右(或右…

MAC 本地搭建部署 dify(含 github訪問超時+Docker鏡像源拉取超時解決方案)

目錄 一、什么是 dify&#xff1f; 二、安裝 docker 1. 什么是 docker&#xff1f; 2. docker下載地址 三、安裝 dify 1. dify下載地址 2.可能遇到問題一&#xff1a; github訪問超時 3.下載后完成解壓 4.進入到 cmd 終端環境&#xff0c;執行下面三個命令 5.可能遇到…

USB3.0設備控制器驅動分析

一、USB驅動框架分析 USB控制器作為device的驅動框架分為&#xff1a;gadget Function驅動、gadget Function API、Composite以及UDC驅動。 gadget Function 驅動&#xff1a; 解釋&#xff1a;是針對 USB 設備特定功能的驅動程序。功能&#xff1a;負責實現 USB 設備對外提供的…

《Redis 入門指南:快速掌握高性能緩存技術》

目錄 一、準備工作 二、操作數據庫 2.1 切換數據庫 2.2 存儲和查看數據 一、存儲語法 二、一次性存儲多個鍵值對 三、追加值 四、查看值的類型 五、查詢值 六、一次查詢多個值 七、查看當下數據庫所有的鍵 八、刪除鍵 九、查看 鍵 是否存在 十、重命名鍵 2.3 過期…

跨部門溝通與團隊協作

【跨部門協作&#xff1a;破局之道在冰山之下】 感謝太原市組織部信任&#xff0c;上海財經大學邀約 今日為財務精英拆解《跨部門溝通與團隊協作》迷局。從本位思維到共同愿景&#xff0c;用因果回路圖透視沖突本質&#xff0c;當財務人開始用"延遲反饋"視角看預算博…

【零基礎到精通Java合集】第一集:Java開發環境搭建

以下是針對**“Java開發環境搭建”**的15分鐘課程內容設計,包含知識點拆分、實操演示與互動練習: 課程標題:Java開發環境搭建(15分鐘) 目標:完成JDK安裝、IDE配置并運行第一個Java程序 一、課程內容與時間分配 0-2分鐘 課程目標與前置準備 明確學習目標:JDK安裝、環境…

【JavaEE】wait 、notify和單例模式

【JavaEE】wait 、notify 和單例模式 一、引言一、wait()方法二、notify()方法三、notifyAll()方法四、wait&#xff08;&#xff09;和sleep&#xff08;&#xff09;對比五、單例模式5.1 餓漢模式5.2 懶漢模式5.2 懶漢模式-線程安全&#xff08;改進&#xff09; 博客結尾有此…

http報文的content-type參數和spring mvc傳參問題

很早之前博主聊過HTTP的報文結構以及其中和傳參相關的重要參數content-type還有spring mvc&#xff0c;以前的三篇文章&#xff1a; HTTP與HTTPS協議詳解&#xff1a;基礎與安全機制-CSDN博客 詳解Http的Content-Type_content-type application-CSDN博客 如何在Spring Boot中…

‘ts-node‘ 不是內部或外部命令,也不是可運行的程序

新建一個test.ts文件 let message: string = Hello World; console.log(message);如果沒有任何配置的前提下,會報錯’ts-node’ 不是內部或外部命令,也不是可運行的程序。 此時需要安裝一下ts-node。 npm install

《白帽子講 Web 安全:點擊劫持》

目錄 摘要&#xff1a; 一、點擊劫持概述 二、點擊劫持的實現示例&#xff1a;誘導用戶收藏指定淘寶商品 案例 構建惡意頁面&#xff1a; 設置絕對定位和z - index&#xff1a; 控制透明度&#xff1a; 三、其他相關攻擊技術 3.1圖片覆蓋攻擊與 XSIO 3.2拖拽劫持與數據…

基于機器學習的圖像分類綜述

圖像分類是計算機視覺和模式識別領域的核心任務之一,其目標是從輸入的圖像中自動識別并標注其所屬的類別標簽。基于機器學習的圖像分類技術近年來取得了顯著進展,尤其是在深度學習的推動下,性能得到了質的提升,并在多個實際應用中表現出色。 以下是對基于機器學習的圖像分…

SQL Server 中行轉列

在 SQL Server 數據庫中&#xff0c;行轉列在實踐中是一種非常有用&#xff0c;可以將原本以行形式存儲的數據轉換為列的形式&#xff0c;以便更好地進行數據分析和報表展示。本文將深入淺出地介紹 SQL Server 中的行轉列技術&#xff0c;并以數據表中的時間數據為例進行詳細講…

系統架構設計師—計算機基礎篇—系統性能評價

文章目錄 性能評價指標主頻CPU時鐘周期機器周期CPIMIPS 系統性能調整阿姆達爾解決方案性能優化數據庫應用系統Web應用系統 性能評估方法評價程序真實程序基準測試程序核心程序小型基準程序合成基準程序 基準測試程序組 評測準確度 性能指標計算機數據庫應用系統Web應用系統 性能…

web3.0簡介

Web3.0&#xff08;或簡稱 Web3&#xff09;是近年來廣泛討論的一個新型互聯網概念&#xff0c;其核心思想在于利用區塊鏈及相關分布式技術&#xff0c;打造一個更加開放、去中心化、透明且以用戶為主導的網絡生態系統。這意味著在 Web3.0 時代&#xff0c;用戶不再只是信息的消…

python第十一課:并發編程 | 多任務交響樂團

&#x1f3af; 本節目標 理解多線程/多進程/協程的應用場景掌握threading與multiprocessing核心用法學會使用asyncio進行異步編程開發實戰項目&#xff1a;高并發爬蟲引擎破解GIL鎖的性能迷思 1?? 并發編程三劍客 &#x1f3bb; 生活化比喻&#xff1a; 多線程 → 餐廳多個…

微服務架構實踐:SpringCloud與Docker容器化部署

## 微服務架構實踐&#xff1a;SpringCloud與Docker容器化部署 隨著互聯網應用的復雜性不斷增加&#xff0c;傳統的單體應用架構面臨著諸多挑戰&#xff0c;如難以部署、維護困難、開發效率低下等問題凸顯出來。為了解決這些問題&#xff0c;微服務架構應運而生&#xff0c;它通…

SpringBoot實戰(三十二)集成 ofdrw,實現 PDF 和 OFD 的轉換、SM2 簽署OFD

目錄 一、OFD 簡介 1.1 什么是 OFD&#xff1f;1.2 什么是 版式文檔&#xff1f;1.3 為什么要用 OFD 而不是PDF&#xff1f; 二、ofdrw 簡介 2.1 定義2.2 Maven 依賴2.3 ofdrw 的 13 個模塊 三、PDF/文本/圖片 轉 OFD&#xff08;ofdrw-conterver&#xff09; 3.1 介紹&#xf…

隨機樹算法 自動駕駛汽車的路徑規劃 靜態障礙物(Matlab)

隨著自動駕駛技術的蓬勃發展&#xff0c;安全、高效的路徑規劃成為核心挑戰之一。快速探索隨機樹&#xff08;RRT&#xff09;算法作為一種強大的路徑搜索策略&#xff0c;為自動駕駛汽車在復雜環境下繞過靜態障礙物規劃合理路徑提供了有效解決方案。 RRT 算法基于隨機采樣思想…

Vscode通過Roo Cline接入Deepseek

文章目錄 背景第一步、安裝插件第二步、申請API key第三步、Vscode中配置第四步、Deepseek對話 背景 在前期介紹【IDEA通過Contince接入Deepseek】步驟和流程&#xff0c;那如何在vscode編譯器中使用deepseek&#xff0c;記錄下來&#xff0c;方便備查。 第一步、安裝插件 在…