Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 选择最佳矩阵_Algorithm_Matrix_Game Theory_Nim Game - Fatal编程技术网

Algorithm 选择最佳矩阵

Algorithm 选择最佳矩阵,algorithm,matrix,game-theory,nim-game,Algorithm,Matrix,Game Theory,Nim Game,我得到了X个大小为Ni*Mi的矩阵,其中1在马拉卡发布关于斯普拉格-格伦迪定理的答案之前,我试图确定游戏的最佳策略;我将在下面描述它,也许它也可以用来编写解决方案 游戏的结果取决于每个矩形是否以奇数或偶数步数移除。如果移动总数为奇数,则玩家1获胜;如果是偶数,玩家2获胜 让我们看看可能的矩形: 对于除2x2和1x1外的所有普通矩形,首先移除部分矩形的玩家可以决定是否以奇数步将其完全移除,例如,通过一次性或偶数步将其完全移除;用黄色表示的单元格显示第一步,让玩家控制 对于只有1个单元格宽的薄矩形,

我得到了X个大小为Ni*Mi的矩阵,其中1在马拉卡发布关于斯普拉格-格伦迪定理的答案之前,我试图确定游戏的最佳策略;我将在下面描述它,也许它也可以用来编写解决方案

游戏的结果取决于每个矩形是否以奇数或偶数步数移除。如果移动总数为奇数,则玩家1获胜;如果是偶数,玩家2获胜

让我们看看可能的矩形:

对于除2x2和1x1外的所有普通矩形,首先移除部分矩形的玩家可以决定是否以奇数步将其完全移除,例如,通过一次性或偶数步将其完全移除;用黄色表示的单元格显示第一步,让玩家控制

对于只有1个单元格宽的薄矩形,通过移除整个矩形或保留1个单元格,立即做出奇偶决定。对于其他正常矩形,根据其他玩家的动作,决策从1个动作延迟到3个动作

1x1矩形只能在一次移动中移除,即奇数次移动。2x2矩形可以在一次移动中移除,但是玩家不能通过移除部分来强制偶数次移动;另一个玩家总是可以决定奇数或偶数

从图中黄色指示的移动中可以看出,创建对称状态的移动,例如将4x4正方形划分为两个4x1矩形,使创建此状态的人可以控制此矩形的结果。例如,他可以强制此矩形进行偶数次移动,如下所示:

在整个游戏中也是如此:如果一个玩家的移动导致对称情况,例如两个相同的L形和四个3x1矩形,他可以通过镜像来响应另一个玩家的移动,然后当只剩下一个大于1x1的矩形时,他可以选择完全移除它,或者根据剩余的单个单元格的数量是奇数还是偶数,留下一个单元格,然后赢得游戏

因此,策略归结为创造一个对称的局面,而不是给其他玩家创造一个对称局面的机会

注意:可以通过移除3x3、4x3或4x4矩形的中心并创建循环来创建更复杂的对称。然后将其旋转180度,即点镜像,而不是镜像其他玩家的移动

基于这些想法的一些游戏结果:

一个长方形:玩家1获胜。 两个相同的矩形:玩家2获胜。 1x1和薄矩形:玩家1获胜。 1x1和2x2矩形:玩家2获胜。 1x1和更大的矩形:玩家1获胜。 一个2x2和一个薄矩形:玩家1获胜。 2x2和更大的矩形:玩家1获胜。 三个相同的矩形:玩家1获胜。 1x1、2x2和任何其他矩形:玩家1获胜。 偶数个相同的矩形:玩家2获胜。 偶数个相同或任何其他矩形:玩家1获胜。 奇数个相同的矩形:玩家1获胜。 下面是Sprague-Grundy定理的实现,如maraca的回答所述。它将预先计算的雨伞列表用于最大为4x4的矩形

