《Python實戰進階》No37: 強化學習入門:Q-Learning 與 DQN-加餐版1 Q-Learning算法可視化

在《Python實戰進階》No37: 強化學習入門:Q-Learning 與 DQN 這篇文章中,我們介紹了Q-Learning算法走出迷宮的代碼實踐,本文加餐,把Q-Learning算法通過代碼可視化呈現。我嘗試了使用Matplotlib實現,但局限于Matplotlib對動畫不支持,做出來的仿動畫太僵硬,所以使用 pygame 重新設計 Q-Learning 的可視化程序可以顯著提升動畫的流暢性和交互性。相比于 matplotlibpygame 更適合處理實時動畫和游戲化的內容。以下是一個完整的基于 pygame 的實現方案,

視頻:Q-Learning算法訓練可視化


目標

  1. 迷宮布局:動態繪制迷宮(包括起點、終點和墻壁)。
  2. 智能體移動:實時更新智能體的位置。
  3. 最優路徑:訓練完成后顯示從起點到終點的最優路徑。
  4. 最終目標:完整呈現Q-Learning算法的訓練過程。

實現步驟

步驟 1:安裝依賴

確保安裝了 pygame 庫:

pip install pygame

步驟 2:修改迷宮環境

我們對迷宮環境進行一些擴展,以便更好地支持 pygame 可視化。

import numpy as npclass MazeEnv:def __init__(self):self.maze = [['.', '.', '.', '#', '.'],['.', '#', '.', '.', '.'],['.', '#', '.', '#', '.'],['.', '.', '.', '#', '.'],['.', '#', 'G', '#', '.']]self.maze = np.array(self.maze)self.start = (0, 0)self.goal = (4, 2)self.current_state = self.startself.actions = [(0, 1), (0, -1), (1, 0), (-1, 0)]  # 右、左、下、上def reset(self):self.current_state = self.startreturn self.current_statedef step(self, action):next_state = (self.current_state[0] + action[0], self.current_state[1] + action[1])if (next_state[0] < 0 or next_state[0] >= self.maze.shape[0] ornext_state[1] < 0 or next_state[1] >= self.maze.shape[1] orself.maze[next_state] == '#'):next_state = self.current_state  # 如果撞墻,保持原位置reward = -1  # 每步移動的默認獎勵done = Falseif next_state == self.goal:reward = 10  # 到達終點的獎勵done = Trueself.current_state = next_statereturn next_state, reward, donedef get_maze_size(self):return self.maze.shapedef is_wall(self, position):return self.maze[position] == '#'def is_goal(self, position):return position == self.goal

步驟 3:設計 pygame 可視化程序

以下是基于 pygame 的完整可視化代碼:

