经典证明:星际争霸是NP-hard的

    今天看到这里给出了一个“星际争霸是 NP-hard 问题”的一个证明。具体地说,给定一个初始布局(包括地图、双方已有资源、双方已有建筑、双方已有兵力),判断其中一方是否能获胜,这个问题是 NP-hard 的。当然,考虑到即时战略游戏的复杂性,这个结论并不出人意料;真正有趣的,则是如何巧妙地利用游戏中的元素,构造出极其精巧的初始局面,从而转化成某个已知的 NP-complete 问题。下面是原文中给出的证明。这个证明有没有什么漏洞?你还能想到哪些别的证明方法?欢迎在下面留言一同分享。


    假设初始时有 A 、 B 两位玩家,他们分别位于两个孤岛上。玩家 B 有非常多的地面兵力,但没有空中单位,并且已有资源为 0 ,而且还没有任何经济来源。他只能坐等玩家 A 来攻打他。玩家 A 一开始则完全没有兵力,但他有不少可以生产作战单位的建筑,也有一定的经济来源,理论上有获胜的希望。地图上还有第三个孤岛,孤岛周边放满 B 的对空防御,玩家 A 即使派遣空中部队也无法进入该孤岛。

    初始时,玩家 A 的资源刚好够造一个农民,玩家 A 还需要收集额外的 x 个单位的资源才足以消灭玩家 B 。但是,玩家 A 的所有可采集资源都在第三个孤岛上。这个孤岛上有 n 个采矿点,每个采矿点都配备有一个基地,以及 x/n 个单位的矿石资源。每个采矿点也都还预先配备了一个农民,只不过这个农民被矿石围在里面出不来了。采矿点与采矿点之间靠一些小路连接,每条路上都有玩家 B 的防御塔,保证一个农民走过去必死无疑,但是两个农民走过去恰好能活一个。

    游戏开始后,玩家 A 唯一获胜的途径便是,在某个采矿点建造一个农民,采完这个采矿点的矿,把被困的农民救出来,然后选择某条小路走到下一个采矿点(途中死掉一个农民),继续采矿并解救农民,以此类推,直到走遍每一个采矿点,采完所有的矿。很容易看到,玩家 A 相当于要解决一个 Hamilton 路的问题(注意,即使平面图的 Hamilton 路问题也是 NP-complete 的)。因此,星际争霸是 NP-hard 的。

