Deep Q-Network(DQN)学习游戏2048

人工智能 Python 游戏-ai dqn 深度学习
2021-11-11 01:28:18

我正在尝试构建一个可以学习玩游戏的 Deep Q-Network (DQN) 代理2048我正在将自己定位于基于游戏蛇的其他程序和文章,并且效果很好(特别是这个)。

作为输入状态,我只使用带有瓦片的网格作为 numpy 数组,作为奖励,我使用 (newScore-oldScore-1) 来惩罚根本不给任何分数的动作。我知道这可能不是最佳选择,因为最好的奖励是尽可能长时间地活着,但第一步应该没问题,对吧?尽管如此,我还是没有得到任何好的结果。

我尝试调整模型布局、神经元和层数、优化器、伽玛、学习率、奖励我还尝试在 5 步后结束游戏并仅针对前 5 步进行优化,但无论我做什么,我都没有得到任何明显的改进。我已经运行了数千场比赛,但它并没有变得更好。事实上,有时我得到的结果比完全随机的算法更糟糕,因为有时它只会为任何输入返回相同的输出并卡住。

所以,我的问题是,如果我做错了什么?我只是在某个地方犯了一个愚蠢的小错误吗?这完全是错误的方法吗?(我知道如果没有 AI,这个游戏可能会很容易解决,但这似乎是一个有趣的项目)

我的 Jupyter 笔记本可以在这里看到Github抱歉代码质量差,我还是个初学者,我知道即使是有趣的小项目,我也需要开始制作文档......

先感谢您,

德鲁科布

编辑:一些代码片段:

输入被格式化为 1,16 numpy 数组,还尝试对值进行规范化或仅对占用和空单元格使用 1 和 0,但这也无济于事。这就是为什么我认为这可能更像是一个概念问题?

    def get_board(self):
        grid = self.driver.execute_script("return myGM.grid.cells;")
        mygrid = []
        for line in grid:
            a = [x['value'] if x != None else 0 for x in line]
            #a = [1 if x != None else 0 for x in line]
            mygrid.append(a)
        return np.array(mygrid).reshape(1,16)

输出是 {0,3} 的索引,表示向上、向下、向左或向右的动作,它只是预测分数最高的值。

prediction = agent.model.predict(old_state)
predicted_move = np.argmax(prediction)

我已经尝试了很多不同的模型架构,但现在选择了一个更简单的网络,因为我已经读到不必要的复杂结构通常是一个问题并且不需要。但是,除了试验之外,我找不到任何可靠的方法来源,如何获得最佳布局,所以我很乐意在那里提供更多建议。

model = models.Sequential()
        model.add(Dense(16, activation='relu', input_dim=16))
        #model.add(Dropout(0.15))
        #model.add(Dense(50, activation='relu'))
        #model.add(Dropout(0.15))
        model.add(Dense(20, activation='relu'))
        #model.add(Dropout(0.15))
        #model.add(Dense(30, input_dim=16, activation='relu'))
        #model.add(Dropout(0.15))
        #model.add(Dense(30, activation='relu'))
        #model.add(Dropout(0.15))
        #model.add(Dense(8, activation='relu'))
        #model.add(Dropout(0.15))
        model.add(Dense(4, activation='linear'))
        opt = Adam(lr=self.learning_rate)
        model.compile(loss='mse', optimizer=opt)
0个回答
没有发现任何回复~