import pygame
import time
import random
import numpy as np# 初始化 pygame
pygame.init()# 定義顏色
WHITE = (255, 255, 255)  # 空地
BLACK = (0, 0, 0)        # 墻壁
GREEN = (0, 255, 0)      # 終點
RED = (255, 0, 0)        # 智能體
BLUE = (0, 0, 255)       # 最優路徑# 定義單元格大小
CELL_SIZE = 50
FPS = 10  # 動畫幀率def visualize_with_pygame(env, agent, num_episodes=1000):rows, cols = env.get_maze_size()screen_width = cols * CELL_SIZEscreen_height = rows * CELL_SIZE# 初始化屏幕screen = pygame.display.set_mode((screen_width, screen_height))pygame.display.set_caption("Q-Learning Maze Visualization")clock = pygame.time.Clock()def draw_maze():for i in range(rows):for j in range(cols):rect = pygame.Rect(j * CELL_SIZE, i * CELL_SIZE, CELL_SIZE, CELL_SIZE)if env.is_wall((i, j)):pygame.draw.rect(screen, BLACK, rect)elif env.is_goal((i, j)):pygame.draw.rect(screen, GREEN, rect)else:pygame.draw.rect(screen, WHITE, rect)def draw_agent(position):x, y = positioncenter = (y * CELL_SIZE + CELL_SIZE // 2, x * CELL_SIZE + CELL_SIZE // 2)pygame.draw.circle(screen, RED, center, CELL_SIZE // 3)def draw_path(path):for (x, y) in path:rect = pygame.Rect(y * CELL_SIZE, x * CELL_SIZE, CELL_SIZE, CELL_SIZE)pygame.draw.rect(screen, BLUE, rect)# 訓練過程可視化for episode in range(num_episodes):state = env.reset()done = Falsepath = [state]while not done:# 處理退出事件for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()return# 清屏并繪制迷宮screen.fill(WHITE)draw_maze()# 獲取動作action = agent.get_action(state)next_state, reward, done = env.step(action)agent.update_q_table(state, action, reward, next_state)state = next_statepath.append(state)# 繪制智能體draw_agent(state)# 更新屏幕pygame.display.flip()clock.tick(FPS)if episode % 100 == 0:print(f"Episode {episode}: Training...")# 測試過程可視化state = env.reset()done = Falsepath = [state]while not done:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()returnscreen.fill(WHITE)draw_maze()action = agent.get_action(state)state, _, done = env.step(action)path.append(state)draw_agent(state)pygame.display.flip()clock.tick(FPS)# 顯示最終路徑screen.fill(WHITE)draw_maze()draw_path(path)pygame.display.flip()# 等待用戶關閉窗口running = Truewhile running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falsepygame.quit()

步驟 4:集成到 Q-Learning 算法

pygame 可視化函數集成到 Q-Learning 的訓練和測試過程中。

class QLearningAgent:def __init__(self, env, learning_rate=0.1, discount_factor=0.9, epsilon=0.1):self.env = envself.q_table = {}self.learning_rate = learning_rateself.discount_factor = discount_factorself.epsilon = epsilondef get_action(self, state):if random.uniform(0, 1) < self.epsilon:return random.choice(self.env.actions)  # 探索else:q_values = [self.get_q_value(state, action) for action in self.env.actions]return self.env.actions[np.argmax(q_values)]  # 貪婪策略def get_q_value(self, state, action):key = (state, action)return self.q_table.get(key, 0.0)def update_q_table(self, state, action, reward, next_state):old_q = self.get_q_value(state, action)max_next_q = max([self.get_q_value(next_state, a) for a in self.env.actions])new_q = old_q + self.learning_rate * (reward + self.discount_factor * max_next_q - old_q)self.q_table[(state, action)] = new_q

步驟 5:運行代碼

創建迷宮環境和智能體,并運行訓練和測試代碼。

# 創建環境和智能體
env = MazeEnv()
agent = QLearningAgent(env)# 使用 pygame 可視化訓練和測試
visualize_with_pygame(env, agent, num_episodes=1000)

效果

  1. 流暢的動畫pygame 提供了高效的繪圖性能,動畫更加流暢。
  2. 實時更新:智能體的位置和路徑會實時更新,清晰展示學習過程。
  3. 交互性:用戶可以通過關閉窗口隨時停止程序。

擴展功能

  1. 優化動畫速度:通過調整 FPSclock.tick() 控制動畫速度。
  2. 添加熱力圖:使用不同顏色表示 Q 值表的變化。
  3. 支持更大迷宮:通過縮放單元格大小(CELL_SIZE)適應更大迷宮。

通過以上方法,你可以實現一個高效且流暢的 Q-Learning 可視化程序!

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

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

相關文章

Linux 搭建dns主域解析,和反向解析

#!/bin/bash # DNS主域名服務 # user li 20250325# 檢查當前用戶是否為root用戶 # 因為配置DNS服務通常需要較高的權限&#xff0c;只有root用戶才能進行一些關鍵操作 if [ "$USER" ! "root" ]; then# 如果不是root用戶&#xff0c;輸出錯誤信息echo "…

GenBI 中如何引入 LLM 做意圖路由,區分查數據還是閑聊

