2018年4月19日 星期四

訓練 Gym Retro 玩 Sonic The Hedgehog - Episode 2


要教懂電腦玩「超音鼠」,首先需要訓練數據,亦即是甚麼時候要跑、甚麼時候要跳、甚麼時候要怎麼走...。既然玩遊戲是用到「強化學習 Reinforcement Learning」,即是透過獲得獎勵而加強神經網絡間的權重,從而達到智能效果;那其中一個方法是讓電腦隨機亂跑亂跳。這個方法很耗時,但不用盡神。由它玩過一萬幾千局,總會得到一些精彩的舉動。

不過,很多時得到的結果是不停左右移動,變成原地踏步,怪沒出了多少;寶物又沒得到多少。於是我把右鍵長期按下。這對於不斷向右跑的關卡來說是有效,但會轉向的就會卡住,不得不想其他方法。我在想,要是由人類在適當時候介入一下,應該能解決問題;於是我把決定按鍵操作的部份加入手動處理:
def getAction():
    up = 0
    down = 0
    left = 0
    right = 0
    a = 0
    b = 0
    
    up = (random.getrandbits(1))
    down = (random.getrandbits(1))
    left = (random.getrandbits(1))
    right = (random.getrandbits(1))
    
    if (random.randrange(0, 4) == 3):
        a = (random.getrandbits(1))
    if (random.randrange(0, 4) == 3):
        b = (random.getrandbits(1))
    
    try:
        key_u = keyboard.is_pressed('u')
        key_j = keyboard.is_pressed('j')
        key_h = keyboard.is_pressed('h')
        key_k = keyboard.is_pressed('k')
        key_q = keyboard.is_pressed('q')
        key_space = keyboard.is_pressed(' ')
        
        if key_u or key_j or key_h or key_k or key_q or key_space:
            up = int(key_u)
            down = int(key_j)
            left = int(key_h)
            right = int(key_k)
            a = int(key_q)
            b = int(key_space)
    
    except:
        print("Keyboard error...")
    
    action = [a, b, 0, 0, up, down, left, right, 0, 0, 0, 0]
    return numpy.asarray(action)

沒有留言: