为什么我的Tic Tac Toe Deep Q-Learning实现不学会阻止对手移动?

问题描述 投票:0回答:1

我正在尝试使用深度Q网络解决井字游戏。

环境:

长度为9的数组用于表示游戏状态,其中1代表当前玩家的标记位置,-1代表下一个玩家的位置。 0用于未标记的位置。变量turn用于确定下一个回合。动作表示为具有行和列号的列表。 0奖励为非终止移动和平局。获胜将得到1的奖励。

示例:

 x | - | -

 - | - | o 

 - | - | -

表示为[1,0,0,0,0,0,0,-1,0],这里x表示为1,o表示为-1,因为下一回合是x的一个动作[1,2]会将状态更改为

 x | - | -

 - | - | o 

 - | x | -

表示为[-1,0,0,0,0,-1,0,1,0],此处x表示为-1,o表示为1,因为下一圈是o's

深层Q网络:

q函数接受一个状态和一个动作,以输出与该状态的移动相关的q值我通过使用状态s的目标q值和操作a作为更新q函数,

目标q值(s,a)=伽玛*(奖励(s,a)-q值(s',a'))

其中gamma = 1,s'是在状态s进行移动a之后的下一个状态,而a'是由q函数确定的下一个玩家的下一个最佳移动。

根据我对minimax算法的理解,我从奖励中减去q值。

[最佳动作是通过使用合法动作列表中的动作获得当前状态的q值而获得的,q值最高的动作被视为最佳动作

我正在使用一个在线q网络来提供在每个样本期间更新的下一个最佳移动,并使用一个离线q网络来提供用于获得目标q值的q值,根据DDQN的实施,该q值的更新频率较低。 epsilon衰减勘探和开发。

我也在使用体验重播缓冲区

使用的神经网络是>

model = models.Sequential()
model.add(layers.Dense(50, input_dim=11, activation='sigmoid'))
model.add(layers.Dense(20, activation='sigmoid'))
model.add(layers.Dense(1, activation='linear'))

使用学习速率为.01的rmsprop优化器,>

ε= 1至.05,衰减率为.9995

体验重播缓冲区大小= 500集

用于训练的batch_size = 500个状态和动作

离线模型以每500个情节为间隔更新在线权重。

训练了20000集后,损失正在波动loss curve

DQN无法阻止移动,仅对完成一行感兴趣。我想了解此实施中出了什么问题。是因为DQN不稳定还是我做了任何缺陷。感谢您的帮助。这是我第一次发帖,我对如何写问题并不熟悉,请更正问题中的错误。

This is the code but it is not well written

我正在尝试使用深度Q网络解决井字游戏。环境:长度为9的数组用于表示游戏的状态,其中1代表当前玩家的标记位置,...

如果您还可以发布奖励与时间的关系图,那就太好了。

您可以尝试的方法之一是在每个情节中反向传播打折的奖励。从本质上讲,每集结束后,您都应获得以下奖励:

new_reward = gamma^(T-t)*terminal_reward

您将这些奖励存储在重播缓冲区中,而不是从环境中获得的零奖励。这将减轻奖励稀疏的问题。

python tensorflow reinforcement-learning tic-tac-toe
1个回答
1
投票

如果您还可以发布奖励与时间的关系图,那就太好了。

© www.soinside.com 2019 - 2024. All rights reserved.