很长一段时间以来,我一直在尝试用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的平均奖励。为了跟踪训练进度,我让代理每 1000 场比赛玩 1000 场比赛,当前参数为 0.01。有时在找到一个好的策略后,平均值突然为负,所以它似乎也很不稳定。
我的超参数如下:
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
有没有人对我可以做得更好的建议?像井字游戏这样的简单游戏需要多少个训练时期?
嗨,我遇到了同样的问题,但经过一些尝试,我能够为 3x3、4x4 训练 DDQN,并且在 5x5 游戏板上也观察到了一些不错的结果。在这里检查我的代码 https://github.com/hreso110100/RL-Tic_tac_toe