我阅读了有关“ NP完整问题列表 ”的Wikipedia条目,发现像超级马里奥,口袋妖怪,俄罗斯方块或Candy Crush Saga这样的游戏都是NP完整的。我怎么能想象一个游戏的NP完全性?答案不必太精确。我只想概述一下游戏可以完成np。
我阅读了有关“ NP完整问题列表 ”的Wikipedia条目,发现像超级马里奥,口袋妖怪,俄罗斯方块或Candy Crush Saga这样的游戏都是NP完整的。我怎么能想象一个游戏的NP完全性?答案不必太精确。我只想概述一下游戏可以完成np。
Answers:
这仅表示您可以在编码NP-Hard问题的游戏中创建关卡或谜题。您可以处理图形着色问题,创建关联的超级马里奥兄弟关卡,并且当且仅当图形为3色时,该关卡才是可打的。
如果您想了解将NP-完全问题转化为游戏的特定方式,我建议您阅读“经典的Nintendo游戏是(计算上)困难”的文章。它写得很好并且易于遵循。
要记住的一个重要警告是,NP硬度要求以“显而易见的”方式来概括游戏。例如,俄罗斯方块通常具有固定大小的棋盘,但是为了保证硬度,游戏需要允许任意大的棋盘。另一个例子是《超级马里奥兄弟》中的屏幕外敌人:证明是游戏变种的一种形式,其中屏幕外敌人就像在屏幕上一样继续移动,而不是停止存在并在马里奥回来时重置到起始位置。
这是一个简单的挥手解释:
由于玩家的行为具有很强的表现力,因此此类游戏很难NP。尽管在任何给定的点上,玩家可能只能执行有限甚至固定数量的可能动作,但这足以在游戏过程中创造出指数级的行为或策略空间。尽管您可以在本地提供有关玩家行为的有效性/正确性/正确性的简单条件或逻辑公式,但从总体上看,您可以获得与大型组合电路或k-CNF公式相似的效果。
希望这有一定的直觉意义,也可以打响足够的CS理论。
PS-有些游戏比(计算上)复杂得多。例如,棋盘游戏Hex,Go和Reversi是PSPACE完整的。这主要是因为您需要为获胜策略满足的公式是一个反复交替的量化公式:玩家1存在一个动作,因此玩家2的每个动作都存在玩家1的动作,依此类推。这样,在播放完所有这些动作后,玩家2的某些动作无效或我们有一个有效的序列,玩家1赢得了比赛。对于NP游戏,通常只是一个玩家的行为/策略/举动选择。
对于单人游戏,您总是可以问“玩家是否有制胜法则”的问题,并且该问题通常有一个“是”答案,可以在多项式时间内得到验证,并且很可能是NP完整的。
对于两人游戏,答案常常无法在多项式时间内得到验证,因为要验证A的举动是获胜的举动,您必须证明对于B的每个响应,A都会再次获胜。以此类推。
好吧,这肯定是在NP中,因为可能的解决方案是有限数量的输入(在每个输入框中,您可以选择k个按钮中的任何一个,我们用字母表示每个框架中按钮的每个选择),这使您可以赢得屏幕。我们知道该游戏以前曾被击败过,因此我们知道存在解决方案。NTM越过磁带,神奇地猜出了长度为n的正确证书。然后,它使用输入模拟“超级马里奥”并进行验证。验证可以在多项式时间内完成(实际上是线性时间,如果解法正确,则将需要n帧才能获胜)。
为了显示NP完整性,我们可以通过使用电平生成器构建3-Sat检查器(通过任意代码执行https://www.youtube.com/watch?v=IOsvuEA2h4w来构建)来将3-SAT简化为它。
因此,我们有一个3-SAT CNF输入,首先要检查格式是否正确。如果格式不正确,我们只需将其转换为一个“跳跃”输入(不可能通过跳动在一帧内击败超级马里奥)。
我们称3-CNF输入的长度为n。
如果格式正确,我们会将其转换为多个输入,从而为我们构建3-CNF检查器(始终使用相同的长度k的代码),将3-CNF转换为输入字符串,从而构建特定的3-检查程序中的CNF(在O(n)中),并通过蛮力检查所有可能的解决方案。如果经过所有解决方案后仍未找到,它将闲置并且不执行任何操作。它重新启动游戏,并使用Super Mario的已知解决方案击败游戏(执行该操作的代码的长度为j)。因此,我们的变换在O(n)中,所以它在多项式时间内。
如果CNF格式不正确,我们就不会赢(按照定义,如果我们在执行完一帧之后还没有赢一帧,我们的输入就不会赢)。如果CNF不能令人满意,我们就不会赢(您不能通过在关卡生成器中空闲一帧来赢,我们会在代码中确保做到这一点)。如果CNF令人满意,检查人员会发现解决方案重新启动并赢得了比赛。因此,完成了将3-Sat简化为Super Mario的多项式约简,并且我们证明了Super Mario是NP完全的。
(希望我没有在某个地方搞砸。如果3-CNF太长,我们确实会遇到存储问题,但我相信在这些情况下通常会忽略有限的存储)
我改写了这个答案,以尝试解决先前版本的一些评论。
我认为您已经阅读了NP完整性的Wikipedia定义,该定义实际上并不专注于游戏。我将简单介绍一下NP完全性和博弈论的确切含义,并解释NP完全博弈的本质。
让我们考虑一个具有交替动作的2人游戏,更严格地说,这本质上是关于组合游戏。基本上来说,您可以做出一些动作的游戏,您必须选择其中之一。您想“完美地”玩游戏,这意味着您永远不会做出“糟糕”的举动。因此,您要选择最佳的动作。(当然,您的对手有相同的目标...)
请注意,完美发挥并不意味着您将永远获胜。游戏规则可以是第一个或第二个玩家应获胜。另外,像井字游戏这样的游戏也应该以平局结束。因此,“完美比赛”在此讨论中的意思是:
(1)您永远不会处于获胜位置,然后因为做出了“不良”举动而输掉比赛
(2)您将永远不会错过获得成功的机会如果有这样的机会出现,则进入获胜位置。
给定游戏的当前状态,您想要的是能够使用“高效算法”来计算最佳移动。另一方面,让我们注意,必须在整个游戏树中进行搜索的算法是“低效算法”。
现在重要的一点是,不可能有一个有效的算法,即多项式时间,这种算法对于NP完全的游戏是完美的。根据定义,要完美地发挥NP完全问题,必须使用在多项式时间内运行的低效率算法来解决。
请注意,运行时间大约是计算的固有数量,而不是人类感知的响应时间。对于像井字游戏这样的小型游戏,计算机可以玩所有可能的未来动作,并且仍然可以像人类所感知的那样迅速做出响应。
对于Nim,可以创建多项式时间算法。在游戏的任何时候,算法都可以计算出哪个玩家拥有获胜的举动以及该举动应该是什么。
另一方面,让我们来看看Qubic的游戏。(您试图在3D网格中形成4条线。因此,它实际上是在4x4x4网格上的井字游戏。)Qubic是NP完全的,因此没有多项式时间算法可以计算出下一个完美的移动。知道您当前是否有获胜举动的唯一方法是尝试两个玩家的所有可能举动,以验证特定举动是赢家,或者至少不是输家。
确实,Qubic的整个游戏树都足够小,因此可以将其编码为可以完美播放的计算机程序。编码的意思是已经对整个游戏树进行了探索,并预先制定了所有动作。因此,该程序实质上可以使用当前板状态进行快速数据库调用,并获取该板状态的最佳移动,而无需每次进行移动时都进行树搜索。对于我们这里的目的来说,这确实是一个“骗子”。
现在让我们讨论国际象棋,以讨论评估功能,而忽略国际象棋游戏程序的其他一些功能。国际象棋仍然是一个尚未解决的游戏。不清楚第一个还是第二个玩家应该赢。不可能获得任何董事会职位并无法确定谁将获胜。实际上,国际象棋具有很大的游戏树,以至于不可能搜索整个游戏树。您需要的计算机不仅要比当前任何计算机快10或100倍,还要快数十亿亿美元。(希望量子计算能够突破这一高地结。)
将象棋评估功能想像成是给每个可能的下一个动作提供最佳动作的可能性。国际象棋程序的作用是将前瞻性与评估功能相结合。因此,程序会检查所有可能的未来动作,直到达到可以为董事会职位给予“良好”分数的程度。计算机以此方式评估通过树的所有可能路径,然后选择得分最高的路径。由于对于所有被评估的路径,搜索都没有到尽头,因此所有国际象棋程序最终都使用了不完善的评估功能。(如果您快要结束了,那么计算机可能可以查看所有将来的移动。)这意味着即使程序在某个时候处于获胜位置,也有可能击败该程序。