繁体   English   中英

用于“RaceTrack”游戏的AI算法

AI algorithm for “RaceTrack” game

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

有没有人知道(或可以建议)为RaceTrack铅笔纸游戏的AI算法?

因为你在每个步骤中有9个可能的选择,并且你需要至少看6-10步才能确定一个好的策略,即使你因为与边界相交而排除了一些选择,暴力也会变得非常昂贵。

目前我正在尝试为每个选择分配一些质量值,以决定排除哪些选择 - 但我还不知道如何分配这样的质量值的良好规则。

8 个回复

我已经制作了一个C ++求解器,它有点太长(187行)以适应这里,所以我把它放在pastebin中: http//pastebin.com/3G4dfTjR 程序要么计算最佳(最小可能的移动次数)解决方案,要么报告不可能。

用法

将程序作为racetrack startX startY goalX goalY [circleX circleY radius]运行

该程序采用100x100网格,可选择包含一个圆形障碍物,其中心和半径指定。 您还必须另外指定汽车的初始位置和单个目标位置。 虽然这些约束在某种程度上是限制性的,但是看一下代码应该很明显它们一般不限制算法 - 所有相关的逻辑都封装在isMoveValid()isGoalState()例程中,所以如果有人可以为实现这些例程的更一般版本而烦恼(例如,允许用户指定网格位置的位图,和/或允许多个目标位置),这可以毫无困难地结合。

唯一的轻微复杂因素是让目标位置与起始位置相同(或接近,但在“另一侧”),如果您希望您的轨道成为电路,则需要这个位置。 在这种情况下,为了避免解算器简单地转动汽车或立即停车,您需要指定一个不可见的“起始线”,并改变isMoveValid()以禁止穿过该线的“向后”移动。

这个怎么运作

因为每次移动的成本恰好为1,所以可以使用广度优先搜索 4D状态空间来找到最佳解决方案。 每当我们访问一个给定的状态s,其中包含一个4元组(x,y,dx,dy),其中dx和dy是我们用来得到(x,y)的速度向量,我们认为我们所有的9个状态都是可以通过一次移动从s到达。 对于尚未看到的任何此类状态t,保证t(即通过s)的这条路径是最佳的,因为BFS总是按照它们与根的最小距离的顺序访问节点。 每当我们确定状态的最佳路径时,我们就会记录前趋状态,从而在最后生成完整路径的回溯。

BFS比Dijkstra的算法或A *搜索更简单,因此可能更快,这是更通用的算法,允许移动具有各种成本 - 这里我们不需要灵活性。 如果混淆启发式的障碍很少,A *可能会更快,但在每一步都需要查找最小成本节点,这通常使用堆来完成,而对于BFS,最小成本节点始终可用于队列的前面。

例子

秒表跑道30 3 90 10

Starting at (30, 3).
Goal is (90, 10).
Grid size is 100*100 (W*H).
No obstacle.
11-step solution:
(90, 10) (dx=10, dy=4)
(80, 6) (dx=9, dy=3)
(71, 3) (dx=8, dy=2)
(63, 1) (dx=7, dy=1)
(56, 0) (dx=6, dy=0)
(50, 0) (dx=5, dy=0)
(45, 0) (dx=5, dy=0)
(40, 0) (dx=4, dy=0)
(36, 0) (dx=3, dy=-1)
(33, 1) (dx=2, dy=-1)
(31, 2) (dx=1, dy=-1)
(30, 3) (dx=0, dy=0)
128113 states were examined in the process.
stopwatch: Terminated. Elapsed time: 343ms
stopwatch: Process completed with exit code 0.

秒表赛道30 3 90 10 50 20 25

Starting at (30, 3).
Goal is (90, 10).
Grid size is 100*100 (W*H).
A circular obstacle of radius 25 is centred at (50, 20).
22-step solution:
(90, 10) (dx=5, dy=-8)
(85, 18) (dx=5, dy=-7)
(80, 25) (dx=4, dy=-6)
(76, 31) (dx=4, dy=-5)
(72, 36) (dx=5, dy=-4)
(67, 40) (dx=6, dy=-3)
(61, 43) (dx=7, dy=-2)
(54, 45) (dx=8, dy=-1)
(46, 46) (dx=7, dy=0)
(39, 46) (dx=6, dy=1)
(33, 45) (dx=5, dy=2)
(28, 43) (dx=4, dy=3)
(24, 40) (dx=3, dy=4)
(21, 36) (dx=2, dy=5)
(19, 31) (dx=1, dy=6)
(18, 25) (dx=0, dy=6)
(18, 19) (dx=-1, dy=5)
(19, 14) (dx=-2, dy=4)
(21, 10) (dx=-3, dy=3)
(24, 7) (dx=-3, dy=2)
(27, 5) (dx=-2, dy=1)
(29, 4) (dx=-1, dy=1)
(30, 3) (dx=0, dy=0)
949565 states were examined in the process.
stopwatch: Terminated. Elapsed time: 3076ms
stopwatch: Process completed with exit code 0.