寫在前面 生成式商業智能(Generative BI, GenBI)的魅力在于其能夠理解用戶的自然語言,并將復雜的數據查詢和分析過程自動化。用戶不再需要學習 SQL 或操作復雜的界面,只需像與同事交談一樣提出問題,就能獲得數據洞察。然而,一個現實的挑戰是:用戶的輸入并非總是明確的數…

OmniPlan Pro for Mac 項目管理流程

OmniPlan Pro for Mac 項目管理流程 文章目錄 OmniPlan Pro for Mac 項目管理流程一、介紹二、效果三、下載 一、介紹 OmniPlan Pro mac是一款項目管理流程軟件。能被用來優化資源、精簡預算快速共享或添加任務&#xff0c;旨在能夠幫助您可視化維護和簡化項目&#xff0c;包含…

人工智能之數學基礎:矩陣的相似變換

本文重點 矩陣的相似變換是線性代數中一個至關重要的概念,它揭示了矩陣之間的一種特殊關系,并通過可逆矩陣將一個矩陣轉化為另一個相似矩陣,同時保持矩陣的某些本質特征不變。在機器學習領域,矩陣的相似變換發揮著不可或缺的作用,廣泛應用于數據降維、聚類分析、分類推薦…

2025藍橋杯備賽Day12——P8598 [藍橋杯 2013 省 AB] 錯誤票據

&#x1f50d; 2025藍橋杯備賽Day12——P8598 [藍橋杯 2013 省 AB] 錯誤票據 &#x1f680; 題目速覽 題目難度&#xff1a;??&#xff08;適合掌握基礎字符串處理與數組操作&#xff09; 考察重點&#xff1a;輸入處理、數組排序、邏輯判斷 P8598 [藍橋杯 2013 省 AB] 錯…

3.28日,NBA,歐籃聯全掃盤,太陽VS森林狼

3.28日歐籃聯掃盤 301費內巴切 vs 巴斯克 (-10.5)&#xff0c;總分預設&#xff1a;170.5 背景&#xff1a;比賽于2025年3月28日在費內巴切的烏爾克體育館舉行&#xff0c;費內巴切為主隊。根據EuroLeague排名&#xff0c;費內巴切位列第二&#xff08;21勝10負&#xff09;&am…

【動態編譯】Roslyn中 SyntaxKind 枚舉類型

在 Roslyn&#xff08;.NET 的編譯器平臺&#xff09;中&#xff0c;SyntaxKind 是一個枚舉類型&#xff0c;定義了 C# 語言中所有可能的語法節點類型。它是 Roslyn 抽象語法樹&#xff08;AST&#xff09;的基礎&#xff0c;用于標識每個 SyntaxNode 的具體種類。SyntaxKind 的…

【SpringCloud】Eureka的使用

3. Eureka 3.1 Eureka 介紹 Eureka主要分為兩個部分&#xff1a; EurekaServer: 作為注冊中心Server端&#xff0c;向微服務應用程序提供服務注冊&#xff0c;發現&#xff0c;健康檢查等能力。 EurekaClient: 服務提供者&#xff0c;服務啟動時&#xff0c;會向 EurekaS…

前端知識點---window.location.assign() 和 window.location.href 的區別(javascript)

window.location.assign() 和 window.location.href 的主要區別&#xff1a; 讀取和設置 window.location.href&#xff1a;既可以讀取當前 URL&#xff0c;也可以通過賦值更改 URL。 window.location.assign()&#xff1a;只能用于跳轉到新的 URL&#xff0c;不能讀取當前地…

OpenCV圖像拼接(3)圖像拼接類cv::detail::MultiBandBlender

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::detail::MultiBandBlender 是 OpenCV 中用于圖像拼接&#xff08;stitching&#xff09;模塊的一個類&#xff0c;主要用于將多張重疊的圖像…

王者榮耀服務器突然崩了

