Stanford斯坦福 CS 224R: 深度強化學習 (3)

基于模型的強化學習

強化學習(RL)旨在讓智能體通過與環境互動來學習最優策略,從而最大化累積獎勵。傳統的強化學習方法如Q-learning、策略梯度等,通過大量的試錯來學習值函數或策略,樣本效率較低。而基于模型的強化學習(MBRL)則利用對環境的預測模型來加速學習過程,大大提高了樣本利用率。本章我們將系統地介紹MBRL的基本原理、核心算法、實現技巧以及代表性應用。

1. 采樣優化入門

在探討MBRL之前,我們先來回顧一下優化問題的兩大類解法:基于梯度的方法和基于采樣的方法。

1.1 基于梯度的優化

基于梯度的優化通過目標函數對參數的梯度信息來指導參數更新。給定參數 θ \theta θ 和損失函數 L ( θ ) L(\theta) L(θ),更新步驟為:

θ ← θ ? α ? θ L ( θ ) \theta \leftarrow \theta - \alpha \nabla_{\theta}L(\theta) θθ?α?θ?L(θ)

其中 α \alpha α 為學習率。這類方法在深度學習中被廣泛應用,優點是適用于高維參數空間,收斂速度快;缺點是需要損失函數可導,對優化問題的形式有一定要求。

1.2 基于采樣的優化

基于采樣的優化則不依賴梯度信息,而是通過在參數空間中采樣并評估樣本的性能來搜索最優解。以交叉熵方法(CEM)為例:

  1. 從某個分布(如高斯分布)中采樣一組參數 { θ i ~ p ( θ ) } i = 1 N \{\theta^i \sim p(\theta)\}_{i=1}^N {θip(θ)}i=1N?
  2. 評估各個樣本的損失 { L ( θ i ) } i = 1 N \{L(\theta^i)\}_{i=1}^N {L(θi)}i=1N?,選出表現最好的前k個樣本
  3. 用均值和方差來更新采樣分布 p ( θ ) p(\theta) p(θ)
  4. 重復以上過程直至找到最優解

基于采樣的優化的優點是:

  • 易于并行化
  • 不要求目標函數可導
  • 適用于復雜的優化形式

缺點是:

  • 難以處理高維參數空間
  • 收斂速度較慢

在MBRL中,基于采樣的優化被廣泛用于規劃(planning)任務。例如我們可以通過在動作空間中采樣來搜索最優動作序列。

2. 基于模型的強化學習

MBRL的核心思想是學習一個對環境的預測模型,用它來推斷各種行為的后果,從而指導策略學習。相比無模型RL,MBRL能更有效地利用樣本,實現更高效、更穩定的學習。

2.1 如何學習一個好的動力學模型?

學習環境模型本質上是一個監督學習問題。我們希望學習一個函數 f ? ( s , a ) f_{\phi}(s,a) f??(s,a),使其能較好地預測在狀態 s s s 下執行動作 a a a 后,環境轉移到狀態 s ′ s' s 的結果。即:

