创建一个非完美的游戏算法

3

我知道像minimax这样的算法可以用来玩完美的游戏(在此情况下,我正在寻找类似于井字棋的游戏)。

然而,我想知道如何创建一个非完美的算法或具有不同“技能级别”(简单,中等,困难等)的AI,让人类玩家真正有机会击败它。

4个回答

3
限制计算机的技能,可以通过在不同深度处截断搜索来实现。改变评估函数,使计算机偏向于不同的策略。
非专业人类玩家使用次优策略和有限战术。这些基本上对应于对游戏状态的差评估和有限的先见之明。
关于随机性,一点点是需要的,这样计算机就不会总是犯同样的错误,并且有时还可以运气好或者坏。为此,只需选择得分加权后的最佳路径而不总是选择最佳路径即可。您可以通过让AI根据游戏结果改进其评估函数(即更新其权重)来使其更加有趣。这样,它就可以通过游戏学习到有限搜索深度下的更好评估函数,就像人类一样。

0

我在我的游戏中使用的一种方法是利用随机值。对于简单的游戏关卡,我会让选择随机数的几率更加有利于人类玩家。例如:

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

我相信有更好的方法,但这可能会给你一个想法


0

对于一个引擎来说,犯人类错误并不容易。减少搜索深度是一种直接的方法,但它也有其局限性。例如,将国际象棋引擎减少到一层时,往往会在仍有一件有价值的棋子被攻击时给出将军。当对手用反击来防御将军时,两个棋子都处于被吃的状态。即使是一个经验不足的人也不太可能犯这样的错误。

也许你可以从一个名为 Phalanx 的国际象棋引擎中借鉴一些思路: http://phalanx.sourceforge.net/index.html

它是为数不多的具有复杂难度级别(-e 选项)的开源引擎之一。如果我没记错的话,它执行正常搜索,但有时会忽略非显而易见的走法。evaluate.c 中包含一个名为 blunder 的函数,它评估一个走法是否容易被人类忽视。


0

最“简单”的方法是使用阈值和您的minmax结果,从这些超过阈值的结果中创建一个集合,然后随机选择程序要采取的选择/路径。 阈值越低,对手可能越容易。

我说可能是因为即使纯粹的运气也可能选择最佳移动,因此称之为“初学者的幸运”。

本质上,您正在寻找增加可能结果的熵(随机性)。 如果您想特别降低计算机对手的难度,可以限制minmax算法遍历的级别,或者降低算法某部分的点数价值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接