函数外角{ var n=0,nimbers=[[1,2,3,4],[2,1,5,8],[3,5,4,7],[4,8,7,3]; 对于变量i=0;i0?1:2; } document.writePlayer+结果[[3,3],[3,4],[4,4]]+胜利。; document.writePlayer+结果[[1,1]、[2,2]、[3,3]、[4,4]]+胜利 在马拉卡发布他关于斯普拉格-格伦迪定理的答案之前,我正试图确定一个游戏的最佳策略;我将在下面描述它,也许它也可以用来编写解决方案

游戏的结果取决于每个矩形是否以奇数或偶数步数移除。如果移动总数为奇数,则玩家1获胜;如果是偶数,玩家2获胜

让我们看看可能的矩形:

对于除2x2和1x1外的所有普通矩形,首先移除部分矩形的玩家可以决定是否以奇数步将其完全移除,例如,通过一次性或偶数步将其完全移除;用黄色表示的单元格显示第一步,让玩家控制

对于只有1个单元格宽的薄矩形,通过移除整个矩形或保留1个单元格,立即做出奇偶决定。对于其他正常矩形,根据其他玩家的动作,决策从1个动作延迟到3个动作

1x1矩形只能在一次移动中移除,即奇数次移动。2x2矩形可以在一次移动中移除,但是玩家不能通过移除部分来强制偶数次移动;另一个玩家可以选择一个 总是决定奇数或偶数

从图中黄色指示的移动中可以看出,创建对称状态的移动,例如将4x4正方形划分为两个4x1矩形,使创建此状态的人可以控制此矩形的结果。例如,他可以强制此矩形进行偶数次移动,如下所示:

在整个游戏中也是如此:如果一个玩家的移动导致对称情况,例如两个相同的L形和四个3x1矩形,他可以通过镜像来响应另一个玩家的移动,然后当只剩下一个大于1x1的矩形时,他可以选择完全移除它,或者根据剩余的单个单元格的数量是奇数还是偶数,留下一个单元格,然后赢得游戏

因此,策略归结为创造一个对称的局面,而不是给其他玩家创造一个对称局面的机会

注意:可以通过移除3x3、4x3或4x4矩形的中心并创建循环来创建更复杂的对称。然后将其旋转180度,即点镜像,而不是镜像其他玩家的移动

基于这些想法的一些游戏结果:

一个长方形:玩家1获胜。 两个相同的矩形:玩家2获胜。 1x1和薄矩形:玩家1获胜。 1x1和2x2矩形:玩家2获胜。 1x1和更大的矩形:玩家1获胜。 一个2x2和一个薄矩形:玩家1获胜。 2x2和更大的矩形:玩家1获胜。 三个相同的矩形:玩家1获胜。 1x1、2x2和任何其他矩形:玩家1获胜。 偶数个相同的矩形:玩家2获胜。 偶数个相同或任何其他矩形:玩家1获胜。 奇数个相同的矩形:玩家1获胜。 下面是Sprague-Grundy定理的实现,如maraca的回答所述。它将预先计算的雨伞列表用于最大为4x4的矩形

函数外角{ var n=0,nimbers=[[1,2,3,4],[2,1,5,8],[3,5,4,7],[4,8,7,3]; 对于变量i=0;i0?1:2; } document.writePlayer+结果[[3,3],[3,4],[4,4]]+胜利。;
document.writePlayer+结果[[1,1]、[2,2]、[3,3]、[4,4]]+胜利 这个问题是用解决的,它说当你对单个矩阵的灵巧度进行异或运算时,移动的玩家只有在结果为0时才会输,因为任何移动都会使输球的位置变成输球的位置,而另一个玩家可以再次将输球的位置变成输球的位置,依此类推,这是尼姆喜欢游戏的天性

敏捷度是递归计算的,矩阵的敏捷度是mex minimal exclusive=所有可达状态的敏捷度集合中不存在的最小非负整数

所有0都是0,您没有有效的移动,因此将丢失0

恰好一个1是1,因为唯一可到达的位置是0,并且mex0=1

对于两个,我们必须决定它们是否相邻,相邻=mex0,1=2,不相邻=mex1=0。。。等等

例如:

1 0 0 0     1 1 0     1 1
0 0 1 1     0 0 0     1 1
0 0 1 0     0 0 1
0 0 0 0
   =          =        =
   2    xor   3   xor  1   =   0   => player to move loses.
快速实现可能如下所示:

提前计算具有不同对称性的16 10的敏捷度,并将其存储在阵列中

分配结果=0

结果=结果xor nimbers[readRowCount][readColCount]

重复3次。直到读取所有矩阵尺寸

如果有结果!=0则第一名玩家获胜,否则第二名玩家获胜

示例2:敏捷计算

matrix:
1 1
1 1

valid moves:
0 1*  1 0*  1 1*  1 1*  0 0   1 1+  0 0+  1 0+  0 1+
1 1   1 1   0 1   1 0   0 0   0 0   1 1   1 0   0 1
                         =
                         0 by definition

The other matrices can be grouped into 2 groups * and + because of symmetries.

Reachable positions from *:
0 1   0 1   0 0
0 1   1 0   0 1
 =     =     =
             1 = mex(0), because the only reachable position has a nimber of 0
       0 = mex(1), because the only reachable position has a nimber of 1
 2 = mex(0,1), because the reachable positions have nimbers of 0 and 1

==> the nimber for * is mex(0, 1, 2) = 3.

==> we already know now that the nimber of + is 2.

==> the nimber of the given matrix is mex(0, 2, 3) = 1.

这个问题是用解决的,它说当你对单个矩阵的灵巧度进行异或运算时,移动的玩家只有在结果为0时才会输,因为任何移动都会使输球的位置变成输球的位置,而另一个玩家可以再次将输球的位置变成输球的位置,依此类推,这是尼姆喜欢游戏的天性

敏捷度是递归计算的,矩阵的敏捷度是mex minimal exclusive=所有可达状态的敏捷度集合中不存在的最小非负整数

所有0都是0,您没有有效的移动,因此将丢失0

恰好一个1是1,因为唯一可到达的位置是0,并且mex0=1

对于两个,我们必须决定它们是否相邻,相邻=mex0,1=2,不相邻=mex1=0。。。等等

例如:

1 0 0 0     1 1 0     1 1
0 0 1 1     0 0 0     1 1
0 0 1 0     0 0 1
0 0 0 0
   =          =        =
   2    xor   3   xor  1   =   0   => player to move loses.
快速实现可能如下所示:

提前计算具有不同对称性的16 10的敏捷度,并将其存储在阵列中

分配结果=0

结果=结果xor nimbers[readRowCount][readColCount]

重复3次。直到读取所有矩阵尺寸

如果有结果!=0则第一名玩家获胜,否则第二名玩家获胜

示例2:敏捷计算

matrix:
1 1
1 1

valid moves:
0 1*  1 0*  1 1*  1 1*  0 0   1 1+  0 0+  1 0+  0 1+
1 1   1 1   0 1   1 0   0 0   0 0   1 1   1 0   0 1
                         =
                         0 by definition

The other matrices can be grouped into 2 groups * and + because of symmetries.

Reachable positions from *:
0 1   0 1   0 0
0 1   1 0   0 1
 =     =     =
             1 = mex(0), because the only reachable position has a nimber of 0
       0 = mex(1), because the only reachable position has a nimber of 1
 2 = mex(0,1), because the reachable positions have nimbers of 0 and 1

==> the nimber for * is mex(0, 1, 2) = 3.

==> we already know now that the nimber of + is 2.

==> the nimber of the given matrix is mex(0, 2, 3) = 1.

如果第一个玩家可以移除整个矩阵,他或她不会吗

e永远是赢家?作为一个算法,只是一个简单的想法,你不会尝试选择模块2剩下的最小运算吗?因此,您的算法必须找到要删除的矩阵,这样才能再存在两个矩阵才能赢得游戏?@IVlad玩家从其中一个矩阵中选择一个子矩阵并将其删除,因此在一次移动中他只能删除一个子矩阵,因此游戏使用多个矩阵,不是只有一个?@IVlad是的,总X矩阵每个都可以有i*j 1的大小如果第一个玩家可以删除整个矩阵,他或她不会永远是赢家吗?作为一个算法,只是一个简单的想法,你不会尝试选择模块2剩下的最小运算吗?因此,您的算法必须找到要删除的矩阵,这样才能再存在两个矩阵才能赢得游戏?@IVlad玩家从其中一个矩阵中选择一个子矩阵并将其删除,因此在一次移动中他只能删除一个子矩阵,因此游戏使用多个矩阵,不是只有一个吗?@IVlad是的,总X矩阵每个都可以有i*j1的大小,你能用几个实际的例子向不熟悉的人解释一下吗?我不确定这个游戏是否等同于尼姆。下面是一个深入的解释和一些示例。在这个游戏中,玩家2赢得了两个相同的空矩形,而玩家1赢得了一个空3x3加上一个空1x1。我添加了一个示例。我编写了一些简单的javascript来计算敏捷度:1x1=1;2x1=2;3x1=3;4x1=4;2x2=1;3x2=5;4x2=8;3x3=4;4x3=7;4x4=3,带记忆这需要半秒钟。你能用几个实际的例子向新手解释一下吗?我不确定这个游戏是否等同于尼姆。下面是一个深入的解释和一些示例。在这个游戏中,玩家2赢得了两个相同的空矩形,而玩家1赢得了一个空3x3加上一个空1x1。我添加了一个示例。我编写了一些简单的javascript来计算敏捷度:1x1=1;2x1=2;3x1=3;4x1=4;2x2=1;3x2=5;4x2=8;3x3=4;4x3=7;4x4=3加上回忆录,这大约需要半秒钟。哇,你花了很多精力在这个已经升级的项目上。我想知道你是如何制作这些图像的?@maraca我对你答案中的方法很感兴趣,试图对其进行编码总是一种很好的方式来了解某些东西是如何工作的。这些图片只是Photoshop和我手上的太多时间的结合。哇,你花了很多精力在这上面。我想知道你是如何制作这些图像的?@maraca我对你答案中的方法很感兴趣,试图对其进行编码总是一种很好的方式来了解某些东西是如何工作的。这些图片只是Photoshop和我手上太多时间的结合。