在「OpenAI Gym」的環境下,我們可以透過亂數方法找到「Frozen Lake」問題的多種解決路徑;但是要怎麼透過這麼多可能的路徑來進行讓行走於「Frozen Lake」的機器人具備學習能力的目標呢。
首先,再回顧一下亂數取得路徑的方法;由於「Fronze Lake」機器每一步只有行走只有4種可能,因此我們可以改用「numpy.random.randint()」函數來取代「env.action_space.sample()」方便控制產生的「action」結果;改寫亂數機器人行走於「Fronzen Lake」的程式如下:
import numpy as np
np.random.seed(13)
epochs=400
for epoch in range(epochs):
env.reset()
path=[]
observation=0
terminated=False
while (not terminated):
action=np.random.randint(4)
path.append(action)
observation, reward, terminated,_,_=env.step(action)
if(reward>0):
print('successful path:',path)
print(env.render())
我們可以看到, 在400次的亂數嘗試之後,會有一次成功的機會。
接下來,每次如果找到一次成功過關的路徑,那我們就把這個路徑上經過位置相對應所作動的「action」加一,如下表;
所以程式可以再修改如下;
import numpy as np
table=np.zeros((16,4))
#--------------
np.random.seed(13)
epochs=400
for epoch in range(epochs):
state=env.reset()
path=[]
terminated=False
while (not terminated):
action=np.random.randint(4)
path.append(action)
observation, reward, terminated,_,_=env.step(action)
if(reward>0):
env.reset()
for j in range(len(path)):
action=path[j]
observation,_,_,_,_=env.step(action)
print(env.render())
table[observation,action]+=1
print('successful path:',path)
print('table:',table)
從這樣的一張表格,我們就可以知道;如果機器人要通過「Frozen Lake」的話,在那一個位置 (observation),作那一個動作 (action),會有比較高的機會可以成功通過。這個表格,我們稱之為「Q-table」。所以,如果我們可以將亂數嘗試 2000 次之後的「Q-table」存下來,如下:
import numpy as np
table=np.zeros((16,4))
#--------------
np.random.seed(13)
epochs=2000
for epoch in range(epochs):
state=env.reset()
path=[]
terminated=False
while (not terminated):
action=np.random.randint(4)
path.append(action)
observation, reward, terminated,_,_=env.step(action)
if(reward>0):
env.reset()
for j in range(len(path)):
action=path[j]
observation,_,_,_,_=env.step(action)
table[observation,action]+=1
print('table:',table)
#-------
np.save('qtable',table)
然後,修改原來亂數嘗試 400 次的程式;當機器人決定要移動的時候先作擲骰子來決定,要使用過去的「Q-table」經驗或是亂數嘗試來前進。
table=np.load('qtable.npy')
np.random.seed(13)
epochs=400
for epoch in range(epochs):
env.reset()
observation=0
path=[]
terminated=False
while (not terminated):
dice=np.random.randint(6)
if(dice>2):
action=np.argmax(table[observation,:])
else:
action=np.random.randint(4)
path.append(action)
observation, reward, terminated,_,_=env.step(action)
if(reward>0):
print('successful path:',path)
可以看到,同樣是嘗試 400 次,透過環境回饋所建立的「Q-table」的學習機制,成功的機會可以增加了 8 倍。