请注意,这里的最佳解决方案首先必须“双后退”,然后向上和向下再向下,因为圆形障碍物一直延伸到网格的底部。

小错误:如果您将目标位置设置为等于初始位置,则发布的代码将给出一个简短(但非零长度!)的答案。 显然这可以作为特殊情况进行检查,但是当我意识到这一点时,我已经把代码放在了pastebin上...... :)

其他人推荐A *,这可能是要走的路,但这种方法存在问题。 我首先要说的是,从一个节点到另一个节点的“成本”始终为1,因为您希望最小化步骤数,因此不需要其他成本。

但我想说的重点是位置(x,y)不是A *搜索图中的唯一节点! 节点的特征是x和y,但也可以通过汽车来自的节点的x和y坐标(或者如果你愿意,通过速度分量vx和vy)。 所以你不能只通过二维网格遍历A *算法; 它实际上应该是4维的。 也就是说,A *可能还有很长的路要走。

至于启发式,你可以对这一点有所了解,但我建议使用距离完成减去当前速度,其中为常规2D网格中的每个点预先计算距离(使用Dijkstra算法)。 这使得A *算法首先朝向终点线搜索并且优选地尽可能快地搜索。 我相信这样的算法可以很好地立即计算整个路线。

然而,一个问题是A *总是会产生最佳路线,因此使用这种算法的AI对于玩游戏并不会很有趣,因为它总是会赢(假设起始位置是公平的)。

到目前为止,我认为没有人提出过你问题的关键点:你如何提出一个好的“质量价值”? 在AI中,您所指的质量值通常称为“启发式”。 理想情况下,根据当前位置/速度,您的启发式操作会准确地告诉您到达终点所需的最小移动次数。 实际上,我们必须满足于更容易计算的东西。

一个重要的指导原则是良好的启发式应该是可以接受的 ; 也就是说,它永远不应该高估达到目标的成本(在你的情况下,达到目标的动作数量)。 A *算法取决于具有可接受的启发式算法。

提出可接受的启发式的常用技术是放松原始问题。 在游戏中,您通常可以通过更改游戏来实现此目的,以便更容易(例如,通过删除规则)。 例如,在RaceTrack中,您可以理顺赛道以使其更轻松。 通过直线轨道,最好的策略显然是不断加速。 因此,可接受的启发式算法是计算从当前位置到结束的距离(即,拉直轨道的长度),然后计算在假定恒定加速度的情况下行进该距离所需的移动次数。

您可以通过放宽不同的规则来提出其他启发式方法,但通常需要在启发式的准确性和所需的计算量之间进行权衡。

虽然它不会立即适用于RaceTrack,但您可以从A *路径查找算法中学到一些东西。 它被用在很多游戏中,以帮助AI弄清楚如何尽快从A点到B点。

你提到“为每个选择分配一些质量值”的想法 - 这被称为启发式功能。 许多AI算法(例如A *和alpha-beta修剪,由其他人提及)仅与您插入其中的启发式函数一样好。

但是,如果您确实设法创建了一个良好的启发式功能,那么这些算法将自动“免费”执行得更好 - 因此,花一些时间来开发一个好的算法非常值得。

另一个角度是尝试从一开始就预先计算你的整个种族。 然后,这是一个跨越终点线最小化转弯数的问题。 一种方便的最小发现算法是模拟退火

除此之外,看到像这样的游戏的一些遗传算法解决方案也很酷。 不确定它是否合适,但我可以想象创造一个需要各种输入的“大脑” - 未来几圈的预期距离,速度,与其他赛车的距离等等 - 并且演变出来的逻辑大脑用遗传算法。 诀窍是将问题分解为可以有意义地变异的部分。

实际上,你甚至可以将它们结合起来,并使用遗传算法。 开发一种插入标准AI搜索算法的启发式函数。

老实说,暴力可能会在受限制的轨道上正常工作,因为如果你崩溃你可以抛出一个子树(并且崩溃对于坏路径很常见)。

