象棋一样的AI真的不适用于回合制策略游戏吗?


13

显然,尝试将最小-最大算法应用于完整的动作树仅适用于小型游戏(我向所有国际象棋爱好者表示歉意,“小”并不表示“简单化”)。对于典型的回合制策略游戏,其中棋盘通常宽于100块并且一侧的所有棋子都可以同时移动,因此,最小-最大算法不适用。

我想知道是否将局部最小-最大算法限制为每个深度的N个板配置还不够好?使用遗传算法,可能有可能找到许多对评估功能有用的电路板配置。希望这些配置也可以很好地实现长期目标。

如果以前没有想到并尝试过,我会感到惊讶。有吗 它是如何工作的?


1
您可以尝试“ 协作扩散”。它通过将值扩散到网格中来工作,敌人然后爬上网格。它至少适用于寻路。如果您分配了更多的值(分别?)和更复杂的爬坡(根据多个值选择下一步)...
2011年

Alpha-Beta Prunning呢?它是min-max的更好版本。
2011年

我认为Alpha-Beta Prunning是一种最小-最大。
荷兰Joh

是的。但是它应该更快。不知道是否对您有帮助...
user712092 2011年

我有点放弃了这个主意。我倾向于使用“松散”的脚本化AI,在其中使用约束而不是关于如何对不同事件做出反应的特定说明。我希望GA或其他一些优化算法可以提供不错的智能行为。
约翰(Joh)

Answers:


5

这取决于游戏的机制。游戏树的最小-最大可能总体上不适用,但可能适用于某些领域。通常,地图上的某些位置在战略上很重要。最小-最大可在策略级别上应用,以控制哪些位置。在战术层面上,对于每个战略位置周围的x平方,可使用min-max来决定单位如何部署以捕获和防御它。


9

这不是minimax算法,但是负责Killzone AI的家伙基于位置评估功能发布了一篇论文,一些国际象棋AI也使用了该功能。

这很简单,因为它要做的就是根据代理程序的当前知识在董事会中选择职位。因此,如果特工的健康状况较差,则距离其敌人较远的位置将获得较高的分数,因为更希望超出敌人的范围。

该论文可在AI Game Programming Wisdom 3中找到,标题为“动态战术位置评估”。

可以在此处在线找到该论文的草案:http :
//www.cgf-ai.com/docs/straatman_remco_killzone_ai.pdf

希望能有所帮助。


2

我认为这不够好。在某些复杂的事情中,几乎不可能选择特定的N配置,多少个配置和哪个配置。请记住,如果您的游戏具有无限的资源或类似的功能,那么在游戏方式上可能会有一些圈子,这使得利用这种AI相对容易。


2

我建议至少使用alpha-beta修剪实现min-max。

如果不尝试并确定它是不切实际的(即糟糕的性能),并且没有更多的游戏机制背景知识,我不明白为什么您认为min-max不适用。

电路板的尺寸可能是一个问题,但是通过修剪,丢弃丢失的路径可以以相同的计算量进行更深入的搜索,因此修剪时也许更大的电路板面积不会成为问题吗?另外,假设板子本身就是一个问题,可能还为时过早,与其说板子的大小不如说是机械的复杂性以及每个板子位置可以移动多少次,不如说是板子的大小。如果您的游戏区域很大但人烟稀少,那么从每个棋盘状态可以移动的次数可能与棋盘的大小足以容纳所有棋子的位置相差无几。当然,如果您的一块巨大的木板已满90%,并且每转弯时所有东西都可以移动到任何地方,那将需要进行大量搜索。

我也不确定为什么同时运动本质上是个问题。只要您从一种不显眼的板状态转换为另一种状态,并且具有评估功能,就应该应用该算法。

我假设您仍然需要评估功能,无论您使用什么搜索,评估功能都是大部分工作的去向。带有修剪的min-max算法本身非常容易实现,您可能在一两个小时内就可以完成,而基础结构的许多工作(如板状态存储,评估,生成动作)可能会相同,无论搜索您确定。