min ? ? ∑ ( s , a , s ′ ) ∈ D ∥ f ? ( s , a ) ? s ′ ∥ 2 \min_{\phi} \sum_{(s,a,s')\in\mathcal{D}} \| f_{\phi}(s,a) - s'\|^2 ?min?(s,a,s)D?f??(s,a)?s2

其中 D = { ( s , a , s ′ ) i } \mathcal{D}=\{(s,a,s')_i\} D={(s,a,s)i?} 為收集到的轉移數據集。

根據任務的特點,我們可以采用不同的建模方式,例如:

  • 機器人控制:輸入為狀態和動作,輸出為下一狀態
  • 視頻預測:輸入為之前的圖像序列,輸出為未來的圖像
  • 物理引擎:在已知物理定律的基礎上,學習一些未知參數(如摩擦系數)
  • 對話系統:用語言模型來預測對話的后續發展
  • 金融市場:股票趨勢預測模型

可見,模型的形式依賴于具體問題,但萬變不離其宗,都是在擬合狀態轉移函數 p ( s ′ ∣ s , a ) p(s'|s,a) p(ss,a) 。接下來的問題是,如何有效利用學到的模型?

2.2 如何利用學到的動力學模型?

2.2.1 使用模型進行規劃

規劃(planning)是指在給定模型的情況下,尋找最優動作序列 { a t ? } \{a^*_t\} {at??} 以最大化未來累積獎勵。形式化地,規劃問題可以表示為:

max ? a t : t + H ∑ t ′ = t t + H r ( s t ′ , a t ′ ) \max_{a_{t:t+H}} \sum^{t+H}_{t'=t} r(s_{t'}, a_{t'}) at:t+H?max?t=tt+H?r(st?,at?)

其中 H H H 為規劃視界, r ( s , a ) r(s,a) r(s,a) 為獎勵函數。這個問題可以通過基于梯度的優化或基于采樣的優化來求解。

基于梯度的規劃

基于梯度的規劃通過反向傳播梯度來優化動作序列。主要步驟如下:

  1. 用當前策略(如隨機策略)采集數據 D = { ( s , a , s ′ ) i } \mathcal{D}=\{(s,a,s')_i\} D={(s,a,s)i?}
  2. 訓練模型 f ? f_{\phi} f?? 來最小化預測誤差 ∑ i ∥ f ? ( s i , a i ) ? s i ′ ∥ 2 \sum_{i} \| f_{\phi}(s_i,a_i) - s'_i \|^2 i?f??(si?,ai?)?si?2
  3. 通過反向傳播優化動作序列 { a t ? } = arg ? max ? a t : t + H ∑ t ′ = t t + H r ( s t ′ , a t ′ ) \{a^*_t\} = \arg\max_{a_{t:t+H}} \sum^{t+H}_{t'=t} r(s_{t'}, a_{t'}) {at??}=argmaxat:t+H??t=tt+H?r(st?,at?)

這里第3步通過梯度上升來優化目標函數。模型 f ? f_{\phi} f?? 充當了從動作到狀態的映射,使我們能夠計算目標函數對動作的梯度。

基于采樣的規劃

基于采樣的規劃則通過在動作空間中隨機采樣,并利用模型評估軌跡質量,來搜索最優動作序列。主要步驟如下:

  1. 用當前策略采集數據 D = { ( s , a , s ′ ) i } \mathcal{D}=\{(s,a,s')_i\} D={(s,a,s)i?}
  2. 訓練模型 f ? f_{\phi} f?? 來最小化預測誤差
  3. 通過采樣搜索最優動作序列:
    • 隨機采樣N組長度為H的動作序列 { A t : t + H i } i = 1 N \{A^i_{t:t+H}\}^N_{i=1} {At:t+Hi?}i=1N?
    • 利用 f ? f_{\phi} f?? 預測各動作序列對應的狀態軌跡,并估算累積獎勵
    • 選擇獎勵最高的動作序列 A ? = arg ? max ? A i ∑ t ′ = t t + H r ( s t ′ i , a t ′ i ) A^* = \arg\max_{A^i} \sum^{t+H}_{t'=t} r(s^i_{t'}, a^i_{t'}) A?=argmaxAi?t=tt+H?r(sti?,ati?)

這里第3步本質上是一個啟發式搜索,通過模型模擬來評估候選動作序列的優劣。這種方法的好處是易于實現、可并行化、適用于任意形式的環境模型。

對于連續動作空間,一種更高效的采樣策略是交叉熵方法(CEM):

  1. 從高斯分布 N ( μ , Σ ) \mathcal{N}(\mu, \Sigma) N(μ,Σ) 中采樣N個動作序列 { A i } i = 1 N \{A^i\}^N_{i=1} {Ai}i=1N?
  2. 評估各動作序列的累積獎勵 J ( A i ) = ∑ t ′ = t t + H r ( s t ′ i , a t ′ i ) J(A^i) = \sum^{t+H}_{t'=t} r(s^i_{t'}, a^i_{t'}) J(Ai)=t=tt+H?r(sti?,ati?)
  3. 選出獎勵最高的前k個動作序列 { A i j } j = 1 k \{A^{i_j}\}^k_{j=1} {Aij?}j=1k?
  4. { A i j } j = 1 k \{A^{i_j}\}^k_{j=1} {Aij?}j=1k? 來更新高斯分布的均值和方差
  5. 重復以上過程,直至分布收斂

CEM相比隨機采樣,能更快地集中到高獎勵區域進行采樣,減少搜索代價。

規劃算法總結

方法優點缺點
基于梯度適用高維動作空間需模型可導
隨機采樣簡單,可并行采樣效率低
交叉熵法采樣高效依賴初始分布

以上規劃算法都是開環(open-loop)控制,即先規劃一個動作序列,然后不更新地執行到底。這對模型精度要求很高,否則容易導致誤差累積。一種常用的改進是模型預測控制(model predictive control),即每次只執行規劃出的前幾步動作,然后重新規劃。通過反復規劃來及時修正誤差,使控制更加魯棒

2.2.2 使用模型指導策略學習

規劃的一個局限是需要精確的獎勵函數,且很難處理長期回報。一種更通用的做法是利用模型來輔助策略(policy)或值函數(value function)的學習。我們可以用學到的模型來增強真實的環境交互數據。具體來說,訓練過程為:

  1. 用當前策略 π \pi π 在真實環境中采樣數據 D e n v \mathcal{D}_{env} Denv?
  2. 訓練模型 f ? f_{\phi} f?? 來擬合狀態轉移函數
  3. f ? f_{\phi} f?? D e n v \mathcal{D}_{env} Denv? 中的各個狀態出發,模擬生成數據 D m o d e l \mathcal{D}_{model} Dmodel?
  4. D e n v \mathcal{D}_{env} Denv? D m o d e l \mathcal{D}_{model} Dmodel? 合并為 D R L \mathcal{D}_{RL} DRL?
  5. D R L \mathcal{D}_{RL} DRL? 來訓練新策略 π ′ \pi' π (或值函數 V V V)
  6. 重復以上過程,即可迭代優化策略

這個過程可以與任意的無模型RL算法相結合,關鍵是用模型模擬數據來加速策略學習。通過對 D e n v \mathcal{D}_{env} Denv? 中的各個狀態seed模擬軌跡,我們能更充分地利用采集到的真實轉移數據。相比單純地想象完整軌跡,這種做法能更好地覆蓋狀態空間。

3. 案例分析:用MBRL實現機器人靈巧操控

DeepMind在2019年提出的一個工作,展示了用MBRL讓一只仿真五指機械手學會各種靈巧操控,如旋轉棒、翻轉刀等。盡管已經過去兩年,但這個結果至今仍是五指靈巧操控領域最激動人心的成果之一。讓我們來剖析一下他們是如何做到的。

3.1 問題定義

狀態空間: 機械手和物體的位置
動作空間: 24維,控制5個手指的關節角度
模型結構: 3個全連接網絡組成的集成模型,每個網絡有2個大小為500的隱藏層
獎勵函數: 跟蹤物體軌跡的誤差 + 懲罰掉落
規劃算法: 修改版的CEM,引入時間平滑正則化和更softer的加權平均

整體訓練過程為:交替地用CEM規劃采集大約30條軌跡數據,并用新數據更新集成模型,如此反復迭代。

3.2 仿真實驗

他們首先在MuJoCo物理引擎中構建仿真環境,測試不同RL算法的表現:

  • 無模型RL:
    • SAC:一種actor-critic算法
    • NPG:一種策略梯度算法
  • 有模型RL:
    • PDDM:本文提出的MBRL算法
    • MBPO:利用模型數據增強的RL算法
    • PETS:基于CEM的MBRL算法
    • Nagabandi et al.:基于隨機采樣的MBRL,不使用集成

從結果可以看出,MBRL算法的采樣效率明顯高于無模型RL,其中PDDM的表現最佳。進一步的消融實驗表明:

  • 模型容量要足夠大,但太大也會過擬合
  • 集成模型至少需要3個成員
  • 規劃視界是個重要的權衡:太短則短視,太長則不可靠
  • CEM的改進策略是關鍵,尤其是temporally-correlated探索

可見,PDDM之所以性能卓越,緣于以下幾點優化:

  • 大容量集成模型,增強了預測魯棒性
  • 適度的規劃視界,權衡了可靠性和遠見性
  • 改進的CEM采樣,引入了探索的時間相關性

3.3 實物實驗

為了驗證算法在實物場景中的有效性,他們搭建了一套機械手系統,包括一只24關節的ShadowHand和一套PhaseSpace運動捕捉系統。

實物訓練面臨兩大挑戰:

  • 采樣成本高,需要樣本高效的算法
  • 很難完全復現初始狀態,增加了訓練難度

他們先在仿真環境中預訓練策略,再遷移到實物上微調。同時為了自動化采集數據,他們額外加了一只機械臂用于在每個回合將物體重置到初始位置。最終,系統在4小時內就學會了花式轉棒的技能,展現了MBRL的強大潛力。

4. 代碼實戰

下面我們通過一個簡單的例子來演示MBRL的實現。考慮倒立擺(Inverted Pendulum)環境,狀態為擺角 θ \theta θ 和角速度 θ ˙ \dot{\theta} θ˙,動作為施加在擺基座的水平力。我們的目標是學習一個策略,使擺盡快達到并保持直立平衡。

首先導入需要的庫:

import numpy as np
import torch
import gym
import matplotlib.pyplot as plt

然后定義一個神經網絡作為環境模型:

class Model(torch.nn.Module):def __init__(self, state_dim, action_dim):super().__init__()self.fc1 = torch.nn.Linear(state_dim + action_dim, 256)self.fc2 = torch.nn.Linear(256, 256)self.fc3 = torch.nn.Linear(256, state_dim)def forward(self, state, action):x = torch.cat([state, action], dim=-1)x = torch.relu(self.fc1(x))  x = torch.relu(self.fc2(x))next_state = self.fc3(x)return next_state

模型輸入當前狀態和動作,輸出預測的下一狀態。接下來我們定義MBRL算法的主要組件:

class MBRL:def __init__(self, env, model, n_plan, n_iter, n_batch=128):self.env = env  self.model = modelself.n_plan = n_plan  # 規劃視界self.n_iter = n_iter  # 總迭代次數self.n_batch = n_batch

其中env為強化學習環境,model為環境模型,n_plan為規劃視界,n_iter為總迭代次數,n_batch為批大小。接下來實現數據采集函數:

    def collect_data(self, n_samples):states, actions, rewards, next_states = [], [], [], []state = self.env.reset()for _ in range(n_samples):action = self.env.action_space.sample()next_state, reward, done, _ = self.env.step(action)states.append(state)actions.append(action)rewards.append(reward)next_states.append(next_state)state = next_state if not done else self.env.reset()states = torch.tensor(states, dtype=torch.float32)actions = torch.tensor(actions, dtype=torch.float32)rewards = torch.tensor(rewards, dtype=torch.float32)next_states = torch.tensor(next_states, dtype=torch.float32) return states, actions, rewards, next_states  

這個函數使用隨機策略采集指定數量的轉移數據,并返回狀態、動作、獎勵和下一狀態的張量。有了真實數據,我們就可以訓練模型了:

    def train_model(self, states, actions, next_states):dataset = torch.utils.data.TensorDataset(states, actions, next_states)dataloader = torch.utils.data.DataLoader(dataset, batch_size=self.n_batch, shuffle=True)criterion = torch.nn.MSELoss()optimizer = torch.optim.Adam(self.model.parameters())for epoch in range(5):for batch in dataloader:state, action, next_state = batchpred_next_state = self.model(state, action)loss = criterion(pred_next_state, next_state)optimizer.zero_grad()loss.backward()optimizer.step()

模型訓練采用均方損失和Adam優化器,訓練5個epoch,每個epoch遍歷整個數據集。接下來我們實現基于CEM的規劃器:

    def plan(self, state):best_reward = -np.infbest_action_seq = Nonefor _ in range(100):  # CEM迭代次數action_seqs = np.random.uniform(-2, 2, size=(128, self.n_plan))rewards = np.zeros(128)for t in range(self.n_plan):actions = torch.tensor(action_seqs[:, t], dtype=torch.float32)next_states = self.model(state, actions)rewards += self.env.get_reward(state.numpy(), actions.numpy())state = next_stateselite_idxs = rewards.argsort()[-10:]  # 選取前10個最優軌跡  elite_action_seqs = action_seqs[elite_idxs]if rewards.max() > best_reward:best_reward = rewards.max()best_action_seq = action_seqs[rewards.argmax()]action_seqs = elite_action_seqs.mean(axis=0) + 0.5 * elite_action_seqs.std(axis=0) * np.random.randn(*elite_action_seqs.shape)return best_action_seq[0]  # 返回第一個動作

規劃器從均勻分布中采樣128條動作序列,長度為n_plan。然后用模型模擬各條序列對應的狀態軌跡,并估算累積獎勵。接著選出獎勵最高的10條軌跡,用它們的均值和方差來更新采樣分布。迭代若干次后,返回獎勵最高的動作序列的第一個動作。

最后,我們定義主循環,交替地采集數據、訓練模型和規劃動作:

    def run(self):for i in range(self.n_iter):states, actions, _, next_states = self.collect_data(1000)self.train_model(states, actions, next_states)state = self.env.reset()for t in range(200): action = self.plan(torch.tensor(state, dtype=torch.float32))next_state, _, done, _ = self.env.step(action)state = next_stateif done:breakprint(f"Iteration {i}: lasted {t} steps")

主循環共執行n_iter次,每次采集1000條數據,并用新數據訓練模型。然后用規劃器與環境交互200步,記錄并打印生存時長。

下面我們創建環境、模型和MBRL對象,啟動訓練:

env = gym.make("InvertedPendulum-v2")
model = Model(state_dim=env.observation_space.shape[0], action_dim=env.action_space.shape[0])
mbrl = MBRL(env, model, n_plan=20, n_iter=10)mbrl.run() 

運行這段代碼,你將看到倒立擺在幾次迭代后就能很快達到平衡位置并長時間維持。這充分展示了MBRL的高效性和可行性。當然,這只是一個簡單示例,實際應用還需考慮更多技術細節,如模型集成、數據緩沖、策略約束等。感興趣的讀者可以進一步閱讀MBRL的前沿文獻。

5. 展望

MBRL利用環境模型來提高樣本利用率和策略質量,是一種頗具前景的強化學習范式。近年來,隨著深度學習的發展,MBRL在高維觀察空間和連續動作空間上取得了長足的進步。一些代表性工作包括:

  • ME-TRPO[Kurutach et al., 2018]:集成模型+TRPO策略優化
  • SLBO[Luo et al., 2018]:基于模型的數據增強
  • PETS[Chua et al., 2018]:集成模型+CEM規劃
  • POPLIN[Wang and Ba, 2019]:集成模型輔助TRPO策略優化
  • POLO[Lowrey et al., 2019]:策略優化結合離線數據
  • DMPO[Luo et al., 2019]:決策時集成規劃

這些工作極大地拓展了MBRL的應用范圍和實用價值。但MBRL還存在不少挑戰:

  • 如何學習更準確、更魯棒的環境模型?
  • 如何設計更高效、更可靠的規劃和探索機制?
  • 如何在模型訓練和策略優化之間權衡計算資源?
  • 如何處理復雜環境中的長期因果關系和延遲獎勵?
  • 如何提高模型和策略的泛化性和適應性?

這需要RL、DL、規劃、控制等領域的協同創新。展望未來,MBRL有望與以下方向深度融合:

  • 元學習:提高模型和策略的快速適應能力
  • 遷移學習:實現跨任務、跨域的知識復用
  • 因果推斷:建模環境中的因果結構,實現更可解釋、更穩定的策略學習
  • 多智能體學習:解決多個智能體互動時的博弈和協作問題

MBRL代表了AI研究的一個重要趨勢,即用知識引導數據驅動的學習。通過模型這種先驗知識,我們可以更高效、更可靠、更可解釋地學習決策。這不僅能造福強化學習本身,也為構建大模型、訓練通用 AI 系統帶來了新的思路。

Q&A

我用一個簡單的例子來解釋無模型(model-free)和有模型(model-based)強化學習的區別。

假設你要訓練一個機器人學習走路,目標是走得盡可能快。環境的狀態是機器人的關節角度和角速度,動作是施加在關節上的力矩。

無模型RL:

  1. 機器人嘗試隨機動作,觀察狀態變化和獲得的獎勵(與走得快慢相關)。
  2. 根據這些數據,直接學習一個策略函數,告訴機器人在每個狀態下應該采取什么動作。
  3. 不斷重復 1-2,使策略逐漸優化,最終學會快速行走。
# Model-free RL偽代碼
for episode in range(n_episodes):state = env.reset() for step in range(max_steps):action = policy(state)  # 策略根據狀態直接產生動作next_state, reward = env.step(action)update_policy(state, action, reward, next_state)  # 更新策略state = next_state

這種方法的特點是:

  • 直接學習策略函數,沒有對環境建模
  • 需要大量的試錯和樣本數據
  • 更新方向完全依賴當前策略采集的數據

有模型RL:

  1. 機器人嘗試隨機動作,觀察狀態變化,學習一個環境模型(輸入當前狀態+動作,預測下一狀態)。
  2. 用學到的模型進行虛擬試錯:在頭腦中預演不同動作序列的結果,選出一個最優的方案。
  3. 令機器人執行這個方案并更新環境模型,不斷重復 2-3,使策略和模型共同優化。
# Model-based RL偽代碼
model = initialize_model()
for episode in range(n_episodes):state = env.reset()for step in range(max_steps): action_plan = plan_with_model(model, state)  # 用模型預演,選取最優動作序列for planned_step in range(plan_horizon):action = action_plan[planned_step] next_state, reward = env.step(action)model.update(state, action, next_state)  # 更新環境模型state = next_state

這種方法的特點是:

  • 顯式地學習環境模型,揭示了狀態轉移規律
  • 通過模型預演來選取動作,減少真實環境中的試錯
  • 可利用模型產生額外的虛擬數據,加速策略學習

無模型RL就像在一個陌生的城市摸索前行,只能根據已走過的路來決定下一步走哪。而有模型RL則像拿到了一張地圖,可以提前規劃路線,少走彎路。

什么時候用model-based更好?

  • 當環境狀態轉移規律較簡單、容易建模時
  • 當真實環境交互代價較高時(如機器人、自動駕駛)
  • 當任務涉及多步規劃、長期因果推理時

之前的無模型方法還有用嗎?

  • 當環境狀態轉移復雜、難以準確建模時
  • 當大量采集真實數據的成本可以接受時
  • 對于反應性的決策任務,無需多步規劃時

model-free和model-based是兩種不同的思路,各有優劣,應根據具體任務來選擇。近年來,也有許多工作嘗試將兩者結合,取長補短。比如用無模型RL預訓練,再用模型fine-tune;或者在model-based RL框架下引入無模型數據增強等。

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

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

相關文章

參數的本質:詳解 JavaScript 函數的參數

文章導讀:AI 輔助學習前端,包含入門、進階、高級部分前端系列內容,當前是 JavaScript 的部分,瑤琴會持續更新,適合零基礎的朋友,已有前端工作經驗的可以不看,也可以當作基礎知識回顧。 上篇文章…

地理信息系統(GIS)軟件開發

地理信息系統(GIS)軟件開發是一項復雜且系統性很強的工程,涉及空間數據的采集、管理、分析和展示。以下是一個典型的GIS軟件開發流程,包括各個步驟的詳細說明。北京木奇移動技術有限公司,專業的軟件外包開發公司&#…

面向對象------多態

1.多態的定義 通俗來說,當同一種行為或者事情發生在不同的對象上,這些行為或者事情最終得到的結果不同。 注意:多態要發生在繼承的基礎上。 例如:彩色打印機和黑白打印機。 彩色打印機和黑白打印機是不同的對象,但…

詳細分析Element中的MessageBox基本知識(附Demo)

目錄 前言1. 基本知識2. Demo2.1 確認框2.2 警告框2.3 對話框 3. this.$confirm 前言 詳細知識推薦閱讀:詳細分析Element Plus中的ElMessageBox彈窗用法(附Demo及模版) MessageBox則常用于Vue2 1. 基本知識 MessageBox 是 Element UI 提供…

Liunx學習隨筆

Linux學習隨筆 一.前期準備1.安裝Vmware Workstation軟件2.下載linux鏡像3.安裝操作系統 夕陽無限好,只是近黃昏,時隔一年,重新提筆 沒有比腳更遠的路,沒有比人更高的山 一.前期準備 1.安裝Vmware Workstation軟件 下載地址&am…

加載頁面 跳轉 新頁面 vue

通常,我們點頁面上的詳情,或者編輯,需要加載一個新的頁面出來。 vue中加載頁面的方法: 在父頁面中(通常是某個模塊目錄下的index.vue),先寫這行代碼: import AddEditForm from ./…

南京觀海微電子----升壓和降壓模塊電路解析

(一)升壓模塊 1. 如果是交流電壓升壓,那非常簡單,只要選擇變比合適的變壓器就行(1:3和1:4.17); 2. 如果是直流電壓升壓,從12v升到36v也很容易,可選擇用的開關穩壓器很多,例如 :Cs5171.Cs5172.Cs5173.Cs5174.Mc33063.…

SQLAlchemy備忘

orm備忘 upsert,存在及更新,不存在則插入 from sqlalchemy.dialects.mysql import insertinsert_stmt insert(FileModule).values(file_pathpar_dict.file, module_keypar_dict.module_key,module_namepar_dict.module_name, project_idpar_dict.proj…

【調和級數】100321. 優質數對的總數 II

本文涉及知識點 調和級數 質數、最大公約數、菲蜀定理 LeetCode100321. 優質數對的總數 II 給你兩個整數數組 nums1 和 nums2,長度分別為 n 和 m。同時給你一個正整數 k。 如果 nums1[i] 可以被 nums2[j] * k 整除,則稱數對 (i, j) 為 優質數對&#…

[Android]在后臺線程執行耗時操作,然后在主線程更新UI

1.Coroutines(官方推薦) Coroutines 提供了一種輕量級的線程管理方式,使得在后臺線程執行任務和在主線程更新 UI 變得簡單。以下是如何在 Kotlin 中使用 Coroutines 來處理耗時邏輯并更新 UI 的步驟: 添加 Coroutines 依賴: 首…

數據結構·一篇搞定隊列!

hello,大家好啊,肖恩又拖更了,你們聽我狡辯,前段時間有期中考試,so我就沒什么時間寫這個,在這給大家道個歉😭😭😭 我后面一定盡力不拖更 那么接下來,我們來看…

Greenplum使用hbase外部表

概述 GP可以通過pxf協議上的hbase外表功能, 在數據庫中創建外部表,映射hbase table,以直接在gp中訪問 hbase數據,方便將hbase的查詢結果集保留在gp中 hbase端準備 HBase基礎概念: ?HBase 列包含兩個組件&#xff1…

粒子輻照環境中相機鏡頭防護及LabVIEW圖像處理注意事項

在粒子輻照環境測試電路板性能的實驗中,需要對相機鏡頭進行有效防護,同時利用LabVIEW進行圖像識別和處理。本文將討論相機鏡頭防護的關鍵因素和LabVIEW處理過程中的注意事項,包括防輻射材料選擇、輻射屏蔽措施、散熱管理、空間布局及LabVIEW軟…

c++11:左值引用和右值引用《全家桶》

總結一下C11中涉及到左值引用和右值引用的場景。 1 左值引用和右值引用的區別 左值引用 定義:對左值的引用。目的是避免內存拷貝,類似c中的指針,兩個場景:函數傳參、函數返回值。 右值引用 定義:對右值的引用。兩個場景&#…

【機器學習-k近鄰算法-01】 | Scikit-Learn工具包進階指南:機器學習sklearn.neighbors模塊之k近鄰算法實戰

🎩 歡迎來到技術探索的奇幻世界👨?💻 📜 個人主頁:一倫明悅-CSDN博客 ?🏻 作者簡介: C軟件開發、Python機器學習愛好者 🗣? 互動與支持:💬評論 &…

騎行 - 新區永旺出發的環太湖路線

環過好幾次太湖,但對路線都沒太在意,都是跟著別人走的。這次自己制定一個路書,方便下次自己一個人環太湖時使用。 開始是使用高德地圖做路書,只能在PC上做。我用的是網頁版,每次選點太麻煩了。要輸入地址搜索&#xff…

開源博客項目Blog .NET Core源碼學習(27:App.Hosting項目結構分析-15)

本文學習并分析App.Hosting項目中后臺管理頁面的角色管理頁面。 ??角色管理頁面用于顯示、檢索、新建、編輯、刪除角色數據同時支持按角色分配菜單權限,以便按角色控制后臺管理頁面的菜單訪問權限。角色管理頁面附帶一新建及編輯頁面,以支撐新建和編輯…

電纜廠可視化:提升生產透明度與運營效率

圖撲電纜廠可視化系統通過實時監控和數據分析,提高生產過程的透明度和可控性,優化資源配置和質量管理,顯著提升運營效率和產品質量。

啟動SpringBoot項目及解決端口占用問題(指令版)

打包SpringBoot 項目 需要將 SpringBoot 項目進行打包。可以使用 Maven 的快捷工具,或者在項目的 pom.xml 文件所在目錄執行以下命令: mvn clean package部署注意 Windows系統下,按照以下方式在cmd窗口以管理員身份允許使用命令啟動spring…

Flutter 中的 StatefulBuilder 小部件:全面指南

Flutter 中的 StatefulBuilder 小部件:全面指南 在Flutter中,StatefulBuilder是一個高效的小部件,它根據給定的構建函數來構建widget,并在組件樹中只對需要重新構建的部分進行更新。這使得它在性能優化方面非常有用,特…