Algorithm 对于井字游戏,我可以使用什么算法来确定;“最佳行动”;对于人工智能?

Algorithm 对于井字游戏,我可以使用什么算法来确定;“最佳行动”;对于人工智能?,algorithm,artificial-intelligence,tic-tac-toe,Algorithm,Artificial Intelligence,Tic Tac Toe,在tic-tac-toe实现中,我想最具挑战性的部分是确定机器要玩的最佳动作 可以采用哪些算法?我正在研究从简单到复杂的实现。我将如何着手解决这部分问题?用数字分数对每个正方形进行排序。如果选择了正方形,则转到下一个选项(按秩降序排序)。你需要选择一种策略(第一种策略主要有两种,第二种策略主要有三种)。从技术上讲,您可以对所有策略进行编程,然后随机选择一种。这将使对手更难预测。生成每一个可能的棋盘并根据随后生成的棋盘得分的蛮力方法不需要太多内存,尤其是当你意识到90度的棋盘旋转是多余的,就像垂直

在tic-tac-toe实现中,我想最具挑战性的部分是确定机器要玩的最佳动作


可以采用哪些算法?我正在研究从简单到复杂的实现。我将如何着手解决这部分问题?

用数字分数对每个正方形进行排序。如果选择了正方形,则转到下一个选项(按秩降序排序)。你需要选择一种策略(第一种策略主要有两种,第二种策略主要有三种)。从技术上讲,您可以对所有策略进行编程,然后随机选择一种。这将使对手更难预测。

生成每一个可能的棋盘并根据随后生成的棋盘得分的蛮力方法不需要太多内存,尤其是当你意识到90度的棋盘旋转是多余的,就像垂直、水平、垂直方向的翻转一样,和对角轴

一旦你达到这一点,在树形图中有不到1k的数据来描述结果,因此是计算机的最佳移动


-Adam

因为你只需要处理一个3x3的可能位置矩阵,所以写一个搜索所有可能位置的方法就很容易了,而不需要耗费你的计算能力。对于每个开放空间,计算标记该空间后所有可能的结果(递归地,我会说),然后使用最有可能获胜的移动

优化这将是浪费精力,真的。尽管一些简单的方法可能是:

  • 首先检查是否有可能赢得 另一队,挡住第一队 你发现(如果游戏中有两个) 无论如何,结束了)
  • 如果中心是开放的,一定要去 (之前的规则没有任何限制。) 候选人)
  • 在边前转弯(再次, 如果前面的规则为空)

您可以让AI在一些示例游戏中发挥自己的作用,以供学习。使用有监督的学习算法来帮助它。

维基百科关于玩一场完美游戏(每次都赢或平局)的策略看起来像是简单的伪代码:

引用自

玩家可以玩一个完美的井字游戏(赢或至少是平局),如果他们从下面的列表中选择第一个可用的移动,每个回合,就像纽厄尔和西蒙1972年井字游戏计划中使用的那样。[6]

  • 赢:如果你有两个在一排,发挥第三个得到三个在一排

  • 拦网:如果对手连续有两个,则使用第三个拦网

  • 叉子:创造一个机会,你可以通过两种方式获胜

  • 阻挡对手的叉子:

    选项1:在一行中创建两个以强制 只要对方愿意,他就可以防守 因为这不会导致他们创造 叉子或叉子。例如,如果“X” 有一个角,“O”有一个中心 “X”也有相反的角, “O”不得打角球,以便 赢(在这场比赛中占了一角 场景为“X”创建一个分叉,以 获胜。)

    选项2:如果有配置 对手可以用叉子、拦网的地方 那把叉子

  • 中锋:打中锋

  • 对角球:如果对手在角球区,则打对角球 角落

  • 空角:播放空角

  • 空侧:播放空侧

  • 认识到“叉子”情况是什么样子,可以按照建议用蛮力的方式来完成

    注意:一个“完美”的对手是一个不错的练习,但最终不值得与之“较量”。然而,你可以改变上面的优先顺序,给对手的个性以特征性的弱点。

    你需要的(对于井字游戏或像国际象棋这样难度大得多的游戏)是。不过,对于搜索空间像tic-tac-toe一样小的游戏来说,普通朴素的minimax就可以了


    简而言之,你想做的不是寻找对你来说可能有最好结果的移动,而是寻找可能有最坏结果的移动。如果你认为你的对手打得很好,你必须假设他们会采取对你最不利的行动,因此你必须采取使他们最大收益最小化的行动。

    不使用运动场的尝试

  • 赢得(你的双打)
  • 如果没有,就不要输(对手的双打)
  • 如果没有,您是否已经有叉子(有双叉叉子)
  • 如果没有,如果对手有叉子
  • 在阻塞点中搜索可能的双叉(最终胜利)
  • 如果没有,在阻挡点搜索叉子(这给了对手最大的失败可能性)
  • 如果不是只有阻塞点(不要丢失)
  • 如果没有,搜索double和fork(最终胜利)
  • 如果不是,只搜索给对手最大损失可能性的叉子
  • 如果不是,则仅搜索双精度
  • 如果不是死胡同,则平局,随机
  • 如果不是(这意味着你的第一步)
  • 如果这是比赛的第一步
  • 给对手最大的损失可能性(该算法只产生角点,给对手7个损失点的可能性)
  • 或者为了打破无聊,只是随机的
  • 如果这是比赛的第二步
  • 仅查找不丢失的分数(提供更多选项)
  • 或者在此列表中找到最有可能获胜的分数(这可能很无聊,因为它只会导致所有角落或相邻角落或中心)
  • 注意:当你有双人和叉子时,检查你的双人是否给对手一个双人。如果给了,检查你的新强制分数是否包括在你的叉子列表中。

    a t
    Turn = 1    Go(1)   (upper left corner).
    Turn = 2    If Board[5] is blank, Go(5), else Go(1).
    Turn = 3    If Board[9] is blank, Go(9), else Go(3).
    Turn = 4    If Posswin(X) is not 0, then Go(Posswin(X)) i.e. [ block opponent’s win], else Go(Make2).
    Turn = 5    if Posswin(X) is not 0 then Go(Posswin(X)) [i.e. win], else if Posswin(O) is not 0, then Go(Posswin(O)) [i.e. block win], else if Board[7] is blank, then Go(7), else Go(3). [to explore other possibility if there be any ].
    Turn = 6    If Posswin(O) is not 0 then Go(Posswin(O)), else if Posswin(X) is not 0, then Go(Posswin(X)), else Go(Make2).
    Turn = 7    If Posswin(X) is not 0 then Go(Posswin(X)), else if Posswin(X) is not 0, then Go(Posswin(O)) else go anywhere that is blank.
    Turn = 8    if Posswin(O) is not 0 then Go(Posswin(O)), else if Posswin(X) is not 0, then Go(Posswin(X)), else go anywhere that is blank.
    Turn = 9    Same as Turn=7.