解讀gym中的action_space和observation_space


 

做強化學習的相關任務時通常需要獲取action和observation的數目,但是單智能體和多智能體環境下的action_space等其實是不同的。

先看單智能體環境,

print(env.action_space)
print(env.observation_space)

打印相關的space,輸出如下:

Discrete(19)
Box(115,)

其中Discrete(19)是action_space,19代表有19個action,它其實是一個類,並且繼承一個Space類,所以不可能用n_actions=env.action_space[0]這樣類似數組的手段來得到action的個數,同理observation也是,一般獲取action和observation個數如下:

n_actions=env.action_space.n #19
n_observations=env.observation_space.shape[0] #115

這樣就能得到action個數為19,observation為115。
而對於多智能體的相關space如下:

MultiDiscrete([19 19 19])
Box(3, 115)

其中MultiDiscrete([19 19 19])代表的是action_space,它不能再像單智能體那樣n_actions=env.action_space.n來獲取action個數,因為MultiDiscrete([19 19 19])這個類沒有n這個屬性,此外我們需要從這兩個space中得到智能體的個數,針對action_space,其實可以用.nvec屬性將MultiDiscrete轉為數組:

sa_size=[]
for acsp in env.action_space.nvec:
	sa_size.append((env.observation_space.shape[1], acsp))

print(sa_size)
n_agents=len(sa_size)

將所有的action和observation個數寫到sa_size列表中就行。
如何寫一個通用的呢?可以使用env.action_space.shape這個變量來判斷,在單智能體該變量為空,如下:

sa_size=[]
if env.action_space.shape:
    for acsp in env.action_space.nvec:
        sa_size.append((env.observation_space.shape[1], acsp))
else:
    sa_size.append((env.observation_space.shape[0], env.action_space.n))

print(sa_size)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM