很久以来,我一直在尝试使用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。为了跟踪培训进度,我让代理在当前参数和epsilon为0.01的情况下,每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
有人在我可以做得更好的方面有技巧吗?对于井字游戏这样的简单游戏,预计会有多少训练纪元?
答案 0 :(得分:0)
嗨,我遇到了同样的问题,但是经过几次尝试,我才能够针对3x3、4x4训练DDQN,并且在5x5游戏板上也观察到了一些不错的结果。在这里https://github.com/hreso110100/RL-Tic_tac_toe
检查我的代码