【游戲ai】從強化學習開始自學游戲ai-2 使用IPPO自博弈對抗pongv3環境

文章目錄

  • 前言
  • 一、環境設計
  • 二、動作設計
  • 三、狀態設計
  • 四、神經網路設計
  • 五、效果展示
  • 其他問題
  • 總結


前言

本學期的大作業,要求完成多智能體PPO的乒乓球對抗環境,這里我使用IPPO的方法來實現。

正好之前做過這個單個PPO與pong環境內置的ai對抗的訓練,具體見:【游戲ai】從強化學習開始自學游戲ai-1非侵入式玩像素小鳥的第一部分。

想著這次做IPPO的自博弈,應該會好上手不少,但是實際情況,這個Pettingzoo里的環境,還是有些bug的,經過修改后,可以達到良好的效果。

效果見:
在這里插入圖片描述
代碼見:FreeRL_for_play/tree/main/IPPO_for_pong (歡迎star)


一、環境設計

環境見:https://pettingzoo.farama.org/environments/atari/pong/
在這里插入圖片描述
環境參數:
在這里插入圖片描述

主要是這里
在這里插入圖片描述
問題1:
在具體實現訓練中,(右邊是first_0,左邊是second_0),會出現first_0發完第一個球后,若是second_0沒有接到球,則會出現不發球的情況。
解決:
在具體的環境里,有發球這個動作,1:Fire,經過測試,這個發球是遵循環境的規則來發球,讓上一局贏的(得分+1)一方來發球。
于是設計每過200幀判斷當前的分數是否與上一個200幀的分數一致,若是一致,則發球,這樣可以避免上述的環境問題。
并且經過測試,即使雙方在膠著打乒乓時,互相擊球超過了200幀,此時分數沒有變化,此發球動作也不會影響兩者的擊球,即并不會突然停下來發球。

'''
| Action    | Behavior  |
|:---------:|-----------|
| 0         | No operation |
| 1         | Fire |
| 2         | Move right |      
| 3         | Move left |
| 4         | Fire right |
| 5         | Fire left |'
'''

問題2:
此環境如規則所說,不是一個零和環境,在擊球時會出現擊球的一方-1,被擊球的一方0的獎勵,此獎勵在官方Atari
https://ale.farama.org/environments/pong/中也沒有設置此獎勵。
此獎勵或許會導致誤解,在擊球后,在一個準備接球的狀態時獲得一個-1獎勵,導致智能體學不好。
并且有此獎勵時,獎勵函數不會收斂到一個0和的狀態。
解決:
將此獎勵屏蔽掉。
當獎勵出現不是一個為1一個為-1時,將這個獎勵都置為0。

問題3:
當問題1被解決時,又迎來一個新問題,即在環境中出現了一步發球動作,此動作會調用env.step(),此時會導致一個大問題和一個小問題,小問題是:使得環境本身計算出的truncation不準確;大問題是:會偶爾出現剛好這一步之后這一步的truncation為True,所以之后就不應該再進行動作,否則就會出現無圖像的錯誤。
解決:
小問題:手動計算truncation邏輯,將發球的步數也加入在內。
大問題:判斷發球這步是否已結束,結束則跳過后面的動作,重新reset,不結束則繼續,這里有個點要注意一下:關于是否將這發球這步的狀態,動作,加入到經驗池里,我這里沒有加入,因為在動作設計上沒有發球這步,所有我并沒有添加。

最后環境的默認終止條件是一方達到21分時,則一方獲勝,此游戲結束,默認截斷條件是幀數達到100000(max_cycles=100000)時為截斷,為了實際訓練的速度的加快,這里將max_cycles設置為10000。

'''
class ParallelAtariEnv(ParallelEnv, EzPickle):def __init__(self,game,num_players,mode_num=None,seed=None,obs_type="rgb_image",full_action_space=False,env_name=None,max_cycles=100000,render_mode=None,auto_rom_install_path=None,):
'''

二、動作設計

同樣的,這里將動作設計和【游戲ai】從強化學習開始自學游戲ai-1非侵入式玩像素小鳥的第一部分一樣,將動作改成了二維動作,只有下述的2和3的動作。

'''
| Action    | Behavior  |
|:---------:|-----------|
| 0         | No operation |
| 1         | Fire |
| 2         | Move right |      
| 3         | Move left |
| 4         | Fire right |
| 5         | Fire left |'
'''