我建议你从扭转问题开始。 使用逆行分析(就像他们在国际象棋博弈http://en.wikipedia.org/wiki/Retrograde_analysis中所做的那样)从头到尾计算,假设你是唯一的玩家,看看越过终点线需要多少步,给定一个位置和速度。 如果我的想法是正确的,那么计算它的时间应该是位置数量的线性。 应该很快。

这不是绝对的事实,因为你有竞争对手打扰你的路径,但它会为你的搜索算法提供一个非常好的启发式。

国际象棋中有一些算法,如alpha-beta修剪,移动排序等等。如果你在国际象棋语境中搜索,也许你有更好的运气。


alpha beta策略


编辑 :这些路径查找算法仅在您没有其他规则和条件时才有效。 例如,如果你也有速度和向心力,那你运气不好。 如果您没有这些先进条件,那么您可以使用其他答案中所述的简单路径查找算法。

1 飞行游戏AI算法?

问候所有, 我正处于我的一个爱好项目的设计阶段。我将开发一款3D空战游戏。 (受HAWX启发)。 但我想知道AI如何为敌人的工艺品工作? 我猜,他们不像FPS游戏那样沿着路径(在图表上寻找路径)移动。 我可以使用什么样的算法来进行敌人的工艺运动? 我可以使用任何AI库吗? ...

2 最佳游戏AI算法

我正在寻找将神经网络和Q学习结合在一起的游戏AI算法。 它不会保存任何可能的状态,而是使用所学的内容。 如果做某件事好,您可以给他奖励,但是如果发生坏事,您也可以给他负面奖励。 如果可以的话,请给我最好的学习资源。 如果可以用Python编写,那会很好。 非常感谢。 ...

3 可以测试AI算法的游戏

我正在寻找一款可以测试各种人工智能,强化学习和机器学习算法的游戏。 如果将有足够的文档甚至有用的框架来编写AI,那就太好了。 我知道TORCS,但您知道其他游戏吗? 用哪种语言写都没关系。 它可以是任何街机游戏,模拟器,FPS等。 ...

4 AI算法设计:纸牌游戏

目前我正在开发一款名为Briscas或Briscola的西班牙纸牌游戏, http://en.wikipedia.org/wiki/Briscola 简而言之,这是一个纸牌游戏,其中两队2名球员相互比赛(他们看不到彼此的手牌,甚至不能看到队员),只有在开始牌时洗牌,然后将三张牌交给每个玩家 ...

5 我的适用于python checkers游戏的AI算法是否可以正常工作,如果不能,我应该考虑其他哪些算法?

首先,我不是数据科学家或统计学家,所以我一直在尝试找出对一组给定的AI移动进行评分的最佳方法,以帮助计算机确定选择哪种移动路径。 我想出了以下几点,并询问是否有更好的方法可以做到这一点,或者它是否一开始就可以工作。 对于任何给定的玩家: 正常移动+0 捕获普通棋+1 占领王+2 ...

6 使用Minimax算法的NIM游戏和AI玩家 - AI会失去动作

我已经完成了与人类玩家和AI玩家一起编写NIM游戏的任务。 该游戏是“Misere”(最后一个必须选择一根棒)。 人工智能应该是使用Minimax算法,但它正在进行移动,使其失去更快,我无法弄清楚原因。 我好几天都已经走到了尽头。 Minimax算法的目的是不输,如果它处于失败位置,延迟 ...

7 游戏AI算法,敌人跟随玩家

我正在使用LigGdx制作游戏,它看起来像一个RPG游戏。 当敌人处于警戒状态时,它必须跟随玩家,但它只能向前,向后,向左和向右移动,并且还必须在碰撞时转移物体,寻找到达玩家的最佳方式,我是关于游戏开发的新手,我的算法可能完全错了,所以,我真的需要帮助...... 我接受建议,我可以改 ...

8 哪些AI算法可用于播放可能带有不完整信息的概率游戏?

最小极大值算法和蒙特卡洛树搜索(MCTS)可用于实现具有确定性(即非概率性)游戏(如国际象棋或井字游戏)的代理,这些代理具有完整的游戏信息。 是否存在适用于信息不完整的游戏和/或具有概率成分(例如,扑克或过桥)的游戏的通用方法? ...

10 Pente游戏应使用哪种AI算法?

我们在学校这里度过了一次黑客马拉松周,我们面临的挑战是建立一个连接到服务器并与其他AI对抗的Pente客户端AI。 ( 彭特-维基百科 ) 我们唯一的AI课程是关于Prologue语言的,就选择AI算法而言,我们有些迷茫。 显然,我们不想只应用一堆if语句并需要一些相当自适应的东西,因 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM