簡單的強化學習舉例

1,定義獎勵函數

首先,需要根據具體的任務需求來定義獎勵函數。例如,對于機器人導航任務,可以根據機器人與目標點的距離來定義獎勵函數:

import numpy as npdef navigation_reward(robot_position, target_position):# 計算機器人當前位置與目標位置之間的歐幾里得距離distance = np.linalg.norm(np.array(robot_position) - np.array(target_position))# 距離越近,獎勵越高reward = -distancereturn reward

2. 集成獎勵函數到環境中

在強化學習中,環境負責與智能體進行交互,并根據智能體的動作給出相應的獎勵。通常,環境類會有一個?step?方法,該方法接受智能體的動作作為輸入,并返回下一個狀態、獎勵、是否終止等信息

import numpy as npclass NavigationEnv: # 定義導航環境類def __init__(self):# 初始化機器人的起始位置和目標位置self.robot_position = np.array([0, 0]) # 機器人初始位置 (x=0, y=0)self.target_position = np.array([10, 10]) # 目標位置 (x=10, y=10)def step(self, action):# 核心邏輯:執行動作 → 更新狀態 → 計算獎勵 → 判斷終止# 根據動作更新機器人的位置self.robot_position += action # 通過向量加法更新位置# 通過向量加法更新機器人位置。例如,若動作是 [2, 3],新位置為 (0+2, 0+3) = (2, 3)# 計算獎勵reward = navigation_reward(self.robot_position, self.target_position)# 判斷是否到達目標位置done = np.linalg.norm(self.robot_position - self.target_position) < 0.1# 返回下一個狀態、獎勵、是否終止等信息,返回四元組return self.robot_position, reward, done, {}

3. 在訓練循環中使用獎勵函數

在訓練智能體時,需要在每個時間步調用環境的?step?方法,并根據返回的獎勵來更新智能體的策略。以下是一個簡單的訓練循環示例:

代碼分為三大部分:

  1. 環境 (NavigationEnv)

    • 狀態:機器人的二維坐標
    • 動作:離散動作空間 (0 = 向右移動,1 = 向上移動)
    • 獎勵:負距離 (-distance),鼓勵機器人靠近目標
  2. 策略網絡 (PolicyNetwork)

    • 輸入:機器人當前位置 (二維向量)
    • 輸出:兩個動作的概率分布
    • 結構:兩層全連接網絡,使用 ReLU 激活和 softmax 輸出
  3. 訓練循環

    • 收集數據:每個 episode 收集狀態、動作、獎勵序列
    • 計算回報:使用折扣因子計算每個時間步的累積回報
    • 更新策略:通過最大化累積回報的對數概率來更新網絡參數
# 修正后的完整代碼
import numpy as np
import torch
import torch.optim as optimclass NavigationEnv:def __init__(self):self.reset() ## 初始化時直接調用reset方法def reset(self):self.robot_position = np.array([0.0, 0.0])self.target_position = np.array([10.0, 10.0])return self.robot_positiondef step(self, action):self.robot_position += action # # 執行動作(向量加法)distance = np.linalg.norm(self.robot_position - self.target_position)reward = -distance  # 簡單獎勵函數,獎勵設計:距離越近獎勵越高(負值越小)done = distance < 0.1 # 終止條件:距離目標小于0.1單位return self.robot_position, reward, done, {}class PolicyNetwork(torch.nn.Module):def __init__(self, input_size, output_size):super().__init__()self.fc1 = torch.nn.Linear(input_size, 128) # 輸入層→隱藏層(128神經元)self.fc2 = torch.nn.Linear(128, output_size) # 隱藏層→輸出層(動作維度)def forward(self, x):x = torch.relu(self.fc1(x)) # ReLU激活函數引入非線性 return torch.softmax(self.fc2(x), dim=-1) # 輸出動作概率分布env = NavigationEnv()
policy_net = PolicyNetwork(2, 2) # 輸入狀態維度2,輸出動作數2
optimizer = optim.Adam(policy_net.parameters(), lr=0.001) # 自適應學習率優化器
action_map = {0: np.array([1,0]), 1: np.array([0,1])} # 動作映射表 0向右移動1個單位,1向上移動1個單位
gamma = 0.99 #未來獎勵折扣因子
for episode in range(1000): #訓練1000輪state = env.reset()  # 重置環境done = Falserewards, states, actions = [], [], [] # 數據收集容器while not done:state_tensor = torch.FloatTensor(state) # 轉為PyTorch張量probs = policy_net(state_tensor)        # 獲取動作概率action_idx = torch.multinomial(probs, 1).item() # 按概率抽樣動作action = action_map[action_idx]         # 轉換為實際動作向量next_state, reward, done, _ = env.step(action)  # 環境反饋# 存儲軌跡數據rewards.append(reward)                  states.append(state_tensor)actions.append(action_idx)state = next_state  # 狀態更新# 計算累積回報returns = []cumulative = 0for r in reversed(rewards):             # 從最后一步反向計算cumulative = r + gamma * cumulative # 計算累積回報returns.insert(0, cumulative)       # 保持時序# 策略梯度更新optimizer.zero_grad()                   # 清空梯度for s, a, R in zip(states, actions, returns):prob = policy_net(s)                # 重新計算動作概率(需梯度)log_prob = torch.log(prob[a])       # 選擇動作的對數概率loss = -log_prob * R                # 策略梯度損失loss.backward()                     # 反向傳播累積梯度optimizer.step()print(f"Episode {episode}, Total Reward: {sum(rewards):.1f}")
  1. Episode 0

    • 初始位置 (0,0)

    • 隨機選擇動作:可能頻繁撞墻(若未加邊界約束)

    • 獎勵約 -200(低效路徑)

  2. Episode 500

    • 網絡學會向目標方向移動

    • 路徑呈現鋸齒形(探索仍在進行)

    • 獎勵提升至 -50

  3. Episode 1000

    • 穩定選擇向右和向上動作

    • 直線接近目標,獎勵接近 0

    • 成功收斂