55 条评论

  • EixoS

    only l here now?

  • JX

    这只是给定局面下的复杂度啊,显然存在复杂度低得多的局面,但是不知道是否存在更高复杂度的局面……

  • 幻风

    这个地图可以做出来吧。B是人族,A是虫族,只要造出一个守护者就可以灭掉B了。

  • hanyuwei70

    可以过去两个半血农民吗?

  • Pt-Cr

    地核……

  • Pt-Cr

    地幔……
    不是吧…太神奇了…竟然能化归成Hamilton路问题

  • exp618

    我觉得这根本就是不可解问题,因为给定初始条件很可能无法确定谁赢谁输。

  • exp618

    当然,在这个图中自然是NP-Hard的。

  • wuzhengkai

    感觉有点问题,首先就是每个矿点要围住一个农民至少要16点矿吧,这导致了x一定的时候,n不能很大,于是为了任意的n都能给出构造方案需要很大的x,但是当x很大的时候,只需要一个空中单位就能搞掉B,解决方法是A和B的孤岛之间加若干B的防空塔,这样A必须要损失一大堆才能通过,然而由于人族有大和炮,虫族飞龙变的那个专门对地的(名字不记得了)射程都比塔远,而神族的话有装甲,我觉得通过操作应该能无损地推塔,所以x也不能很大。。不过我想出来一个终极解决办法:n很大时由于人口限制,你必须把农民搞死才能造兵,不然一堆资源没人口就囧了。。这样理论上任意大的n都成立。。还望星际高手指导如何不造兵自残农民。。

  • John

    地壳:
    有问题….
    问题保证了你可活动农民的血总量为1管….
    所以你并不能分兵….

  • veryzhang

    回12楼,农民可以对焊的。
    不过考虑到微操,胜负就无法判定了。如果微操忽略,应该还是可以计算的:)

  • zalazan

    给出初始条件判定谁赢肯定是可解问题,因为整张地图每一格的内容,再加上每一个对象的参数等所有条件,总状态还是有限的,因此可以枚举

  • wuzhengkai

    @14
    农民对焊也得找个人过去啊。这样还是要找hamilton路不是?

  • 帮Jedi武士拿剑的

    我有个想法,请参考:

    还是借助汉密尔顿回路问题。

    假设人族虫族单挑,人族只剩一个房子和一个1血枪兵,虫族只剩若干基地和若干lurker,这些基地和lurker分布在地图上很多由桥连接的小岛上。每个桥都很窄,只能枪兵通过,lurker无法穿行。初始状态是,每个岛上都有一个虫族基地和一只lurker,而且这个lurker刚好被虫族基地卡在岛的一角。

    假设当枪兵来到任何一个岛上,都可以攻击虫族基地,且不被lurker攻击。(这容易做到)。而当该基地被打掉后,lurker就可以在该岛自由移动(当然不能出岛),它会在岛正中心埋下,攻击范围辐射整个岛。换句话说,枪兵无法再安全通过这个岛。(当然,在此之前,枪兵还是有时间逃离该岛的)

    从而,人族唯一的取胜可能是,寻找一个汉密尔顿回路,走遍所有岛。

  • allenfire

    似乎只能说明SC可以做出NP-hard的情况,而不能说SC是NP-hard的。
    类似“白马非马”之辩

  • gguy32767

    我想到一个用顶点覆盖的方法, 平面图的顶点覆盖仍是 NPC 的
    问题: 给出一平面图, 是否能选取 k 个顶点覆盖所有的边

    基本思想是每条边转成一玩家 A 的士兵, 每个顶点有一玩家 B 的基地
    玩家 A 只能坐以待毙, 玩家 B 则刚好有生产 k 个军队的资源
    从某个顶点生产的军队只能杀掉与它相邻的边上的士兵

    详细的做法我写了在 http://gagguy.blogspot.com/

    p.s. 文中 “从而转化成某个已知的 NP-complete 问题” 好像应该是 “从某个已知的 NP-complete 问题转化成星际”, 因为要证明 NP-HARD 相当於证明 “如果懂得解决星际的话就懂得解决 平面图 hamiliton path”

  • Peter

    @18 只需证明其存在np-hard复杂度的情况就行了。并不要求所有的问题实例都是np-hard的。
    寻找hamilton通路的问题,也存在复杂度很低的特例不是吗。
    这个证明的缺点是,构造的情况太特殊了。
    人们其实想知道的是,星际游戏的“平均复杂度”。或者说,建立在一个通常比赛环境作为初始环境前提下的复杂度证明。
    但是我认为那个复杂度是不可证的。因为复杂度依赖于算法,而目前还没有一个可以战胜有实力的人类选手的AI算法。没有算法哪来复杂度。
    至于说目前游戏采取的算法,那当然是P的。否则计算机怎么执行他。

  • zzz

    A是人类只剩个红血基地和一个兵,B还有些建筑分布在各地,A要在基地燃烧完全之前消灭完B所有建筑,那就是个Open TSP问题。

  • gguy

    我想到一个用顶点覆盖的方法, 平面图的顶点覆盖仍是 NPC 的
    问题: 给出一平面图, 是否能选取 k 个顶点覆盖所有的边

    基本思想是每条边转成一玩家 A 的士兵, 每个顶点有一玩家 B 的基地
    玩家 A 只能坐以待毙, 玩家 B 则刚好有生产 k 个军队的资源
    从某个顶点生产的军队只能杀掉与它相邻的边上的士兵

    详细的做法我写了在 http://gagguy.blogspot.com/

    p.s. 文中 “从而转化成某个已知的 NP-complete 问题” 好像应该是 “从某个已知的 NP-complete 问题转化成星际”, 因为要证明 NP-HARD 相当於证明 “如果懂得解决星际的话就懂得解决 平面图 hamiliton path”

  • 挽魇

    感觉似乎有些问题,仔细看看再说。。。

  • 九歌_东皇

    这个构造略微有点牵强的感觉…………虽然说找不出什么错误……

  • 帮Jedi武士拿剑的

    咋没人检查检查我 17 楼的类似构造啊

  • johnson2723

    @17:不一定吧,要看操作的吧,以前见过用3个枪兵干掉一个lurker。当然,考虑到操作的话,当然会是NP了吧。

  • johnson2723

    考虑到神族的幻象的话,那还有概率的成分

  • Ollie

    @16 农民不需要对焊,这么多对方防御随便找个都能自杀..
    @17 有个小问题,枪兵到一个岛不见得一定要打岛上的基地,这样的话这个岛就可以反复通行了。所以需要设计成没有消灭基地就不能通过这个岛。这个可能就有难度了..

  • 田忌博客

    呵呵,这个有意思了点儿吧,虽然我不太爱玩星际争霸

  • cgy4ever

    首先,如果要用Hamilton Path来证明这个问题是NP-hard,需要对Hamilton Path的所有instance都能构造出来对应的基地摆放。但显然SC是在一个平面上的游戏,基地的摆放总是可平面的。
    所以应当说是用“平面图的Hamilton Path”这个问题来归约(当然,这也是NPC问题)。
    另外,我记得SC里面建筑和单位的数目是有限的吧,好像是最多1024个左右,当然,我们可以定义更一般的“星际争霸”,允许无限大的地图以及单位的数目。

  • windmeup

    听过过可以干掉人类的ai(zvt爆飞龙狂甩),因为电脑的微操作和效率是人类不能及的,而且人类都会失误电脑不会.

  • Firm

    好吧,这也可以,我被你给折服了

  • LYLtim

    OIer + SCer 路过 。。。

  • yeah的第七章

    同样dota也可设计出NP的打野问题

  • yeah的第七章

    同样dota也可设计出NP的打野问题

  • yeah的第七章

    同样dota也可设计出NP的打野问题

  • wuzhengkai

    @27 假设农民被矿包围的话必须派农民过去先把它搞出来才能自杀。。

  • 心肺复苏训练模拟人

    同样dota也可设计出NP的打野问题

  • 台州整形医院

    楼主写得很不错,学习了啊 哈哈..

  • before001

    为什么要走汉密尔顿路呢,每条路都是死一个农民,保证去下一个矿点的时候是2个农民不就行了?

  • tsa密码锁

    星际争霸。我玩了很久了~

  • 你好

    有点意思啊呵呵

  • xkyangel

    弱弱地问一句….:我看懂了怎样证明它是NPC问题的…可是证明了它是NPC问题,为什么最后又可以得到它是一个NP hard问题呢?

  • 正月点灯笼

    回47楼:
    NP hard是证明NP Complete的一个小步骤。
    打个比方吧,要证明第一问题A是NP Complete的话,必须证明:
    1. A∈NP
    2. 所有NP Complete问题都能在P时间内转换成A

    第二步就是关于NP-hard的证明。
    所以,一般来说,NP-hard和NP Complete区别不是很大。是NP-hard的话,很多情况下都是NP-complete(但并不是所有情况下都是这样)。反过来,是NP-complete的话,一定是NP-hard。

  • silverwzw

    @43楼:如果不走汉密尔顿回路,会走到之前采过的矿区,一旦进去就再也无法出来了。
    @47楼:NPC是NP-Hard的子集,所以一定是NP-Hard
    @18楼:只要能够造出一种情况是NPC的,整个问题就是NPC的,哪怕其他情况都是P的

  • 炎羽

    如果这也可以证明的话,那么人的一生不也是可以证明了

  • 水木

    挺好的~

  • 假命题

    有bug啊,怎样解救农民啊?每条路上都有玩家 B 的防御塔,保证一个农民走过去必死无疑,怎样两个农民一起过啊?可以用图来证明吗?不要只是文字啊,看得很吃力啊~

  • 假命题

    有bug啊,怎样解救农民啊?每条路上都有玩家 B 的防御塔,保证一个农民走过去必死无疑,怎样两个农民一起过啊?可以用图来证明吗?不要只是文字啊,看得很吃力啊~~~~

  • welkin1990

    楼上说的矿数和解救农民难度都不是问题,这些可以通过设置地图触发来解决。不错,等考完试就做一张地图出来。

发表评论

  ×  8  =  8