就在剛剛王者榮耀服務器突然崩了 #王者榮耀崩了#的話題毫無預兆地沖上熱搜&#xff0c;許多玩家發現游戲登錄界面反復彈出異常提示&#xff0c;匹配成功后卡在加載界面&#xff0c;甚至出現對局數據丟失的情況。根據官方公告&#xff0c;目前技術團隊已在全力搶修服務器 #王者…

【JavaScript】JavaScript Promises實踐指南

【JavaScript】JavaScript Promises實踐指南 你了解JavaScript中的Promises嗎&#xff1f;這是一個很多人一開始就放棄的主題&#xff0c;但我會盡量讓它變得盡可能簡單。 1. “Promise”到底是什么&#xff1f; “Promise”是異步編程中的一個基本概念&#xff0c;特別是在J…

計算機視覺總結

以下是針對上述問題的詳細解答,并結合代碼示例進行說明: 1. 改進YOLOv5人臉檢測模塊,復雜光照場景準確率從98.2%提升至99.5% 優化具體過程: 光照補償:在數據預處理階段,采用自適應光照補償算法,對圖像進行實時增強,以減少光照變化對人臉檢測的影響。數據增強:在訓練…

ExpTimerApcRoutine函數分析之作用是ActiveTimerListHead里面移除定時器_etimer

第一部分&#xff1a; VOID ExpTimerApcRoutine ( IN PKAPC Apc, IN PKNORMAL_ROUTINE *NormalRoutine, IN PVOID *NormalContext, IN PVOID *SystemArgument1, IN PVOID *SystemArgument2 ) /* Routine Description: This function is the special …

算法分析與設計 專題三

目錄 一、實驗目的 二、實驗內容 三、問題分析與求解 四、AC源代碼、截圖 五、實驗小結 一、實驗目的 1、了解貪心算法的分析過程&#xff0c;學會用貪心算法解決一些具體的問題。 2、了解廣度優先算法和深度優先算法。 二、實驗內容 1992 當然&#xff0c;我們的收藏中…

1688商品詳情接口:深度解析與應用實踐

在電商領域&#xff0c;1688作為中國領先的B2B平臺&#xff0c;擁有海量的商品信息。對于開發者、商家和數據分析師來說&#xff0c;獲取1688商品的詳細信息是實現數據分析、競品研究、自動化管理和精準營銷的重要手段。本文將詳細介紹1688商品詳情接口的使用方法、技術細節以及…

每日算法-250328

記錄今天學習和解決的LeetCode算法題。 92. 反轉鏈表 II 題目 思路 本題要求反轉鏈表中從 left 到 right 位置的節點。我們可以采用 頭插法 的思路來反轉指定區間的鏈表。 具體來說&#xff0c;我們首先定位到 left 位置節點的前一個節點 prev。然后&#xff0c;從 left 位置…

C語言中的位域:節省內存的標志位管理技術

位域&#xff08;Bit-field&#xff09; 是 C 語言中的一種特性&#xff0c;允許在結構體&#xff08;struct&#xff09;中定義占用特定位數的成員變量。通過位域&#xff0c;可以更精細地控制內存的使用&#xff0c;尤其是在需要存儲多個布爾值或小范圍整數時&#xff0c;可以…

【AI編程學習之Python】第一天:Python的介紹

Python介紹 簡介 Python是一種解釋型、面向對象的語言。由吉多范羅蘇姆(Guido van Rossum)于1989年發明,1991年正式公布。官網:www.python.org Python單詞是"大蟒蛇”的意思。但是龜叔不是喜歡蟒蛇才起這個名字,而是正在追劇:英國電視喜劇片《蒙提派森的飛行馬戲團》(Mo…

【openstack系列】虛擬化技術

OpenStack 是一個開源的云計算管理平臺,它本身并不直接提供虛擬化技術,而是通過集成不同的虛擬化解決方案來管理和編排計算、存儲和網絡資源。OpenStack 的核心優勢在于其靈活性和可擴展性,支持多種虛擬化技術(Hypervisor),使企業可以根據需求選擇合適的底層虛擬化方案。…