優化方向建議

  1. 狀態歸一化:將坐標范圍縮放到 [-1,1] 加速訓練

  2. 經驗回放:使用?deque?存儲歷史數據,隨機采樣更新

  3. 熵正則化:在損失函數中添加熵項鼓勵探索

  4. Advantage Actor-Critic:引入價值函數估計優勢值

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

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

相關文章

css背景相關

背景書寫 background: url(src); // 注意&#xff1a;在寫動態樣式時&#xff0c;backgournd賦值格式錯誤&#xff0c;是不會在瀏覽器dom的style上顯示的 // 但是可以創建不可見的img&#xff0c;預加載來提高性能背景也會加載圖片資源 同img的src一樣&#xff0c;background也…

opencascade.js stp vite 調試筆記

Hello, World! | Op enCascade.js cnpm install opencascade.js cnpm install vite-plugin-wasm --save-dev 當你不知道文件寫哪的時候trae還是有點用的 ‘’‘ import { defineConfig } from vite; import wasm from vite-plugin-wasm; import rollupWasm from rollup/plug…

線程的一些事(2)

在java中&#xff0c;線程的終止&#xff0c;是一種“軟性”操作&#xff0c;必須要對應的線程配合&#xff0c;才能把終止落實下去 然而&#xff0c;系統原生的api其實還提供了&#xff0c;強制終止線程的操作&#xff0c;無論線程執行到哪&#xff0c;都能強行把這個線程干掉…

BGP實驗練習1

需求&#xff1a; 要求五臺路由器的環回地址均可以相互訪問 需求分析&#xff1a; 1.圖中存在五個路由器 AR1、AR2、AR3、AR4、AR5&#xff0c;分屬不同自治系統&#xff08;AS&#xff09;&#xff0c;AR1 在 AS 100&#xff0c;AR2 - AR4 在 AS 200&#xff0c;AR5 在 AS …

滑動窗口——將x減到0的最小操作數

題目&#xff1a; 這個題如果我們直接去思考方法是很困難的&#xff0c;因為我們不知道下一步是在數組的左還是右操作才能使其最小。正難則反&#xff0c;思考一下&#xff0c;無論是怎么樣的&#xff0c;最終這個數組都會分成三個部分左中右&#xff0c;而左右的組合就是我們…

C++ RAII機制

RAII&#xff08;Resource Acquisition Is Initialization&#xff09;是一種編程范式&#xff0c;核心思想是&#xff1a;資源的生命周期與對象綁定——對象創建時獲取資源&#xff0c;對象銷毀時自動釋放資源。這種機制通過構造函數和析構函數的配對執行&#xff0c;確保資源…

連續抵消解碼器--Successive Cancellation decoder(SC 解碼器)

在這里&#xff0c;我們來看一下&#xff08;Arikan&#xff0c;2009&#xff09;中提供的連續取消解碼算法。 顧名思義&#xff0c;SC解碼算法從u0開始按順序解碼比特。 凍結的比特節點總是被解碼為0。 在解碼ui時&#xff0c;根據以下規則使用由向量表示的可用比特來解碼u…

suricata之規則去重

一、環境和背景 1.1 環境 OS: Ubuntu 22.04.5 LTS IDE: vscode suricata: suricata 7.0.5 1.2 背景 在添加規則時&#xff0c;為了給規則分類&#xff0c;將不同類別的規則寫入不同的文件。 在規則加載時兩條不同的規則卻被認為是重復的&#xff0c;因此記錄一下去重邏輯。…

vue vite 無法熱更新問題

一、在vue頁面引入組件CustomEmployeesDialog&#xff0c;修改組件CustomEmployeesDialog無法熱更新 引入方式&#xff1a; import CustomEmployeesDialog from ../dialog/customEmployeesDialog.vue 目錄結構&#xff1a; 最后發現是引入import時&#xff0c;路徑大小寫與目…