三、狀態設計

狀態設計,和【游戲ai】從強化學習開始自學游戲ai-1非侵入式玩像素小鳥的第一部分一樣,
參考https://gist.github.com/karpathy/a4166c7fe253700972fcbc77e4ea32c5
裁剪三通道圖基本和參考代碼一致:

def prepro(image_in):image=image_in.copy() # 第1張圖image = image[35:185] # crop # 第2張圖image = image[::2,::2,0] # downsample by factor of 2 # 第3張圖image[image == 144] = 0  # 擦除背景 (background type 1) # 第4張圖image[image == 109] = 0  # 擦除背景image[image != 0] = 1  # 轉為灰度圖,除了黑色外其他都是白色 return image.astype(np.float32).ravel()

此裁剪展示參考代碼:【強化學習】玩轉Atari-Pong游戲

在背景為109的裁剪展示
在這里插入圖片描述
背景為144的裁剪展示
在這里插入圖片描述
參考代碼的狀態輸入:
第1幀為obs輸入全為0的圖,展成1維,將當前幀賦給上一幀
第2及之后的幀為obs輸入為當前幀減去上一幀的圖(展成1維),將當前幀賦給上一幀
效果展示為如下:
在這里插入圖片描述
我的代碼的狀態輸入:
第1幀為obs輸入全為0的圖,展成1維,將當前幀賦給上一幀(第一幀)
第2及之后的幀為obs輸入為當前幀減去上一幀(此幀沒變一直為第一幀)的圖(展成1維)

這是我在實驗時,不小心忘記加入prev_x = cur_x的結果
效果展示如下:

在這里插入圖片描述

但是這個效果竟然比參考代碼的收斂效果好一點,于是就一直保留此狀態設計。
效果對比如下,5為參考代碼的效果,4為我的效果。
在這里插入圖片描述
收斂時間上還是4快,
在這里插入圖片描述
注:這里4我再測試一次是4.4h,應該是沒選擇用cpu訓練的緣故導致的7h。

四、神經網路設計

這里Actor和Critic網路還是沿用簡單的MLP設計,而沒有使用cnn網路的設計
具體見:【游戲ai】從強化學習開始自學游戲ai-1非侵入式玩像素小鳥的第一部分

原因:
使用cnn網路來訓練時,訓練的效果太慢了
效果如下:
9,15,17為cnn訓練,其余1,2,3,4,9為mlp訓練。
在這里插入圖片描述

五、效果展示

訓練時,將兩個智能體的獎勵,終局分數,first智能體的勝率進行了保存。

由于這里將環境的截斷設置為10000,會有可能在兩者沒有決出勝負(一方達到21)的情況下進行截斷,所以將勝率設計如下:

      ## 計算勝率if episode_score[env_agents[0]] > episode_score[env_agents[1]]:win_list.append(1)elif episode_score[env_agents[0]] == episode_score[env_agents[1]]:win_list.append(0.5)else:win_list.append(0)win_rate = sum(win_list) / len(win_list) if len(win_list) < 100 else sum(win_list[-100:]) / 100

最終效果如下:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
平滑后的獎勵曲線
在這里插入圖片描述
平滑后的分數曲線
在這里插入圖片描述

在這里插入圖片描述

從上可以看到獎勵曲線,最終都收斂到了0附近,分數曲線收斂到了相近的分數附近,first智能體的勝率為50%左右。
這里分數曲線收斂到了10附近大概率是因為我環境的截斷設置為10000幀的緣故,如果加大這個數目,可能最終兩者都收斂到20附近,(21分獲勝)。
這也符合零和博弈應該的效果,大家都是50%的獲勝概率,50%的概率獲得1分。50%的概率丟一分,那么獎勵曲線就收斂到0附近了。

其他問題

問題:為什么使用常見意義上的MAPPO不能實現此自博弈訓練。
解決:
IPPO和MAPPO的區別
宏觀上 IPPO和MAPPO的區別就是critic的輸入不一樣,MAPPO的critic是global state信息,而IPPO的critic只有local obs。
微觀上 MAPPO的訓練邏輯是訓所有agent的reward 即 (+1 -1 ) +(-1 +1)+ (-1 +1) = 0
IPPO是各自訓自己的 (+1 -1 -1)(第一個和) (-1+1 +1)(第二個和)。
所以導致MAPPO只能用來合作環境,而IPPO既可以合作也可以博弈