关于同时运动:我最初没有看到如何将最小-最大(通常使用基于回合的游戏(如国际象棋)进行解释)转换为同时运动的情况。我想我已经开始了解如何做到这一点,但这并不简单。
荷兰Joh

在我的帖子中,我已经为您同时运动的问题提供了解决方案(标题为“每个位置可能的运动”)。您可以通过在每次迭代中仅执行一次移动并结合明确的“现在我结束我的回合”移动来处理此问题,该回合将转弯给予对手。这允许进行中间的alpha-beta修剪以分解这些同时移动的复杂性。
SDwarfs

1

2011年Google AI挑战赛的获胜者使用了最小-最大(深度1)。另一个顶级选手使用随机抽样。这位参赛者提到,最小-最大和随机采样的混合效果很差,这基本上就是我在问题中所描述的。我想这已经解决了。

另一方面,它确实表明在大型游戏中可以使用最小-最大。但是,似乎有必要将其限制在较小的蚂蚁群中,而与所有蚂蚁一起工作可能太慢了。另一个有趣的发现是深度为1就足够了。我们(人类)已经非常擅长下棋,而这款游戏的AI需要更深的搜索树才能具有挑战性。新的更复杂的游戏已经玩了很长时间了,而且沉闷的AI可能具有足够的娱乐价值。


1

国际象棋AI的基本思想是从当前估计的最佳动作中列出所有可能的动作,然后对其进行评分并重复该过程。它将那些机会很少的人丢弃,因为他们将不会被接受(或者可以被假定为不会被接受,因为它们似乎没有提供优势)。

基本思想要求您列出所有可能的动作,并对所有这些动作重复该过程,等等。在国际象棋中这是可能的(在此,可能的下一动作列表实际上是可枚举的;开始的国际象棋棋盘有20种可能的动作),并达到其他目的,例如步步高,跳棋和解决魔方。

如果我以一个简单的基于回合的游戏(文明2)为例,你们每个人都可以在一个回合中移动到总共8个正方形(或24个)。如果您有10个人(这不是很多,通常在开始变得有点有趣之前,您就会有更多),从当前状态(因此是一个级别)的可能“移动”总数已经是8 ^ 10或大约40亿。即使您修剪了其中的99.99%,您仍然无法深入到树上,因为可能的动作数量会迅速爆炸。

再加上游戏有点像魔方问题,您只能在移动约10或12步后才能看到进度,该问题激增到标准的最小/最大优势仅在内存容量为比普通计算机所拥有的更多。

换句话说,它将发现的策略将是可重复的,但效果不好。

对于实际的问题,如何制作一个像样的AI,我会朝着基本控制的随机运动(每个人都具有一点基本的智力),评估和调整的方向发展。并行执行100或1000个不同的操作,然后选择最终最好的一个。您可以将由此产生的结果反馈到原始的智能转向中,以再次对其进行调整。有点像蒙特卡罗模拟。


0

要成功地将最小/最大应用于回合制策略游戏,您需要正确地应用所有可用的国际象棋技巧...

评估功能

如果您的评估功能很差,即使象棋引擎的实力也很差。评估函数的最简单版本是:1 =白色赢得比赛,-1 =黑色赢得比赛,0 =所有其他情况;但是,这会给您带来非常糟糕的性能。回合制游戏也会发生同样的情况!如果要像象棋一样使用最小/最大(带有alpha / beta修剪和东西),则还必须实现合理的评估功能!否则,您无法将这些算法应用于策略游戏时的性能与应用于国际象棋的情况进行比较。

国际象棋引擎的评估功能的作用是评估以下内容:

  • 一块在板上的位置有多好?
  • 一块被攻击了多少次?
  • 一块被保护了多少次?
  • 每块棋子在板上自由移动的程度如何?(或:“控制”多少个图块)

评估功能的那些部分必须首先“翻译”到您的游戏中:

  • 棋子位置:是在例如山上,正在扩大射击范围吗?
  • 被攻击:每件危险多少?(例如,能够攻击一个特殊单位的单位的攻击值总和乘以该单位可能被攻击的概率;如果该单位已经被损坏,则概率增加;如果其他许多单位在攻击单位的范围内,则概率降低)
  • 自己的攻击:每个单位可以攻击多少个单位?
  • 保护:旁​​边有几块自己的零件(有帮助)?也许一个单位可能不会在最短距离内攻击单位,因此最好使用可能攻击附近单位的单位来保护它。
  • 流动性:您单位的流动性如何?(会逃走吗?)

