Me encontré con una interesante cuestión combinatoria mientras jugaba a Magic: the Gathering.
Tome N nodos en un grafo completo, cada nodo con un valor asignado. El valor de cada nodo comienza en 1, y puede aumentar a medida que avanza el juego. Cada movimiento del juego consiste en que un nodo suma su valor al valor de otro nodo con el que está conectado. (El nodo de origen no reduce su valor después de esta operación; los valores nunca pueden disminuir). Después de un movimiento en cada dirección a lo largo de una arista del grafo (dos movimientos en total), esa arista se borra y no se pueden hacer más movimientos a lo largo de esa arista. El objetivo es obtener el mayor valor total posible de todos los nodos después de realizar todos los movimientos. El número total de movimientos en el juego será (N elige 2) * 2. (El número de aristas multiplicado por 2, ya que cada arista permite un movimiento en cada dirección).
Por ejemplo, consideremos N=2. La configuración inicial es A=1, B=1. Para empezar el juego, el nodo A suma su valor al nodo B, resultando A=1, B=2. A continuación, el nodo B añade su valor al nodo A, lo que da como resultado A=3, B=2. El juego ha terminado, y la puntuación final es 5. La única otra posibilidad es que el nodo B se mueva primero, lo que simplemente da como resultado A=2, B=3 y la misma puntuación final.
Sin embargo, el problema se complica enormemente cuando se añaden más nodos. La complejidad del juego aumenta con extrema rapidez, lo que hace inviables los enfoques de fuerza bruta. Hasta ahora, los máximos que he alcanzado para varios N a través de la experimentación son:
N=1: 1 N=2: 5 N=3: 29 N=4: 249 N=5: 3866
Pero no estoy en absoluto convencido de que éstas sean las mejores respuestas (al menos para N>2). Hay una serie de conjuntos de instrucciones simples que pueden hacerlo bien, como "alejarse siempre del nodo con el valor más alto hacia el nodo con el valor más alto entre sus opciones legales". Esto no es necesariamente óptimo, sin embargo, y tengo curiosidad por saber si hay un algoritmo simple para maximizar el valor final que funciona en todos los N.