深度Q模型无法学习

时间:2020-10-15 09:41:17

标签: java reinforcement-learning

我正在尝试使用自己的ANN实现来解决Deep Q Learning中的Wumpus World问题。这是分配的要求,因此不需要TF,PyTorch或Keras。

我将状态编码为4×4×7的单热编码向量,该向量对游戏中的每个单元格将可能的状态之一(wumpus,金色,微风,坑,玩家,空,恶臭)设置为1,例如wumpus位于(1,1)-> encoding [1] [1] = [1、0、0、0、0、0、0]。这将被平整为一个向量,以馈入我的网络。

由于游戏中的信息不完美,因此最初,对于未知状态,此向量大部分为1s。

每次游戏未结束时,代理都会执行其doAction()方法,然后调用其train()方法。

“ Trainer”或主循环本质上循环i < episodes,并为每个情节循环,创建一个新游戏,然后在该游戏尚未结束时循环,并调用doAction()和{ {1}}在代理上。如果达到任意阈值,则使用策略网络的参数更新代理中的目标网络。

我为每个游戏增加了我认为不应该存在的最大步骤数,但这可以说明问题:即使将epsilon-greedy参数设置为1,它似乎也永远不会赢(或输)。最大步长是为了解决该问题,暂时

我选择使用的得分(奖励)是每个动作简单的-1,如果特工在深坑中则为-100,如果特工捡到金则为+1000,如果特工捡到金则为-1000降落在Wumpus(游戏结束)上。

我开始理解,由于TF和我自己的网络之间在速度上几乎无可比拟,因此我认为用DQ来解决这个问题是完全不可行的,但是,在我看来,我不会如果无法解决该问题,请分配该项目。

以下是相关代码: DQNTrainer.java

train()

DQNAgent.java

public void train(int its) {
    for (int i = 0; i < its; i++) {
        double meanReward = 0;
        World game = MapGenerator.getRandomMap((int) System.currentTimeMillis())
            .generateWorld();
        this.agent.setWorld(game);
        int steps = 0;
        while (!game.gameOver()) {
            agent.doAction();
            agent.train();
            meanReward = meanReward + (agent.getScore());
            if (steps > MAX_STEPS) {
                break;
            }
            steps++;
        }
        
        rewards.add(Pair.of(i, (meanReward) / steps));

        if (i % TARGET_UPDATE == 0) {
            this.agent.updateTargetModel();
        }
    }
}

0 个答案:

没有答案