使用強化學習NatureDQN來玩打磚塊

2021-10-02 07:59:42 字數 4175 閱讀 2368

第二版本嘗試

第三版本嘗試

**目錄:

打磚塊是gym遊戲中相對複雜一些的遊戲,不同於cartpole遊戲,狀態空間較少,基本上10分鐘左右訓練就可以玩到最高分,打磚塊要訓練非常長的時間,因此對於更進一步去理解和優化dqn非常有幫助。

打磚塊的reward設定是敲打到磚塊:reward = 1

5次球都未接到或者全部磚塊打完了done = 1

state就是整個遊戲中的全體畫素

單張很難表述出球運動的方向,為了更好的表現出遊戲中的狀態就需要連續多張,這裡我取了連續4張。

這裡貼出**,先使用三層卷積網路降維後

def

create_q_network

(self)

:# network weights

input_layer = input(shape=

(img_size,img_size,4)

, name=

"unet_input"

)#converlution

cnn1 = convolution2d(nb_filter=

32, nb_row=

8, nb_col=

8, border_mode=

'same'

, subsample=(4

,4))

(input_layer)

cnn1 = relu(

)(cnn1)

cnn2 = convolution2d(nb_filter=

64, nb_row=

4, nb_col=

4, border_mode=

'same'

, subsample=(2

,2))

(cnn1)

cnn2 = relu(

)(cnn2)

cnn2 = convolution2d(nb_filter=

64, nb_row=

3, nb_col=

3, border_mode=

'same'

, subsample=(1

,1))

(cnn1)

cnn2 = relu(

)(cnn2)

#full connect

fc0 = flatten(

)(cnn2)

fc1 = dense(

512)

(fc0)

#get q_value

q_value= dense(self.action_dim)

(fc1)

self.model = model(

input

=[input_layer]

, output=

[q_value]

, name=

'q_net'

) self.model.

compile

(loss=

'mse'

,optimizer=adam(lr=self.learning_rate)

)

由於第一版讀取整個,且需要連續4幀,在處理環節就需要消耗大量時間,且獲得得資訊其實與真正桌球相關得只有球得座標以及板子的位置,且僅需要兩幀就可以用於表述需要的狀態,因此我改進了狀態變數的,之用了4個維度。

def

preprocess

(img)

: img_temp = img.mean(axis =2)

# img_temp = cv2.resize(img_temp,(img_size,img_size))

x =-1

y =-1

flag =0if

len(np.where(

(img_temp[

100:

189,8:

152])!=

0)[0

])!=0

: x = np.where(

(img_temp[

100:

189,8:

152])!=

0)[0

][0]

y = np.where(

(img_temp[

100:

189,8:

152])!=

0)[1

][0]

iflen

(np.where(

(img_temp[

193:,8

:152])

!=0)[

0])!=

0:x = np.where(

(img_temp[

193:,8

:152])

!=0)[

0][0

]+93 y = np.where(

(img_temp[

193:,8

:152])

!=0)[

1][0

] flag =

1# x = -2

# y = -2

p =int(np.where(img_temp[

191:

193,8:

152])[

1].mean()-

7.5)

#return img_temp

return

(x,y,p,flag)

for step in

range

(step)

:print

("episode:%d step:%d"

%(episode,step)

) action = agent.egreedy_action(state_shadow)

next_state,reward,done,_ = env.step(action)

(x2,y2,p2,flag)

= preprocess(next_state)

next_state_shadow = np.array(

[x1,y1,x2,y2,p2]

)# define reward for agent

#reward_agent = -1 if done else 0.1

#加大落下的懲罰

if flag ==1:

reward =-10

done =

true

else

: reward =

0.1 agent.perceive(state_shadow,action,reward,next_state_shadow,done)

# if cur_loss is not none:

# total_loss += cur_loss

total_reward += reward

state_shadow = next_state_shadow

x1,y1,p1 = x2,y2,p2

if done:

break

經過14000 episode的迭代的效果如下:

測試出的reward雖然整體有上公升的趨勢但:

引入prioritised,改變訓練樣本的權重。訓練了差多15個小時左右,平均收益任然不是很理想,不過玩起來的感覺還不錯了

強化學習 強化學習基礎

為了應對車載網路中通訊環境快速變化的難題,可以使用強化學習進行解決,這裡對強化學習的基礎進行整理。主要的應用場景為車載網路中資源分配問題。本文源自莫煩python 強化學習章節,有需要請查閱原文 20200413補充了一些內容,來自這篇部落格,是李巨集毅的深度強化學習的筆記。強化學習的主要構成有 a...

強化學習 1 1 0 強化學習介紹

abstract 本文介紹reinforcement learning的具體特點和與其他機器學習演算法不同之處,本文是乙個骨架性的文章,所有專有名詞都保持英文原始單詞,具體內容會在後續中給出詳細解答。keywords reinforcement learning,situation,action,e...

強化學習系列1 強化學習簡介

2015年10月,alphago在和歐洲冠軍進行的圍棋賽上獲得了5 0的完勝,其後的深度強化學習也隨之火了起來。從本期開始開個新坑,一步步把強化學習的內容捋一遍。強化學習 reinforcement learning 是用來解決連續決策問題的一種方法。針對的模型是馬爾科夫決策過程 markov de...