Estoy tratando de escribir un solucionador en C # .NET para un juego conocido como Flowerz. Para su referencia, puede jugarlo en MSN, aquí: http://zone.msn.com/gameplayer/gameplayer.aspx?game=flowerz . Lo escribo por diversión, no para ningún tipo de tarea ni nada relacionado con el trabajo. Debido a esto, el único límite es mi computadora (un núcleo Intel i7, con 8GB de RAM). No necesita ejecutarse en ningún otro lugar, en lo que a mí respecta.
En resumen, sus reglas son así:
- Hay una cola llena de flores de colores. Su longitud es arbitraria
- La cola no puede ser influenciada
- La cola se genera al comienzo del nivel.
- Las flores tienen uno o dos colores.
- Si hay dos colores, entonces hay un color externo y un color interno. En el caso de dos colores, el color exterior se usa para hacer coincidir.
- Si hay una coincidencia, el color exterior desaparece y la flor ahora es una flor de un solo color con el mismo color que la flor interior.
- El objetivo del juego es crear combinaciones de tres (o más) del mismo color.
- Cuando una flor de un solo color es parte de un partido, se elimina del campo de juego, creando un espacio vacío
- Puede hacer coincidir una flor de un solo color con el color exterior de una flor de dos colores. En este caso, la flor de un solo color desaparece, el color exterior de la flor de dos colores desaparece y el color interno permanece
- Ganas la ronda cuando la cola está vacía y queda al menos un espacio vacío
- Las coincidencias en cascada son posibles. Una cascada es cuando desaparecen tres (o más) flores externas, y cuando sus colores internos forman otra cadena de 3 (o más flores).
- El campo de juego es siempre 7x7
- Algunos espacios en el campo están cubiertos por rocas.
- No puedes colocar flores en las rocas
- La cola también puede contener una pala que puede usar para mover cualquier flor colocada a un espacio desocupado
- Tienes que usar la pala, pero en realidad no tienes que mover la flor: es perfectamente legal volver a colocarla de donde vino
- La cola también puede contener una mariposa de color. Cuando usas esta mariposa en una flor, la flor adquiere el color de la mariposa.
- Al aplicar una mariposa a una flor con dos colores, la flor obtiene un solo color, es decir, el de la mariposa.
- Puedes desperdiciar la mariposa en un espacio vacío o en una flor que ya tiene este color.
- Despejar el campo no gana el juego
El objetivo del solucionador es simple: encontrar una manera de vaciar la cola, con tantos espacios sobrantes en el campo de juego como sea posible. Básicamente, la IA juega el juego para mí. La salida del solucionador es una lista con los movimientos que encontró. No estoy interesado en la puntuación, pero en sobrevivir el mayor tiempo posible, por lo tanto, estoy interesado en los movimientos que dejan tantos espacios abiertos como sea posible.
No es necesario decir que el espacio de búsqueda crece rápidamente a medida que aumenta la cola, por lo que una fuerza bruta está fuera de discusión. La cola comienza en 15 y crece con 5 cada dos o tres niveles, si no recuerdo mal. Y, por supuesto, colocar la primera flor en (0,0) y la segunda en (0,1) es diferente de colocar la primera en (1,0) y la segunda flor en (0,0), especialmente cuando el campo ya está poblado con flores de una ronda anterior. Una decisión tan simple podría marcar la diferencia al tomarla o no.
Las preguntas que tengo son las siguientes:
- ¿Qué tipo de problema es este? (piense en un vendedor ambulante, una mochila o algún otro problema combinatorio). Saber esto podría hacer que mi Google-fu sea un poco mejor.
- ¿Qué tipo de algoritmo podría darme buenos resultados, rápido?
Con respecto a lo último: al principio, traté de escribir mi propio algoritmo heurístico (básicamente: ¿cómo lo resolvería, si supiera la cola?), Pero eso resulta en muchos casos extremos y coincidencias de puntuación que podría perder.
Estaba pensando en usar un algoritmo genético (porque al menos sé cómo usar eso ...), pero tengo algunos problemas para decidir sobre una representación binaria del tablero. Luego está el problema del crossover, pero eso se puede resolver con un operador de crossover ordenado o un tipo de operación similar.
Supongo que el solucionador siempre debe conocer la configuración de la placa y la cola que intenta vaciar.
Conozco algunos otros algoritmos heurísticos como las redes neuronales y los sistemas de lógica difusa, pero me falta la experiencia para saber cuál es el mejor aplicable, o si hay otros que son más adecuados para la tarea en cuestión.