Variación de Nim, donde uno tiene que dividir una pila en cualquier cantidad de pilas.

Estoy aprendiendo los conceptos básicos de la teoría de juegos combinatorios ( juegos imparciales ). Después de aprender a descomponer un juego en la suma de juegos, me siento cómodo con los juegos que se pueden dividir en la suma de 1 pila de juegos. La situación me queda más o menos clara: tengo que encontrar la gráfica del juego, calcular los valores de Sprague-Grundy y utilizarlos para encontrar la solución a un juego.

Pero realmente no sé qué hacer en caso de que no pueda descomponer un juego en juegos de 1 pila. Aquí hay un ejemplo:

Tienes montones de piedras, la gente alterna turnos, la persona que no puede hacer un movimiento pierde. Durante el movimiento, un jugador puede seleccionar cualquiera de los montones y dividir las piedras en cualquier número de montones desiguales, de modo que dos de los montones recién creados no tengan el mismo número de piedras.


Tengo un gran problema al analizar el subjuego de 1 pila (calcular valores grundy para la pila de 1 , 2 , 3 , . . . norte piedras en el montón), porque después de cada movimiento 1 montón se divide en más montones.

¿Cómo debo analizar tales juegos?

Comience con el cálculo de los valores SG de juegos con pocas piedras, no con pocas pilas.
¿No puedes simplemente aplicar recursivamente las reglas habituales en todas las combinaciones de montones que pueden resultar de un solo movimiento? Probablemente no será fácil calcular el valor SG de un solo norte pila de piedra (léase: no sé la respuesta, pero aún no lo he intentado). Las pilas de 1 o 2 piedras están "muertas" en el sentido de que no ofrecen más movimientos legales. Entonces, una pila de 3 tiene valor 1, porque todos los movimientos lo convierten en "sin movimientos". Una pila de 4 solo se puede dividir 3+1, una posición de valor 1 y, por lo tanto, tiene valor 0 en sí misma. Una pila de 5 se puede dividir en 4+1 o 3+2 con los valores respectivos 0 y 1, por lo que tiene valor 2. ¡Sigue adelante!
Gracias @MarianoSuárez-Alvarez y JyrkiLahtonen. Intentare hacer esto

Respuestas (2)

No es difícil usar la sugerencia de Jyrki para hacer una tabla de valores Sprague-Grundy de pequeños montones individuales:

tamano de la pila : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dieciséis valor SG : 0 0 0 1 0 2 3 4 0 5 6 7 8 9 10 11 12

  • Para norte = 6 las posibles divisiones son 5 , 1 , 4 , 2 , y 3 , 2 , 1 , con valores SG 2 , 0 , y 1 , respectivamente, por lo que el valor SG de 6 es 3 .
  • Para norte = 7 las posibles divisiones son 6 , 1 , 5 , 2 , 4 , 3 , y 4 , 2 , 1 , con sus respectivos valores 3 , 2 , 1 , y 0 , entonces el valor de 7 es 4 .
  • Para norte = 8 : 7 , 1 , 6 , 2 , 5 , 3 , 5 , 2 , 1 , y 4 , 3 , 1 , con sus respectivos valores 4 , 3 , 2 1 = 3 , 2 , y 1 , entonces el valor de 8 es 0 .
  • Para norte = 9 ; 8 , 1 , 7 , 2 , 6 , 3 , 5 , 4 , 6 , 2 , 1 , 5 , 3 , 1 , y 4 , 3 , 2 , con valores 0 , 4 , 3 1 = 2 , 2 , 3 , 2 1 = 3 , y 1 , entonces el valor de 9 es 5 .
  • Para norte = 10 : 9 , 1 , 8 , 2 , 7 , 3 , 6 , 4 , 7 , 2 , 1 , 6 , 3 , 1 , 5 , 4 , 1 , 5 , 3 , 2 , y 4 , 3 , 2 , 1 , con sus respectivos valores 5 , 0 , 4 1 = 5 , 3 , 4 , 3 1 = 2 , 2 , 2 1 = 3 , y 1 , entonces el valor de 10 es 6 .
  • Para norte = 11 los valores de las posiciones alcanzables son 6 , 5 , 1 , 4 , 1 , 0 , 5 , 3 , 2 , 2 , 3 , entonces el valor de 11 es 7 .
  • Para norte = 12 los valores de las posiciones alcanzables son 7 , 6 , 4 , 0 , 6 , 5 , 1 , 4 , 1 , 5 , 3 , 3 , 2 , 2 , entonces el valor de 12 es 8 .
  • Para norte = 13 los valores de las posiciones alcanzables son 8 , 7 , 7 , 5 , 2 , 7 , 6 , 4 , 0 , 6 , 1 , 2 , 5 , 3 , entonces el valor de 13 es 9 .
  • Para norte = 14 los valores de las posiciones alcanzables son 9 , 8 , 6 , 6 , 7 , 3 , 7 , 7 , 5 , 2 , 7 , 4 , 0 , 6 , 5 , 0 , 1 , 4 , 1 , 3 , entonces el valor de 14 es 10 .
  • Para norte = 15 los valores de las posiciones alcanzables son 10 , 9 , 9 , 7 , 4 , 6 , 4 , 8 , 6 , 6 , 7 , 3 , 7 , 5 , 2 , 7 , 1 , 7 , 1 , 4 , 0 , 6 , 2 , 3 , entonces el valor de 15 es 11 .
  • Para norte = dieciséis los valores de las posiciones alcanzables son 11 , 10 , 8 , 8 , 5 , 5 , 1 , 9 , 9 , 7 , 4 , 6 , 4 , 6 , 6 , 7 , 3 , 4 , 3 , 6 , 6 , 7 , 5 , 2 , 7 , 5 , 0 , 2 , entonces el valor de dieciséis es 12 .

Esperaba que el valor SG de dieciséis sería 0 , lo que sugiere un patrón de valores que aumentan en 1 pero sumergiéndome en 0 en cada potencia de 2 . Dado que eso falló, no tengo una suposición razonable sobre el patrón real.

Probablemente valga la pena investigar la posibilidad de que para norte 9 el valor SG de un montón de norte es simple norte 4 ; Tengo la intención de pensarlo un poco.

No estoy seguro de si los valores de SG son correctos. Creo que sí porque recibiste los valores para un juego de Grundy, jugando una modificación de un juego de Grundy. En el juego Grundy puedes dividir un montón en dos montones. En este juego puedes dividir un montón en cualquier número de montones.
Creo que es probable que se quede norte 4 , pero no tiene una demostración general.
@Mark: Tampoco debería sorprenderme.

Como comentó Jyrki , los movimientos en este juego descomponen montones en sumas de montones, y la regla xor aún se aplica cuando tienes una suma de más de dos montones.

Con un poco de código de Mathematica usando simplemente las reglas mex y xor para los valores de Sprague-Grundy, descubrí que los valores para una sola pila de tamaño 1 medir 70 son: 0 , 0 , 1 , 0 , 2 , 3 , 4 , 0 , 5 , 6 , 7 , , 66 . En particular, el valor de una sola pila de tamaño norte (dónde norte > 9 ) parece ser norte 4 . Este tipo de patrón tiene sentido porque a medida que los números crecen, hay tantas formas de dividir la pila que puedes lograr cada número anterior como el xor de los valores que puedes alcanzar.

Sin embargo, no he podido ver un patrón obvio en los movimientos ganadores, así que no estoy seguro de cómo probar que este patrón continúa para siempre.


código:

moves[n_] := moves[n] = 
  Map[If[Union[#] == Sort[#] && Length[#] > 1, #, Nothing] &, 
   IntegerPartitions[n]]; 
mex[list_] := mex[list] = 
  Do[If[Not[MemberQ[list, i - 1]], Return[i - 1]], {i,Length[list] + 1}]; 
nimber[n_] := nimber[n] = 
  mex[Map[Apply[BitXor, Map[nimber, #]] &, moves[n]]];

Editar:

Usando cgsuite, podemos llegar mucho más lejos. Si restringimos las reglas para decir que puede descomponer una pila en cinco pilas como máximo, entonces los valores de Sprague-Grundy se pueden calcular de manera muy eficiente mediante el código cgsuite :hr:=game.heap.HeapRules.MakeRules("&60;!."); hr.NimValues(500)

Con esto, vemos que dividir en cinco montones como máximo es suficiente para que el patrón mencionado anteriormente persista hasta alcanzar el tamaño. 499 con valor 495 . Restringiendo a un máximo de cuatro montones pone un 0 entre 12 y 13, pero continúa un norte 5 patrón a partir de entonces todo el camino hasta un tamaño de pila inicial de 499 también. (A lo sumo tres pilas dan muy pocas opciones para un patrón simple).