【问题标题】:Is this problem np-complete?这个问题是 np-complete 吗?
【发布时间】:2011-03-08 04:44:41
【问题描述】:

假设有一排 x 个装满小饰品(随机数量)的箱子,一目了然(你可以看到每个箱子里有多少小饰品)。现在有两名玩家可以在轮到他们时从任一端选择一个垃圾箱。他们不能放弃转弯。想出一个策略让玩家获得最大数量的小饰品。

x 是偶数。

这是一个 np 完全问题吗?和布尔SAT类似吗?

【问题讨论】:

  • 您真的想制定一个可以与任意对手竞争的策略,还是您想为给定的饰品线创建(玩家一号的移动顺序)玩家二),这样玩家一会得到尽可能多的小饰品?
  • @phimuemue - 基本上如果我是 player1,我需要遵循什么策略才能获胜。给定玩家 2 进行任何类型的移动。尽管他很可能也会发挥自己的优势。我认为您需要枚举所有可能的路径并找到该路径的奖励。而玩家只是继续走这条路。
  • 问一个游戏(在博弈论的意义上,就是这样)是否是 NP 完全的并没有真正的意义。不过,您可以询问特定策略是否是 NP 完全的。
  • 问一个游戏是否NP-Complete也很有意义。这可能意味着:给定游戏状态,您能否在多项式时间内决定第一个玩家是否肯定赢/有平局等,以及应该采取什么行动来最大化您获胜的机会。我相信人们一直在谈论游戏是 NP-Complete。

标签: algorithm np-complete


【解决方案1】:

不,这很容易通过O(x^2) 中的动态编程解决。看问题10here

【讨论】:

    【解决方案2】:

    这是一个很简单的问题,不是NP完全的。 这是算法的简短描述,它是基于动态规划的。

    Can[i] - 存储饰品数量的数组。
    F[i,j] - 如果只有从 i 到 j 的罐子可用,则数组确定什么是最佳移动。 0 表示从左侧取,1 表示从右侧取。
    G[i,j] - 存储移动“善良”的数组。

    for (i=1 to n) F[i,i] = 0
    for (i=1 to n) G[i,i] = Can[i]
    
    for (i=1 to n-1)
       for (j=1 to n-i)
           tmp1 = Can[j] - G[j+1,j+i]
           tmp2 = Can[j+i] - G[j,j+i-1]
           if (tmp1>tmp2)
           {
                 F[j,j+i] = 0;
                 G[j,j+i] = tmp1;
           }
           else
           {
                 F[j,j+1] = 1;
                 G[j,j+i] = tmp2;
           }
    

    很抱歉缺少cmets,但是如果您阅读一些有关动态编程的文章,您将毫无问题地得到它。

    【讨论】:

      【解决方案3】:

      这个问题似乎非常适合 alpha-beta-pruning,因为它很容易为您的点推导出一个下限。假设玩家面对偶数个垃圾箱。然后他可以以一种方式让所有箱子都在偶数位置或全部在奇数位置:

      假设我们有 1 0 1 0 1 0,那么他可以拿左边的 1,而无论对手怎么做,他就一直拿 1。

      因此,一个易于计算的下限是偶数位置上所有 bin 的总和与奇数位置上所有 bin 的总和的最大值。

      对于“奇数”玩家,您可以只取 (length+1)/2 个最小值之和,这不如“偶数”玩家的界限,但也很容易计算。

      我认为有了这些界限,搜索树对于实际应用来说是稀疏的(不过我猜你总能找到这类问题的“病态”反例),所以解决方案应该很快。

      【讨论】:

        【解决方案4】:

        很明显,第一个玩家有一个平局/获胜策略。他所要做的就是检查奇数位置的箱子或偶数位置的箱子的总数是否更大,然后他可以轻松地迫使对手拿起“输”平价的箱子。

        例如:

        2,6,11,4,7,3

        这里奇数位置更好(20 vs 13),所以玩家1应该选择2。然后玩家2必须选择6或3,它们在偶数位置。如果选择 3,玩家 1 应该选择 7,依此类推。实际上,玩家 1 应该始终选择与对手选择的位置相邻的位置,这保证了平局或胜利。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-04
          • 2011-07-18
          • 2011-04-18
          • 1970-01-01
          • 2011-04-20
          • 2011-04-09
          • 2021-03-01
          相关资源
          最近更新 更多