TA的每日心情 | 无聊 2010-8-19 16:40 |
---|
签到天数: 634 天 [LV.9]以坛为家II
七彩门番
- 积分
- 3357
|
以后可能会在AI上下些功夫
我看到这个感觉受益很大
所以转一下
------------------------------------------------
智能失误:如何让AI不那么聪明Submitted by feiiiiiii on Sun, 2009-04-19 22:53原文:Intelligent Mistakes: How to Incorporate Stupidity Into Your AI Code
作者:Mick West
翻译:Tommo
二十年前,当我正在开发我的第一个商业游戏“Steve Davis 世界斯诺克”时, 我给游戏加入了一个AI对手。那个AI很简单,电脑总是选择可以打进的分值最高的球。
因为AI可以知道所有球的精确位置,所以把球打进是一件很容易的事。这对于高难度的游戏来说没什么问题,但在低难度下我需要为AI设置一个随机的角度偏差。
到这个项目的最后,我们收到的反馈说“AI太强了”。我对此感到疑惑,并猜想对方是希望最高难度的AI也会有一些失准。于是我做了些修改。但是我却开始听到“AI的准度下降了”这样的抱怨,同时之前的“AI太强”的抱怨也没有消失。
最终,客户们来到公司,并告诉我们他们所期望的“对手”的样子。一番讨论,我们才明白他们所反映的问题其实是发生在“简单”模式下。
他们对电脑会打偏的情况表示满意,但他们认为电脑在球的走位上做得太好了。不管是防守还是进攻,电脑似乎总能在击球后把白球停在一个很舒服的位置。他们希望能修改这一点。
问题来了:我们根本没有设计走位。白球最终的位置实际上完全是随机的。AI仅仅只是计算能够把球打进袋时的击球点,取一个和距离成正比的初速度,按 照角度放大,并加上一些胡乱设置的因子,然后就这样盲目地把白球打过去。接下来白球会走到哪里,我们根本没有计算,而且它经常会把自己打进袋中。
所以我们很奇怪,为什么这会有问题?为什么他们认为这个完全随机的AI“太强了”?
人们认为AI对手应该能体现出一定的人格。 我们总是觉得在相似的情况下,AI应该拥有与人类相似的思路。
当我们看到球可以停在一个有利的位置时,我们将很自然地觉得电脑一定会那么做。但这种效应被放大了——对于电脑来说,它可以在任何位置把球打进,所 以任何位置都是有利的位置,没有区别。因此,它可以把球一个接着一个地打进,而不需要去考虑走位的问题。 因为对于人类来说,任何时候都一击命中是不可能的事,所以玩家们就假想电脑正在控制着球的走位。
设计?程序?
这是一个设计上的问题还是程序上的? 在某些范围内,它取决于游戏的类型。那么什么情况下,AI对手又应该直接反映出人性化的思维方式呢?
在一对一对抗的游戏当中,比如台球、象棋或是扑克,AI的决策在代码层面基本上是确定的。而在一个一对多的游戏当中,比如FPS,你通常会希望你的对手们 要显得比自己弱一些,毕竟那些敌人总是成群结队地杀过来。而在其他的游戏类型当,尤其是赛车游戏,你被放在与对手们平等的情况下,这时你往往期望的是比较 真实的一个AI——介乎于象棋和FPS之间。
当电脑AI需要模仿越多人类玩家的特性时,程序员肩上的担子就越重。比如一个象棋游戏,几乎绝大部分的AI工作都是程序员的事,而设计人员只负责游戏的表现方式。
在一个FPS游戏当中,底层的AI代码通常要比象棋的简单许多:寻路、状态转换、一些目标和基本行为。这时,大部分行为方式上内容就是由设计人员们来提供,用来模拟一个真实的人性化的行为。
一对一!
在一对一的游戏,比如象棋或是台球,电脑相比玩家拥有绝对的优势。象Fritz这样的现代象棋程序,要比几乎所有的人类棋手强得多。
而在台球游戏当中,电脑程序可以做到一球不失。但是,人们希望游戏的对手能够和自己的水平相衬,因此游戏当中通常有许多的AI等级供玩家选择。
在AI当中实现“愚蠢”的最简单的方法,就是限制电脑的计算量。象棋AI通常在决策的时候要进行数十亿次的计算。电脑使用的计算量越大,它所做出的行动就越准确,当然,所耗费的时间也就越多。反之,如果降低计算量,那么电脑的表现也将打个折扣。
这个方法有一个问题:它会使得AI的表现看起来不真实。 当你限制了电脑的计算量时,它有可能会做出不可思议的、连最笨的玩家也不会做出的愚蠢举动。如此一来,游戏会显得“很假”,这就让玩家再没办法把电脑当成一个“真正”的对手。
记住我们所追求的目标:给玩家一个可以沉浸其中的体验。无论什么游戏,我们要让玩家在获胜前先克服挑战,并以此得到成就感——这要求玩家所面对的是一个真的想要击败他的对手。
当限制计算量之后,我们所创造的AI对手就拥有了取胜的欲望,因为它不再是无所不能的。但同时,这种不完整的AI却使游戏的模拟过程在“物理上”变得不真实。可又有哪个玩家真的会去在意幕后到底发生了什么呢?
那么,换一种情况又如何呢:我们并不限制AI的计算能力,而只是让他在“全力出击”的时候小心翼翼地踢几脚“假球”。
踢假球。
“踢假球”是个体育方面的词汇,它意指某一方有意地做出一系列看起来自然的失误,从而让对方赢得比赛。这是一种被所有运动员和观众所不齿的行为,因为它破坏了体育比赛最重要的“公平竞争”。
但是在电脑游戏当中,与电脑对手的“公平竞争”是不可能出现的。因为双方分别是拥有亿次计算速度的电脑,和拥有高度并行处理能力的人脑。
任何的均势在这在里都只不过是一种假象,这种假象正是我们所需要改进和维系的,而我们通过引入智能的失误以及人为的愚蠢来实现。
电脑需要“踢假球”来让游戏变得有趣。当你“打败”电脑时,你认为你赢了,但这只是假象,实际上,是电脑让你赢的。我们只是想要让你能够觉得自己“赢得实实在在”。
AI程序员需要习惯这种思维。 我们是在调整游戏,创造出人为的、伪造的愚蠢,而不是在试图“主宰”游戏的结果。
我们不是要在设计一个“想输”的AI,而只是要给人类对手一些合理的取胜机会。当人类对手做得不好时,AI仍然有机会胜利,但这时玩家至少会认为“他有机会打败一个强大的对手”,并因此获得继续游戏的欲望。
隐藏的缺陷
电脑象棋专家Steven Lopez是在描述人与人之间的象棋对弈时说:一个高段的棋手与一个低段的棋手对弈时,高段的棋手可以在开始前让给对方几个棋子。这样一来,就算高段棋手倾尽全力而不是故意在棋局当中“放水”给对手机会,比赛也不会呈一边倒的局势。
尽管如此,人与电脑之间的对弈并不是像这样依靠“让子”来取得平衡,而是选择“水平”大致相近的AI对手。
电脑棋手Fritz的作者采用了这样的办法:AI先是故意设下一个人类对手(在一些考虑后)可以取得优势的局面,比如棋子或是位置。一旦人类玩家获得了这个优势,AI就恢复到“全力争胜”的模式。
AI从来不会真的“秀逗”,也许有时看起来像,但它实际上是在进行着数量更多的计算,这些计算往往也比“正常”的时候更为复杂。
至此,AI的目标已经从“赢得比赛”转换到“佯装要赢,但留给人类一线之机,然后再赢回来”对于AI来说,它真的需要些“大智”才能“若愚”。
扑克的AI
我在给 Left Field’s World Series of Poker编写AI的时候, 每个难度下的AI的计算基本上是一样的:电脑会在已知牌面的基础上推算出胜利的可能性,然后根据对手的下注历史来推断对手的牌的好坏。这些可能性之后被用 于计算回报率,并最终决定是放弃、跟注还是加注。
实际上还有一些特殊的规则和例外,但上面所说的是最基本的。所有的AI玩家都会进行相同的计算,通过数万种假设的牌面可能来计算回报率。在这些计算完成之后,每个AI才开始执行各自不同的计算。这时,最“聪明”的玩家会选择最优的行动,而较“笨”的玩家则可能会“放水”。
对于比较弱的扑克AI来说,想要“放水”需要先明确自己应该做什么,然后故意不做,并且要让这种行为看起来不是那么“白痴”。
比如,如果人类玩家刚刚加了一个大注,而你又知道有75%的机会你手里的牌是最好的,这时要“放水”的话,选择“放弃”就可以了。尽管AI玩家拥有很高的赢面,但它正在模拟一个比较弱的人类玩家——这样的玩家在不清楚自己的赢面又看到对方加大注时,往往选择放弃。
相反的,较弱的人类玩家在赢面较小的时候也经常会跟注。这是一种很自然的行为,同时也是我们削弱AI强度的一种好办法,而且它看起来也不是什么“弱智”的行为。
智能的失误以一种概率化形式来实现。“放水”的AI不会总是在人类玩家虚张声势的时候放弃——它们只是更倾向于这么做。
这个AI在高随机性的扑克游戏当中运行得很好,因为人类玩家无法在情报有限的情况分辨出电脑是否正在“放水”。
因为AI一直在进行完整的上百万次的计算,所以它不可能做出人类无法理解的失误,而同时,利用“鲁莽”的决策让AI变得“愚蠢”则可以让游戏更为均势,这让水平一般或较差的玩家也可以乐在其中。
人为的失准
在桌球或是射击游戏当中,电脑AI可以保持无往不胜的准确性。射击AI可以把弹道精确到万分之一英寸,并在五公里外打飞你的帽子。而在桌球里,AI知道所有球的精确座标,并可以在击球前知道所有球之后的走位。
当我在实现我自己的斯诺克AI时,它可以完美地反弹两次然后打落任何球,而且几乎可以每次都打满147分(除非白球落袋,因为没有控制走位)
显然,这家伙不是什么有趣的对手,所以就算在最高等级的难度当中,准确性依然需要降低,而反弹击球更是要被严格地限制。
简单地降低AI的准度并不总是改善游戏性的最优解。就好像我在开篇时提到的“不存在的走位控制”,随机的输出很可能让电脑的行为看起来是“有意的”。如果白球停在了一个有利的位置,又或者幸运地叫到了黑桃同花顺,人们会认为这是不公平的甚至会认为AI在作弊。
所以,在棋类游戏当中,与其降低准度,倒不如提高准确率,同时让AI创造出玩家可以获益的局面,以此让游戏过程变得刺激;在台球游戏中,不要无所顾 虑盲目地击球,AI应该在故意打偏的时候让白球走到一个更加利于玩家的位置; 而在射击游戏里,敌人不能总是随机地高呼“向我开炮”然后跳出掩体。他们应该只是“偶尔大意”地把自己扔到枪口下,并且应该是在最尊贵的观众——玩家—— 靠近自己的时候。
Luck of the Draw
(注:一种桌面游戏,玩家需要拿起铅笔来画画。先从题材卡里抽一张,然后扔骰子选出一个题材,比如“长城”,然后以沙漏计 时,在限时内完成自己的作品,再把所有作品洗混,翻开放到桌面上,并放置不同颜色的标记,这时再扔骰子决定抽多少张投票卡,依次抽出,玩家各拿取一个投票 轮盘,秘密选出心目中的佳作,但是投票的选项都是很奇怪的,比如最丑的、最可怕的、最混乱的、最扣人心弦的,最没有艺术性的,所以看来并不是画的好才能获奖,投票后得票最多的可以获得投票卡,表示1分,若获得的相同投票数,则得到半分。根据玩家人数拿到一定数量的投票卡则结束,最多投票卡的玩家获胜。)
和一个完美的对手比赛并不有趣,但是与一个残疾的对手比赛也一样。为了更加有趣的游戏性,我们需要引入“人工愚蠢”和智能失误。
智能失误看起来像是写坏了的AI,但它们实际上同样需要仔细的计算才能为人类玩家提供更多的娱乐性。智能失误并不是要消除困难,因为玩家仍然需要一定的技巧才能胜出。
对于程序员来说,增加智能失误要比简单地降低AI的准确性复杂得多,但这些额外的努力才带来更完善的玩家体验。
参考资源:
Liden, Lars. “Artificial Stupidity: The Art of Intentional Mistakes,” in AI Game Programming Wisdom 2, Charles River Media, 2004.
http://lars.liden.cc/Publications/Downloads/2003_AIWisdom.pdf
Lopez, Steven. “Intelligent Mistakes,” Chessbase News, 2005.
http://www.chessbase.com/newsdetail.asp?newsid=2579 |
评分
-
查看全部评分
|