深入理解 Linux 權限控制機制

引言 在 Linux 系統中&#xff0c;權限控制是保障系統安全的核心機制。通過限制用戶對文件和資源的訪問&#xff0c;它能有效防止未授權操作&#xff0c;保護數據不被篡改或泄露。合理設置權限不僅有助于實現用戶隔離和最小權限原則&#xff0c;還能降低系統被濫用或攻擊的風險…

Oracle版本、補丁及升級(12)——版本體系

12.1. 版本體系 Oracle作為最流行的一款關系數據庫軟件產品,其擁有自己一套成熟的版本管理體系。具體版本體系以12c為分界線,前后版本體系分別不同。 ???????12.1.1. 12c之前版本 12c之前的Oracle,版本共有5位阿拉伯數字組成,其中的每位數字,都有各自的含義,具…

Maven 中的 pom.xml 文件

目錄標題 1、根標簽 <project> 的直接子標簽順序?2、常見子標簽內部順序?2.1、<build> 標簽內部順序2.2、<dependencies> 標簽內部順序 3、modelVersion 為什么是 4.0.0 &#xff1f;4、<parent> 標簽&#xff1f;??4.1、為什么需要 <parent>…

方案精讀:華為與中軟-智慧園區解決方案技術主打膠片【附全文閱讀】

該文檔是華為與中軟國際的智慧園區輕量化解決方案推介&#xff0c;主要面向園區管理者、運營者及相關企業決策人。其核心圍繞園區痛點&#xff0c;闡述智慧園區的發展趨勢。 方案涵蓋綜合安防、便捷通行、設備管理等多領域應用場景&#xff0c;通過智能視頻監控、人臉識別、遠程…

# KVstorageBaseRaft-cpp 項目 RPC 模塊源碼學習

KVstorageBaseRaft-cpp 項目 RPC 模塊源碼學習 。 一、項目簡介 KVstorageBaseRaft-cpp 是一個基于 Raft 一致性算法實現的分布式 KV 存儲系統&#xff0c;采用 C 開發。項目的核心目標是幫助開發者理解 Raft 原理和分布式 KV 存儲的基本實現。RPC 模塊是分布式系統通信的關…

TeledyneLeCroy在OFC2025 EA展臺上展示了其400G/800G的全包圍的測試解決方案,滿足了UEC聯盟和UALINK聯盟的技術需求

Teledyne LeCroy在OFC 2025上的EA展臺 在2025年3月26日至28日于美國圣地亞哥舉辦的OFC&#xff08;Optical Fiber Communication Conference and Exhibition&#xff09;展會上&#xff0c;全球領先的測試測量解決方案提供商Teledyne LeCroy隆重展示了其最新研發的800G網絡測試…

新一代電動門“攻克”行業痛點,遠峰科技打造“智能出入”新標桿

在2025上海國際車展期間&#xff0c;遠峰科技舉辦了一場面向車企合作伙伴和媒體的智能汽車解決方案實車展示會。 在這其中&#xff0c;遠峰科技的新一代電動門首次亮相&#xff0c;突破性的解決了行業普遍存在的“運行抖動不平順”、“窄車位車門開度過小”、“障礙物識別不準…

WEB UI自動化測試之Pytest框架學習

文章目錄 前言Pytest簡介Pytest安裝Pytest的常用插件Pytest的命名約束Pytest的運行方式Pytest運行方式與unittest對比主函數運行命令行運行執行結果代碼說明 pytest.ini配置文件方式運行&#xff08;推薦&#xff09;使用markers標記測試用例 pytest中添加Fixture&#xff08;測…

機器學習簡單概述

Chatgpt回答&#xff1a; 機器學習&#xff1a;機器學習是人工智能的一個分支&#xff0c;側重于通過數據訓練模型&#xff0c;使計算機能夠根據數據進行預測、分類、回歸等任務。它通過算法從歷史數據中學習規律&#xff0c;然后在新數據上進行推斷。機器學習包括多種算法&…

openjdk底層匯編指令調用(一)——匯編指令及指令編碼基礎

匯編指令 計算機在執行過程時只識別代表0或者1的電信號。因此為了讓計算機能夠執行則須向計算機輸入一系列01構成的指令。 例如在x64平臺下&#xff0c;0x53&#xff0c;二進制為01010011&#xff0c;表示將rbx寄存器中的值壓棧。 但是&#xff0c;對于程序員而言&#xff0c;…

Python Day 22 學習

學習講義Day14安排的內容&#xff1a;SHAP圖的繪制 SHAP模型的基本概念 參考學習的帖子&#xff1a;SHAP 可視化解釋機器學習模型簡介_shap圖-CSDN博客 以下為學習該篇帖子的理解記錄&#xff1a; Q. 什么是SHAP模型&#xff1f;它與機器學習模型的區別在哪兒&#xff1f; …