对于所有单位,必须通过加权函数(factor_a * rating_a + factor_b * ranting_b + ...)对不同的评分进行汇总...

在策略游戏中,还必须考虑剩余的资源(黄金,木材等)。

如果您的评估功能足够好,则在大多数情况下,您无需真正搜索“深入”到树中。因此,您可能只需要仔细查看3个或10个最有前途的选择。请参阅下一章...

每个位置可能的移动

在策略游戏中使用最小/最大问题最大的问题是,您可以在一回合中指挥多个单位,而在国际象棋中,您只能指挥一个单位(cast子除外,但这是明确定义的移动组合)。如果您只能在每个单位的“向北,向南,向西,向东移动或停止”之间进行选择,则对于每个“位置”(象棋术语),N个单位会导致5 ^ N个可能的移动。您可以通过将复杂的命令分解为低级命令来解决此问题:例如,选择单位A的动作,深入并确定单位B ....确定单位N ...,然后结束本回合。但是,仅此一项并不会改变复杂性!您必须优化将动作分配给单元的顺序(例如,首先是单元B,C,D,然后是单元A)。您可以记录上一次计算期间每个单位决策的影响,然后按重要性排序。这样,可以使用alpha-beta修剪来尽早消除搜索树中的任何不良组合。在每次迭代中,最高优先级始终应为“不执行任何操作并结束转弯”(空移动修剪)。这样,您可以“跳过”将大多数任务分配给大多数单位,并让它们继续之前的工作。这样,只需查看“关键”部队(例如,目前正在战斗中的部队),搜索就会迅速深入。确保仅对每个单元执行一次命令...您还可以使用一些随机性来确保“重要”单元也时不时地获得命令。特别是,单位完成某些工作(例如

迭代加深+缓存/哈希表

然后,您可以“交互式加深”以越来越深入,直到达到某个时间限制。因此,如果单元数较少,您将进行更深入的搜索,如果您停止寻找更好的解决方案,则总是会有一些“结果”。迭代加深将需要使用哈希表来缓存以前的搜索结果。这也使得能够重用上一回合搜索(搜索树的分支,其中覆盖了上一回合实际执行的命令)中的某些结果。要实现此功能,您需要一个非常好的哈希函数(请看一下“ zobrist密钥”),该函数可以迭代更新。更新哈希键意味着您可以仅使用旧“位置”的哈希键,也可以插入位置变化(例如 取下x位置的单元,并将其放在y位置)。这种计算哈希键的方法非常快捷,您无需处理整个局面情况就可以计算出来,仅需检查哈希值是否包含该位置的先前条目即可。在某种程度上,您必须确保不会发生哈希冲突。

非确定性行为

对于最小/最大搜索,不确定行为是一个问题。这意味着,不确定是否会击中被攻击的目标(例如,概率为10%)。然后,您不能仅仅计划这种情况。在这种情况下,您需要修改算法,并在两者之间放置一个“概率”层。有点像“概率翻了”。每个独立的结果必须分别考虑。然后必须对通过该深度“层”的评估进行采样(蒙特卡洛采样),并且必须根据发生的可能性对深度评估的结果进行加权。必须将概率层的不同结果视为不同的对手移动(但必须计算“平均值”而不是最小/最大)。当然,这将增加搜索树的复杂性。

摘要

将所有这些技术(当前的象棋引擎都使用了所有这些技术)应用于确定性游戏时,您当然也将能够获得合理的游戏结果。对于非确定性游戏,这可能会更复杂,但我认为仍然可以解决。

http://chessprogramming.wikispaces.com/是一个很好的解释这些技术的资源(用于国际象棋)。

您甚至可以在最小/最大搜索中实现某种定向随机性。您可以将其随机化并让其顺序由基于当前评估的概率分布来确定,而不必在每次迭代中先确定性地研究最佳结果...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.