Chrome Обучение усилению T-Rex-Game не показывает улучшения - PullRequest
1 голос
/ 01 марта 2020

Я хотел бы создать ИИ для Chrome -No-Inte rnet -Dino-Game. Поэтому я адаптировал этот Github-репозиторий для своих нужд. Я использовал следующую формулу для расчета нового Q: Formula

Источник: https://en.wikipedia.org/wiki/Q-learning

Моя проблема в том, что даже после ~ 2.000.000 итераций, мой игровой счет не увеличивается.

Вы можете найти файл игры здесь: https://pastebin.com/XrwQ0suJ

QLearning.py:

import pickle
import Game_headless
import Game
import numpy as np
from collections import defaultdict

rewardAlive = 1
rewardKill = -10000
alpha = 0.2  # Learningrate
gamma = 0.9  # Discount

Q = defaultdict(lambda: [0, 0, 0])  # 0 = Jump / 1 = Duck / 2 = Do Nothing

oldState = None
oldAction = None

gameCounter = 0
gameScores = []


def paramsToState(params):
    cactus1X = round(params["cactus1X"] / 10) * 10
    cactus2X = round(params["cactus2X"] / 10) * 10
    cactus1Height = params["cactus1Height"]
    cactus2Height = params["cactus2Height"]
    pteraX = round(params["pteraX"] / 10) * 10
    pteraY = params["pteraY"]
    playerY = round(params["playerY"] / 10) * 10
    gamespeed = params["gamespeed"]

    return str(cactus1X) + "_" + str(cactus2X) + "_" + str(cactus1Height) + "_" + \
           str(cactus2Height) + "_" + str(pteraX) + "_" + str(pteraY) + "_" + \
           str(playerY) + "_" + str(gamespeed)


def shouldEmulateKeyPress(params):  # 0 = Jump / 1 = Duck / 2 = Do Nothing

    global oldState
    global oldAction

    state = paramsToState(params)
    oldState = state
    estReward = Q[state]
    action = estReward.index(max(estReward))
    if oldAction is None:
        oldAction = action
        return action

    # Previous action was successful
    # -> Update Q
    prevReward = Q[oldState]
    prevReward[oldAction] = (1 - alpha) * prevReward[oldAction] + \
                            alpha * (rewardAlive + gamma * max(estReward))
    Q[oldState] = prevReward
    oldAction = action
    return action


def onGameOver(score):
    # Previous action was NOT successful
    # -> Update Q
    global oldState
    global oldAction
    global gameCounter
    global gameScores

    gameScores.append(score)

    if gameCounter % 10000 == 0:
        print(f"{gameCounter} : {np.mean(gameScores[-100:])}")

    prevReward = Q[oldState]
    prevReward[oldAction] = (1 - alpha) * prevReward[oldAction] + \
                            alpha * rewardKill
    Q[oldState] = prevReward

    oldState = None
    oldAction = None

    if gameCounter % 10000 == 0:
        with open("Q\\" + str(gameCounter) + ".pickle", "wb") as file:
            pickle.dump(dict(Q), file)

    gameCounter += 1


Game_headless.main(shouldEmulateKeyPress, onGameOver)

В каждом кадре функция gameplay() с Game_headless.py звонки shouldEmulateKeyPress(). Затем указанная функция возвращает 0 для прыжка, 1 для утки и 2 для ничего. Я попытался настроить константы, но это не показало никакого эффекта. Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь спрашивать меня! Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Мне удалось решить проблему, но я не знаю, в чем была ошибка. Я добавил оператор return в конце функции игрового процесса, и теперь он работает как-то.

0 голосов
/ 02 марта 2020

Кто-то на Reddit сделал это, вы взглянули на их код? https://www.reddit.com/r/MachineLearning/comments/8iujuu/p_tfrex_ai_learns_to_play_google_chromes_dinosaur/

...