老師說可以將MAPPO來當成一個PPO(智能體)來看,另外一個MAPPO當作對手智能體來看,可以這樣學。
這里沒有實現此想法,嘗試用IPPO來做自博弈。

問題:環境的安裝
解決:此環境的安裝在windows上不可行,在WSL上的linux下解決安裝問題

總結

此次項目需要很多前置經驗和知識,是一次難度很大的項目,但是也使我獲益良多,針對各種各樣的環境,強化學習的訓練難點有時即在算法的挑選上,又在環境的搭建上,又可能在獎勵的設計上,也有可能是狀態的挑選上,無論是哪個沒有做到位,都有可能導致項目的失敗。

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

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

相關文章

計算機考研精煉 操作系統

第 14 章 操作系統概述 14.1 基本概念 14.1.1 操作系統的基本概念 如圖 14 - 1 所示&#xff0c;操作系統是計算機系統中的一個重要組成部分&#xff0c;它位于計算機硬件和用戶程序&#xff08;用戶&#xff09;之間&#xff0c;負責管理計算機的硬件資源&#xff0c;為用戶和…

什么是基爾霍夫第一定律

基爾霍夫第一定律&#xff08;Kirchhoffs First Law&#xff09;&#xff0c;也稱為基爾霍夫電流定律&#xff08;Kirchhoffs Current Law&#xff0c;簡稱 KCL&#xff09;&#xff0c;是電路分析中最基礎的定律之一。它描述了電路中電流的守恒特性&#xff0c;適用于任何集總…

解決 RN Switch 組件在安卓端樣式很丑的問題

解決此種問題的方式有很多 可以導入原生庫react-native-switch 切圖 (會缺少動畫) 使用 js 組件 這里使用 js 繪制組件&#xff08;原生體驗&#xff09;解決此類問題 Switch.tsx import React, { useEffect, useRef, useState } from react; import { Animated, Pressabl…

【AI】【MCP】搭建私人王炸MCP自動化工作流

目錄 一、什么是MCP 二、MCP大集合 三、準備工作 3.1 安裝node.js 3.2 安裝vscode 3.3 安裝cline插件 3.3.1 安裝 3.3.2 配置Cline 四、配置MCP服務 4.1 Search-mcp服務 4.2 playwright-mcp 服務 前言&#xff1a;夢想組合&#xff0c;輕松辦公&#xff0c;告別手動&a…

Git 實操:如何使用交互式 Rebase 移除指定提交(真實案例分享)

在日常開發中&#xff0c;有時候我們提交了一些不想保留的記錄&#xff0c;比如測試代碼、錯誤的功能提交等。 ?? 在操作 4. 強制推送到遠程倉庫前的注意事項 強制推送&#xff08;git push --force 或 git push -f&#xff09;確實很強大但也危險&#xff0c;因為它會重寫…

11.Excel:函數

一 函數是什么 函數是定義好的公式。 單元格內輸入sum然后tab&#xff0c;框選要求和的范圍&#xff0c;然后回車鍵。 補充&#xff1a;公式。 公式以開頭&#xff0c;可以用于計算&#xff0c;返回數值。 分別點擊各個數值&#xff0c;中間用加號連接。這樣很不方便&#xff…

Springboot使用ThreadLocal提供線程局部變量,傳遞登錄用戶名

文章目錄 概述使用創建ThreadLocalUtil工具類在登錄攔截器中使用ThreadLocal存儲登錄用戶名在/userInfo接口中獲取登錄用戶名 注意事項參考視頻 概述 使用 創建ThreadLocalUtil工具類 utils/ThreadLocalUtil.java package org.example.utils;/*** ThreadLocal 工具類*/ Supp…

1399. 統計最大組的數目

1399. 統計最大組的數目 題目鏈接&#xff1a;1399. 統計最大組的數目 代碼如下&#xff1a; class Solution { public:int countLargestGroup(int n) {int res 0;unordered_map<int, int> um;int maxValue 0;for (int i 1;i < n;i) {string value to_string(i);…

VS Code 插件Git History Diff 使用

右上角 查看單個文件記錄

數學建模論文手的學習日常01

目錄 一.要寫的內容&#xff1a; 二.文章標題&#xff1a; 三.摘要&#xff08;非常非常非常重要&#xff09; 四、關鍵詞&#xff1a; 五、問題重述 六、模型假設 七、符號說明 八、模型的建立與求解 九、模型的分析與檢驗 十、模型的評價、改進與推廣 十一、參考…

深度學習: AI 體育領域

一、引言 在科技與體育深度融合的當下&#xff0c;AI 體育逐漸成為推動體育行業變革的重要力量。深度學習憑借其強大的數據分析與模式識別能力&#xff0c;為 AI 體育帶來了全新的發展機遇。從運動員動作分析到智能健身指導&#xff0c;從賽事預測到運動康復輔助&#xff0c;深…

在 Ubuntu24.04 LTS 上 Docker 部署英文版 n8n 和 部署中文版 n8n-i18n-chinese

一、n8n 簡介 n8n 是一個低代碼&#xff08;Low-Code&#xff09;工作流自動化平臺&#xff0c;可以幫助用戶以非常簡單的方式創建自動化流程&#xff0c;連接不同的應用程序和服務。n8n的設計理念是為了讓復雜的工作流變得簡單易用&#xff0c;同時也支持高度的自定義&#xf…

《系統分析師-第三階段—總結(八)》

背景 采用三遍讀書法進行閱讀&#xff0c;此階段是第三遍。 過程 本篇總結第15章的內容 第15章 總結 系統運行與維護&#xff0c;系統經過測試交付之后&#xff0c;進入運行維護階段&#xff0c;維護分為系統運行、故障維護、系統評價和系統相關的策略。 疑問&#xff1a;…

LeetCode 1295.統計位數為偶數的數字:模擬

【LetMeFly】1295.統計位數為偶數的數字&#xff1a;模擬 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/find-numbers-with-even-number-of-digits/ 給你一個整數數組 nums&#xff0c;請你返回其中位數為 偶數 的數字的個數。 示例 1&#xff1a; 輸入&#xff1…

DDD是什么?電商系統舉例

一、DDD的基本概念 領域驅動設計&#xff08;Domain-Driven Design&#xff0c;簡稱DDD&#xff09;是由Eric Evans提出的一種軟件開發方法論&#xff0c;旨在應對復雜業務系統的設計和實現。它的核心思想是將軟件的設計與業務領域緊密結合&#xff0c;通過深入理解業務需求&a…

K8S ConfigMap 快速開始

一、什么是 ConfigMap&#xff1f; ConfigMap 是 Kubernetes 中用于存儲非敏感配置數據的 API 對象&#xff0c;支持以鍵值對&#xff08;Key-Value&#xff09;或文件的形式存儲配置&#xff0c;允許將配置與鏡像解耦&#xff0c;實現配置的集中管理和動態更新。 二、主要用…

Prometheus使用Recoding Rules優化性能

通過PromQL可以實時對Prometheus中采集到的樣本數據進行查詢&#xff0c;聚合以及其它各種運算操作。而在某些PromQL較為復雜且計算量較大時&#xff0c;直接使用PromQL可能會導致Prometheus響應超時的情況。這時需要一種能夠類似于后臺批處理的機制能夠在后臺完成這些復雜運算…

C++ RAII 編程范式詳解

C RAII 編程范式詳解 一、RAII 核心概念 RAII&#xff08;Resource Acquisition Is Initialization&#xff0c;資源獲取即初始化&#xff09; 是 C 的核心編程范式&#xff0c;通過將資源生命周期與對象生命周期綁定實現安全、自動化的資源管理。 核心原則&#xff1a; 資源…

Rust 學習筆記:枚舉與模式匹配

Rust 學習筆記&#xff1a;枚舉與模式匹配 Rust 學習筆記&#xff1a;枚舉與模式匹配定義枚舉&#xff08;Enum&#xff09;枚舉變量Option 枚舉及其相對于 NULL 的優勢match 和枚舉與 Option\<T\> 匹配match 應該是詳盡的Catch-all 模式和 _ 占位符使用 if let 和 let e…

《WebGIS之Vue進階教程》(13)ref的實現

1 為什么需要ref 由于proxy只能代理引用類型數據(如: 對象, 數組, Set, Map...), 需要一種方式代理普通類型數據(String, Number, Boolean...) 設計ref主要是為了處理普通類型數據, 使普通類型數據也具有響應式 除此之外, 通過reactive代理的對象可能會出現響應丟失的情況. 使…