Python:强化学习Tic Tac Toe AI工作?
所以我对这件事很挠头,我不知道怎么了。代码是。这个想法是,人工智能对自己进行游戏,赢了或画了会得到奖励,输了会受到惩罚。给定一个棋盘,AI将选择具有特定权重的移动。如果游戏最终是一场胜利或平局,那么它选择的那些动作将增加它们的权重。如果游戏最终以失败告终,那么它选择的那些动作的权重将会降低Python:强化学习Tic Tac Toe AI工作?,python,Python,所以我对这件事很挠头,我不知道怎么了。代码是。这个想法是,人工智能对自己进行游戏,赢了或画了会得到奖励,输了会受到惩罚。给定一个棋盘,AI将选择具有特定权重的移动。如果游戏最终是一场胜利或平局,那么它选择的那些动作将增加它们的权重。如果游戏最终以失败告终,那么它选择的那些动作的权重将会降低 而我观察到的是,1)X玩家(玩家1)几乎总是在左上角或右下角,而不是在中途,2)随着游戏数量的增加,“X”玩家将变得越来越受欢迎。 我不知道是什么导致了这种行为,我将感谢任何帮助 显然,stackoverfl
而我观察到的是,1)X玩家(玩家1)几乎总是在左上角或右下角,而不是在中途,2)随着游戏数量的增加,“X”玩家将变得越来越受欢迎。 我不知道是什么导致了这种行为,我将感谢任何帮助
显然,stackoverflow要求您也输入代码以使用pastebin,因此这里是奖励位,尽管它在上面链接的完整上下文中可能更有意义foo = ai_player
for i in range(0,len(moves_made)):
# Find the index of the move made
weight_index = foo.children.index(moves_made[i])
# If X won
if checkWin(current_player.placements) == 1:
if i % 2 == 0:
foo.weights[weight_index] += 10
else:
foo.weights[weight_index] -= 10
if foo.weights[weight_index] <= 0: foo.weights[weight_index] = 0
# If O won
if checkWin(current_player.placements) == -1:
if i % 2 == 0:
foo.weights[weight_index] -= 10
if foo.weights[weight_index] <= 0: foo.weights[weight_index] = 0
else:
foo.weights[weight_index] += 10
# If it was a draw
if checkWin(current_player.placements) == 0:
if i % 2 == 0:
foo.weights[weight_index] += 5
else:
foo.weights[weight_index] += 5
foo = foo.children[weight_index]
foo=ai\u玩家
对于范围内的i(0,len(移动)):
#查找所做移动的索引
权重索引=foo.children.index(移动[i])
#如果X赢了
如果checkWin(当前玩家位置)==1:
如果i%2==0:
食物重量[重量指数]+=10
其他:
食物重量[重量指数]-=10
如果foo.weights[weight_index]像这样很难说,但你可能会奖励他们打平局,而这种情况会一直发生吗
此外,您应该在开始时对checkWin()求值一次,然后根据具体情况生成一个简单的函数,如update(weight)并通过10、-10或5
您的算法是:
0将每个板状态的所有权重初始化为100
复位板
获得董事会状态
根据重量/电路板状态进行随机(加权)移动
检查游戏是否结束,如果结束,更新权重并返回1,否则返回2
?
像这样很难说,但你可能会奖励他们打平局,而这种情况一直发生
此外,您应该在开始时对checkWin()求值一次,然后根据具体情况生成一个简单的函数,如update(weight)并通过10、-10或5
您的算法是:
0将每个板状态的所有权重初始化为100
复位板
获得董事会状态
根据重量/电路板状态进行随机(加权)移动
检查游戏是否结束,如果结束,更新权重并返回1,否则返回2
?
试图让代理学习的原始代码有很多问题
您使用绝对权重,而不是某些计算出的启发式权重。添加权重时,您希望使用更新机制(例如Q学习)。
这将董事会的权重限制在可能的奖励范围内,并允许新的、有希望的选项上升,如果奖励为正(分数+100或+200将很难被击败)
您将权重分配给董事会索引,而不是董事会位置。这将告诉代理,电路板的某些方块是“最好的”,而其他方块则不考虑其效用。(即,如果第0和第1方格上有X,并且O认为他们的“绝对”最佳移动是右下角,那么X可以赢得下一轮)
在这种环境下,移动似乎是随机的(据我所见)。代理需要某种“探索”的方式来发现哪些动作有效,哪些动作无效,然后“利用”到目前为止发现的最好的动作
您只存储“状态”值,而不存储在给定状态下执行操作的值。有了这个,代理可以计算他们所处状态的值,但是他们需要一种方法来计算他们可以采取的行动的值,以通知他们要采取的最佳行动
在强化学习框架中,agent在给定状态下采取行动,并需要评估可能采取的最佳行动
我已经重新编写了您的代码,使用Q-learning表来适当地移动代理(将代理移动到类中)。还将NumPy用于argmax等函数
Q-学习功能是:
self.Q_table[(state, action)] = q_val + 0.1 * \
(reward + self.return_value[(state, action)] / self.return_number[(state, action)])
代码在一个文件中
- Epsilon为0.08和1000000集,X的获胜率约为16%,Y的获胜率约为7%,平局率约为77%
- Epsilon为0.04和1000000集,X的获胜率约为9%,Y的获胜率约为3%,平局率约为88%
- Epsilon为0.04和2000000集,结果与100万集几乎相同
试图让代理学习的原始代码存在许多问题
您使用绝对权重,而不是某些计算出的启发式权重。添加权重时,您希望使用更新机制(例如Q学习)。
这将董事会的权重限制在可能的奖励范围内,并允许新的、有希望的选项上升,如果奖励为正(分数+100或+200将很难被击败)
您将权重分配给董事会索引,而不是董事会位置。这将告诉代理,电路板的某些方块是“最好的”,而其他方块则不考虑其效用。(即,如果第0和第1方格上有X,并且O认为他们的“绝对”最佳移动是右下角,那么X可以赢得下一轮)
在这种环境下,移动似乎是随机的(据我所见)。代理需要某种“探索”的方式来发现哪些动作有效,哪些动作无效,然后“利用”到目前为止发现的最好的动作
您只存储“状态”值,而不存储在给定状态下执行操作的值。有了这个,代理可以计算他们所处状态的值,但是他们需要一种方法来计算他们可以采取的行动的值,以通知他们要采取的最佳行动
在强化学习框架中,agent在给定的条件下,在状态中采取行动,并需要评估可能采取的最佳行动