我知道如何使用 minimax 之类的算法来玩完美的游戏(在这种情况下,我正在寻找类似于井字游戏的游戏)
但是,我想知道如何创建一个不完美的算法,或不同“技能水平”(简单、中等、困难等)的人工智能,人类玩家实际上有机会击败。
我知道如何使用 minimax 之类的算法来玩完美的游戏(在这种情况下,我正在寻找类似于井字游戏的游戏)
但是,我想知道如何创建一个不完美的算法,或不同“技能水平”(简单、中等、困难等)的人工智能,人类玩家实际上有机会击败。
切断各种深度的搜索以限制计算机的技能。改变评价函数,使计算机偏爱不同的策略。
非专业的人类玩家使用次优策略和有限的战术。这些大致对应于对游戏状态的糟糕评估和有限的超前思考能力。
关于随机性,需要一点点随机性,这样计算机就不会总是犯同样的错误,有时会幸运地比平时做得更好或更差。为此,不要总是选择最佳路径,而是选择按分数加权的路径。您可以让 AI 根据游戏结果改进其评估功能,即更新其权重,从而使 AI 更加有趣。这样它就可以像人类一样在有限的搜索深度下通过游戏学习更好的评估函数。
引擎不容易犯人为错误。减少搜索深度是一种直接的方法,但它有其局限性。例如,减少为一层的国际象棋引擎通常会在一个有价值的棋子仍然受到攻击时进行检查。当对手用反击来防御检查时,两个棋子都是一体的。即使是没有经验的人也不太可能犯这个错误。
也许您可以使用名为 Phalanx 的国际象棋引擎的一些想法:http: //phalanx.sourceforge.net/index.html
它是少数具有复杂难度级别(-e 选项)的开源引擎之一。如果我没记错的话,它会执行正常搜索,但有时会忽略不明显的动作。evaluate.c
包含一个名为 的函数blunder
,它评估一个动作是否可能被人类忽略。
我在游戏中使用的一种方法是利用随机值。对于简单的游戏关卡,我让选择随机数的几率有利于人类玩家。例子:
Easy level: only beat the human if you can randomly select a value less than 10 from the range of 1 to 100
Medium level: beat the human if you can select a random value which is less than 50 from a range of 1 to 100
Hard level: beat the human if you can randomly select a value less than 90 from a range of 1 to 100
我相信有更好的方法,但这可能会给你一个想法
“最简单”的方法是使用阈值和 minmax 结果,从超过阈值的结果中创建一个集合,然后随机选择程序要采用的选择/路径。门槛越低,对手可能更容易。
我说可能是因为即使是纯粹的运气也可以选择最好的移动,因此是“初学者的运气”。
本质上,您正在寻求增加可能结果的熵(随机性)。如果您想专门降低计算机对手的难度,则可以限制 minmax 算法遍历的级别,或者降低算法某些部分的分数。