Python:强化学习Tic Tac Toe AI工作?

Python:强化学习Tic Tac Toe AI工作?,python,Python,所以我对这件事很挠头,我不知道怎么了。代码是。这个想法是,人工智能对自己进行游戏,赢了或画了会得到奖励,输了会受到惩罚。给定一个棋盘,AI将选择具有特定权重的移动。如果游戏最终是一场胜利或平局,那么它选择的那些动作将增加它们的权重。如果游戏最终以失败告终,那么它选择的那些动作的权重将会降低 而我观察到的是,1)X玩家(玩家1)几乎总是在左上角或右下角,而不是在中途,2)随着游戏数量的增加,“X”玩家将变得越来越受欢迎。 我不知道是什么导致了这种行为,我将感谢任何帮助 显然,stackoverfl

所以我对这件事很挠头,我不知道怎么了。代码是。这个想法是,人工智能对自己进行游戏,赢了或画了会得到奖励,输了会受到惩罚。给定一个棋盘,AI将选择具有特定权重的移动。如果游戏最终是一场胜利或平局,那么它选择的那些动作将增加它们的权重。如果游戏最终以失败告终,那么它选择的那些动作的权重将会降低

而我观察到的是,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在给定的条件下,在状态中采取行动,并需要评估可能采取的最佳行动