繁体   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()例程中,所以如果有人可以麻烦实现这些例程的更通用版本(例如,允许用户指定网格位置的 bitmap,和/或允许多个目标位置)然后可以毫无困难地合并。

唯一的小麻烦是让目标位置与起始位置相同(或接近,但“在另一侧”),如果您希望您的赛道成为赛道,这就是您所需要的。 在这种情况下,为了避免求解器只是让汽车掉头或立即停止,您需要指定一条不可见的“起始线”,并更改isMoveValid()以禁止在这条线上“向后”移动。

这个怎么运作

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

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.

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

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

其他人推荐A*,可能是go的方式,但是这种方式有问题。 首先让我说,从一个节点到另一个节点的“成本”始终为 1,因为您希望最小化步骤数,根本不涉及其他成本。

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

至于启发式方法,您可以对此非常有创意,但我建议使用诸如完成距离减去当前速度之类的方法,其中为常规 2D 网格中的每个点预先计算距离(为此使用 Dijkstra 算法)。 这使得 A* 算法首先向终点线搜索,并且最好尽可能快。 我相信这样的算法可以很好地立即计算出整个路线。

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

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

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

提出可接受的启发式的常用技术是放松原始问题。 在游戏中,您通常可以通过改变游戏来做到这一点,使其变得更容易(例如通过删除规则)。 例如,在 RaceTrack 中,您可以理顺赛道以使其成为更轻松的游戏。 在直线轨道上,最好的策略显然是不断加速。 因此,一个可接受的启发式方法是计算从当前 position 到终点的距离(即拉直轨道的长度),然后在假设恒定加速度的情况下计算行驶该距离所需的移动次数。

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

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

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

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

另一个角度是尝试从一开始就预先计算你的整个比赛。 然后是最小化越过终点线的转弯次数的问题。 一种方便的求最小值算法是模拟退火

除此之外,看到像这样的游戏的一些遗传算法解决方案也很酷。 不确定它是否非常合适,但我可以想象创建一个接受各种输入的“大脑”——未来几圈与墙壁的预期距离、速度、与其他赛车手的距离等——并发展其逻辑大脑与遗传算法。 诀窍是将问题分解成可以有意义地变异的部分。

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

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

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

这不是绝对的真理,因为你有竞争对手干扰你的路径,但它会给你一个很好的启发式搜索算法。

国际象棋中有一些已知的算法,例如 alpha-beta 修剪、移动排序等。如果您在国际象棋上下文中搜索,也许您的运气会更好。


阿尔法贝塔战略


编辑:这些寻路算法仅在您没有其他规则和条件的情况下才有效。 例如,如果您还具有速度和向心力,那么您就不走运了。 如果您没有这些高级条件,则最好使用其他答案中所述的简单寻路算法。

1 飞行游戏AI算法?

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

2 最佳游戏AI算法

我正在寻找游戏 AI 算法,它将结合神经网络和 Q 学习。 它不会保存任何可能的 state 但会使用它学到的东西。 如果他做了好事,你可以给他奖励,但如果发生坏事,你也可以给他负奖励。 如果可以的话,请给我最好的学习资源。 如果能写成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