Day4:強化學習之Qlearning走迷宮

一、迷宮游戲

1.環境已知

迷宮環境是定義好的,障礙物位置和空位置是已知的;

# 定義迷宮
grid = [[0, 0, 0, 1, 0],[0, 1, 0, 1, 0],[0, 1, 0, 0, 0],[0, 0, 0, 1, 0],[0, 1, 1, 1, 0]
]

2.獎勵方式已知

如果碰到障礙物則得-1,如果到終點則得10分,正常走一步-0.1分。

 # 檢查是否越界或碰到障礙if 0 <= row < self.rows and 0 <= col < self.cols and self.grid[row][col] == 0:# 滿足在邊界內部,且網格為空(對應數值為0)self.state = (row, col) #可以走到這個位置else:return self.state, -1, False  # 碰到障礙或越界,返回懲罰-1,標記未完成# 檢查是否到達終點if self.state == self.goal:return self.state, 10, True  # 到達終點,返回獎勵10,標記完成else:return self.state, -0.1, False  # 正常移動,返回小懲罰-0.1,標記未完成

3.動作選擇策略

ε-greedy策略選擇動作。

 def choose_action(self, state):# 根據ε-greedy策略選擇動作,以epsilon的概率選擇探索,以1-epsilon的概率選擇利用# 一般隨著時間的推移,epsilon逐漸減小,即減小探索,增大利用概率# 如果隨機抽樣小于epsilon,則選擇探索,即隨機抽取動作if random.uniform(0, 1) < self.epsilon: return random.choice([0, 1, 2, 3])  # 探索# 如果隨機抽樣大于等于epsilon,則選擇利用,即利用現有規則進行動作選擇else:return np.argmax(self.q_table[state])  # 利用,state是當前狀態,為二維坐標

4.Q值更新方法

# Q值更新參數方法 q(st,at)=q(st,at)+alpha*(reward+gamma*max(q)-q(st,at))self.q_table[state][action] += self.alpha * (reward + self.gamma * best_next_q - self.q_table[state][action])state = next_state # 狀態更新 

5.Qlearning計算流程圖

二、代碼實現

import numpy as np
import random# 定義迷宮環境
class Maze:def __init__(self, grid, start, goal):self.grid = grid  # 迷宮網格,0表示空地,1表示障礙self.start = start  # 起點self.goal = goal  # 終點self.rows, self.cols = len(grid), len(grid[0]) # 網格行、列邊界self.state = start  # 當前狀態def reset(self):# 重置迷宮狀態self.state = self.startreturn self.statedef step(self, action):# 根據動作移動智能體row, col = self.stateif action == 0:  # 上row -= 1 # 行減1elif action == 1:  # 下row += 1 # 行加1elif action == 2:  # 左col -= 1 # 列-1elif action == 3:  # 右col += 1 # 列+1# 檢查是否越界或碰到障礙if 0 <= row < self.rows and 0 <= col < self.cols and self.grid[row][col] == 0:# 滿足在邊界內部,且網格為空(對應數值為0)self.state = (row, col) #可以走到這個位置else:return self.state, -1, False  # 碰到障礙或越界,返回懲罰-1,標記未完成# 檢查是否到達終點if self.state == self.goal:return self.state, 10, True  # 到達終點,返回獎勵10,標記完成else:return self.state, -0.1, False  # 正常移動,返回小懲罰-0.1,標記未完成def render(self):# 可視化迷宮for r in range(self.rows): # 遍歷狀態for c in range(self.cols): # 遍歷動作if (r, c) == self.state: # 對于當前位置,用字母A表示print("A", end=" ")  # 智能體位置elif (r, c) == self.goal: #對于目標位置用字母G表示print("G", end=" ")  # 終點elif self.grid[r][c] == 1: # 對于障礙物用#表示print("#", end=" ")  # 障礙else: # 對于空地用0表示print("0", end=" ")  # 空地print()print()# Q-learning算法
class QLearning:def __init__(self, maze, alpha=0.1, gamma=0.99, epsilon=0.1):self.maze = maze # 迷宮環境self.alpha = alpha  # 學習率self.gamma = gamma  # 折扣因子self.epsilon = epsilon  # 探索概率self.q_table = np.zeros((maze.rows, maze.cols, 4))  # Q表,4個動作,三個維度def choose_action(self, state):# 根據ε-greedy策略選擇動作,以epsilon的概率選擇探索,以1-epsilon的概率選擇利用# 一般隨著時間的推移,epsilon逐漸減小,即減小探索,增大利用概率# 如果隨機抽樣小于epsilon,則選擇探索,即隨機抽取動作if random.uniform(0, 1) < self.epsilon: return random.choice([0, 1, 2, 3])  # 探索# 如果隨機抽樣大于等于epsilon,則選擇利用,即利用現有規則進行動作選擇else:return np.argmax(self.q_table[state])  # 利用,state是當前狀態,為二維坐標def train(self, episodes):# 訓練for episode in range(episodes):state = self.maze.reset() # 重置狀態done = False # 訓練完成標志total_reward = 0 # 總獎勵while not done:action = self.choose_action(state) # 選擇動作,根據1-epsilon策略next_state, reward, done = self.maze.step(action) #根據動作移動智能體total_reward += reward# Q-learning更新規則best_next_q = np.max(self.q_table[next_state]) # Qtable里面下一狀態對應Q的最大值# Q值更新參數方法 q(st,at)=q(st,at)+alpha*(reward+gamma*max(q)-q(st,at))self.q_table[state][action] += self.alpha * (reward + self.gamma * best_next_q - self.q_table[state][action])state = next_state # 狀態更新 # 每當完成100回合,則輸出一次總獎勵數據if (episode + 1) % 100 == 0:print(f"Episode {episode + 1}: Total Reward = {total_reward}")def test(self):# 測試訓練后的策略state = self.maze.reset()done = Falsesteps = []while not done:action = np.argmax(self.q_table[state]) #選擇Q表中最大的動作next_state, _, done = self.maze.step(action) steps.append(action)state = next_stateself.maze.render() # 可視化迷宮print("Steps taken:", steps) #輸出動作集合,每一步動作都被儲存倒steps【】列表中# 定義迷宮
grid = [[0, 0, 0, 1, 0],[0, 1, 0, 1, 0],[0, 1, 0, 0, 0],[0, 0, 0, 1, 0],[0, 1, 1, 1, 0]
]
start = (0, 0) # 起點
goal = (4, 4) # 終點# 創建迷宮和Q-learning對象
maze = Maze(grid, start, goal)
ql = QLearning(maze)# 訓練和測試
ql.train(episodes=1000) #訓練1000輪
ql.test() #測試

三、結果展示

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

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

相關文章

家里WiFi信號穿墻后信號太差怎么處理?

一、首先在調制解調器&#xff08;俗稱&#xff1a;貓&#xff09;測試網速&#xff0c;網速達不到聯系運營商&#xff1b; 二、網線影響不大&#xff0c;5類網線跑500M完全沒問題&#xff1b; 三、可以在臥室增加輔助路由器&#xff08;例如小米AX系列&#xff09;90~200元區…

視點開場動畫實現(九)

這個相對比較簡單&#xff1a; void COSGObject::FlyTo(double lon, double lat, double hei) {theApp.bNeedModify TRUE;while(!theApp.bCanModify)Sleep(1);em->setViewpoint(osgEarth::Viewpoint("0",lon, lat, 0, 0, -45, hei), 2);theApp.bNeedModify FAL…

保姆級GitHub大文件(100mb-2gb)上傳教程

GLF&#xff08;Git Large File Storage&#xff09;安裝使用 使用GitHub desktop上傳大于100mb的文件時報錯 The following files are over 100MB. lf you commit these files, you will no longer beable to push this repository to GitHub.com.term.rarWe recommend you a…

HTML之JavaScript DOM(document)編程處理事件

HTML之JavaScript DOM&#xff08;document&#xff09;編程處理事件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

Redis7——基礎篇(四)

前言&#xff1a;此篇文章系本人學習過程中記錄下來的筆記&#xff0c;里面難免會有不少欠缺的地方&#xff0c;誠心期待大家多多給予指教。 基礎篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09; 接上期內容&…

Sprinig源碼解析

前言 Spring 框架是 Java 企業級開發的基石&#xff0c;其源碼設計體現了模塊化、擴展性和靈活性。以下從 IoC 容器、AOP 實現、核心模塊和關鍵設計模式四個角度對 Spring 源碼進行深度解析&#xff0c;幫助理解其底層機制。即使Spring會使用的人見得就能使用。 一、IoC 容器源…

如何簡單的去使用jconsloe 查看線程 (多線程編程篇1)

目錄 前言 1.進程和線程 進程 PCB 的作用 并發編程和并行編程 線程 為什么選擇多線程編程 2.在IDEA中如何簡單創建一個線程 1. 通過繼承Thread類 2. 通過實現 Runnable 接口 3. 使用 Lambda 表達式 3.如何簡單使用jconsloe去查看創建好的線程 前言 2025來了,這是第…

【ISO 14229-1:2023 UDS診斷(ECU復位0x11服務)測試用例CAPL代碼全解析④】

ISO 14229-1:2023 UDS診斷【ECU復位0x11服務】_TestCase04 作者&#xff1a;車端域控測試工程師 更新日期&#xff1a;2025年02月17日 關鍵詞&#xff1a;UDS診斷協議、ECU復位服務、0x11服務、ISO 14229-1:2023 TC11-004測試用例 用例ID測試場景驗證要點參考條款預期結果TC…

3.10 實戰Hugging Face Transformers:從文本分類到模型部署全流程

實戰Hugging Face Transformers:從文本分類到模型部署全流程 一、文本分類實戰:IMDB電影評論情感分析 1.1 數據準備與預處理 from datasets import load_dataset from transformers import AutoTokenizer # 加載IMDB數據集 dataset = load_dataset("imdb") …

【人工智能】釋放數據潛能:使用Featuretools進行自動化特征工程

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 特征工程是機器學習流程中至關重要的一步,它直接影響模型的性能。然而,手動特征工程既耗時又需要領域專業知識。Featuretools是一個強大的…

MybaitsPlus學習筆記(二)基本CURD

目錄 一、BaseMapper 二、常用實例 1、插入 2、刪除 3、修改 4、查詢 三、IService 四、 IService中的一些方法測試 一、BaseMapper MyBatis-Plus中的基本CRUD在內置的BaseMapper中都已得到了實現&#xff0c;我們可以直接使用&#xff0c;接口如 下&#xff1a; publ…

設計模式之適配模式是什么?以及在Spring AOP中的攔截器鏈的使用源碼解析。

前言 本文涉及到適配模式的基本用法&#xff0c;以及在Spring AOP中如何使用&#xff0c;首先需要了解適配模式的工作原理&#xff0c;然后結合Spring AOP的具體實現來詳細詳細解析源碼。 首先&#xff0c;適配模式&#xff0c;也就是Adapter Pattern&#xff0c;屬于結構型設計…

【C++】36.C++IO流

文章目錄 1. C語言的輸入與輸出2. 流是什么3. CIO流3.1 C標準IO流3.2 C文件IO流 4. stringstream的簡單介紹 1. C語言的輸入與輸出 C語言中我們用到的最頻繁的輸入輸出方式就是scanf ()與printf()。 scanf(): 從標準輸入設備(鍵盤)讀取數據&#xff0c;并將值存放在變量中。pri…

JavaScript表單介紹

一、表單的基本概念 在網頁開發里&#xff0c;表單是實現用戶與網頁交互的關鍵組件&#xff0c;用于收集用戶輸入的數據&#xff0c;JavaScript 則能為表單增添強大的交互性和功能性。表單在 HTML 里通過 <form> 標簽創建&#xff0c;包含多種表單元素&#xff0c;如文本…

哈希表(C語言版)

文章目錄 哈希表原理實現(無自動擴容功能)代碼運行結果 分析應用 哈希表 如何統計一段文本中&#xff0c;小寫字母出現的次數? 顯然&#xff0c;我們可以用數組 int table[26] 來存儲每個小寫字母出現的次數&#xff0c;而且這樣處理&#xff0c;效率奇高。假如我們想知道字…

昆蟲-目標檢測數據集(包括VOC格式、YOLO格式)

昆蟲-目標檢測數據集&#xff08;包括VOC格式、YOLO格式&#xff09; 數據集&#xff1a; 鏈接: https://pan.baidu.com/s/1tYb8s-AVJgSp7SGvqdWF9A?pwdt76a 提取碼: t76a 數據集信息介紹&#xff1a; 共有 6009 張圖像和一一對應的標注文件 標注文件格式提供了兩種&#x…

C++(23):unreachable

C++23在頭文件 "><utility>定義了std::unreachable(),用于指示編譯器,該段代碼不應該被允許,因此編譯器可以對該位置進行優化,如果一旦允許了該位置的代碼,行為未定義: #include <utility> #include <iostream>using namespace std;int func(…

備戰藍橋杯 Day1 回顧語言基礎

開啟藍橋杯刷題之路 Day1 回顧語言基礎 1.配置dev 工具->編譯選項->勾選編譯時加入以下命令->設定編譯器配置(release和debug)都要-> -stdc11 ->代碼生成/優化->代碼生成/優化->語言標準(-std)->ISO C11 ->代碼警告->顯示最多警告信息(-Wall)…

python學opencv|讀取圖像(七十五)人臉識別:Fisherfaces算法和LBPH算法

【1】引言 前序學習進程中&#xff0c;已經掌握了使用Eigenfaces算法進行的人臉識別。相關文章鏈接為&#xff1a; python學opencv|讀取圖像&#xff08;七十四&#xff09;人臉識別&#xff1a;EigenFaces算法-CSDN博客 在此基礎上&#xff0c;學習剩余兩種人臉識別算法&am…

React 前端框架介紹

什么是 React&#xff1f; React 是一個由 Facebook 開發并維護的開源 JavaScript 庫&#xff0c;用于構建用戶界面。它主要用于創建交互式用戶界Face&#xff08;UI&#xff09;&#xff0c;尤其是當數據變化時需要更新部分視圖時非常有效。React 的核心思想是組件化和聲明性…