Algorithm 二人博弈的最优策略 2名玩家A和B正在玩一个涉及数字n的游戏 球员A采取第一步&两名球员交替比赛 在每一步中,玩家取数字n,选择一个数字i,使2^i

Algorithm 二人博弈的最优策略 2名玩家A和B正在玩一个涉及数字n的游戏 球员A采取第一步&两名球员交替比赛 在每一步中,玩家取数字n,选择一个数字i,使2^i,algorithm,Algorithm,例如: n = 13 = b1101 仅可能i=1 k = n - 2^i = 11 = b1011 同样,只有i=2是可能的 k = n - 2^i = 7 = b111 因为玩家A不能再移动了,所以玩家B赢了 我已经推导出,在任何步骤中,我们只能选择一个I,这样在n的二进制表示中的相应位置上就有一个0。 例如: 如果n=1010010,那么我只能是{0,2,3,5}。 但是我不能再往前走了。一个minimax算法并没有完全打动我。我将感谢任何帮助。提前感谢假设n不是太大,我们可以使用动

例如:

n = 13 = b1101
仅可能i=1

k = n - 2^i = 11 = b1011
同样,只有i=2是可能的

k = n - 2^i = 7 = b111
因为玩家A不能再移动了,所以玩家B赢了

我已经推导出,在任何步骤中,我们只能选择一个I,这样在n的二进制表示中的相应位置上就有一个0。

例如: 如果n=1010010,那么我只能是{0,2,3,5}。


但是我不能再往前走了。一个minimax算法并没有完全打动我。我将感谢任何帮助。提前感谢

假设n不是太大,我们可以使用动态规划来解决这个问题。 定义一个数组A[1:n],其中A[i]表示玩家i是否会在输入i中获胜。 让我们使用解释:

   A[i] = 1, if A wins on input i,
   A[i] = 0, if A loses on input i.
现在,A可以自下而上计算,如下所示:

A[1] = 0, A[2] = 1.
For j=3:n { 
      Assign A[j] = 1 if there exists a number i such that (A[j-2^i] = 0) AND 
                              (number of 1's in i >=  number of 1's in j)
      Otherwise  Assign A[j] = 0 
}

在我看来,这是一个“尼姆”游戏。你能把规则编辑成一个项目符号列表吗?谢谢你的编辑。它更具可读性。空白也有帮助。(但我似乎还是不明白;-)@wildplasser:你能告诉我问题的哪一部分不是不可理解的,这样我就可以改变它了。我将从铅笔和纸开始。反向工作:1)找到所有获胜的动作(不可能移动)。2) 构建可能导致它们的移动,等等。3)我将从8位开始。4) 如果纸张太小:多买一些纸张。5) 如果你没钱了:问题很难解决。尽管如此,它看起来仍然像一个“nim”游戏。如果n变得太大,比如说10^9阶,自顶向下的方法能代替DP方法吗?如果n的二进制表示中有许多1,自顶向下的方法加上记忆可能比DP快得多。否则,我猜DP会更快。运行一些测试看看哪一个更好会很有趣。