很长一段时间以来,我一直在尝试使用 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
有人对我可以做得更好有什么建议吗?对于像井字游戏这样的简单游戏,预计需要多少个训练周期?