1

很长一段时间以来,我一直在尝试使用 DDQN 方法解决井字游戏。我花了一段时间来填补我的知识空白,但现在我的代码看起来不错。但是,我不确定如何训练代理,因为它是一个两人游戏。目前,我让智能体与X一起玩,让O由一个随机玩家玩,该玩家做出随机但合法的动作,而智能体也可以下非法动作并因此获得负奖励。阶跃函数如下所示:

def step(self, action):
    reward = 0.
    info = None
    if self.state[action] != 0:  # illegal move
        reward = -1.
        self.done = True
        return self.state, reward, self.done, info
    self.state[action] = self.turn  # make move
    self.turn = -self.turn
    self.state[-1] = self.turn  # update last state, which refers to the turn
    if self.is_winner():  # check for win
        reward = 1.0
        self.done = True
    elif self.state.count(0) == 0:  # check for draw
        reward = 1.0
        self.done = True
        info = 'draw'
    elif self.state.count(0) == 1: # check for draw in final move of the opponent
        final_action = self.state.index(0)
        self.state[final_action] == self.turn
        if not self.is_winner():
            reward = 1.0
            info = 'draw'
            self.done = True
    return self.state, reward, self.done, info

因此,如果代理获胜、平局或如果他下棋,则会给予积极的奖励,这会导致随机玩家下一个棋棋打成平局。

不幸的是,DDQN 没有收敛。我无法获得超过 0.5 的平均奖励。为了跟踪训练进度,我让代理使用当前参数和 0.01 的 epsilon 每 1000 场比赛进行 1000 场比赛。有时在找到一个好的策略后,平均值突然变为负数,因此它似乎也很不稳定。

我的超参数如下:

lr = < 0.001 (I trained many)
memory size = 100.000
target network update rate = 1000
epsilon start = 1.0, epsilon end = 0.1
batch size = 512

有人对我可以做得更好有什么建议吗?对于像井字游戏这样的简单游戏,预计需要多少个训练周期?

4

1 回答 1

0

嗨,我遇到了同样的问题,但经过一些尝试,我能够为 3x3、4x4 训练 DDQN,并且在 5x5 游戏板上也观察到了一些好的结果。在这里检查我的代码https://github.com/hreso110100/RL-Tic_tac_toe

于 2020-07-09T13:16:23.117 回答