2011-05-20 14 views
7

Voy a escribir el programa que representará AI para jugar al juego de mesa contra el jugador. Quiero mantener cada juego jugado en árbol de prefijos para buscar juegos similares. Pero me temo que el árbol puede ser demasiado grande para mantenerse en la memoria. Entonces, ¿cuál es la mejor manera de almacenarlo? Y para poder buscarlo rápido. No creo que escribirlo en un archivo sea una buena solución. ¿Puede estar en algún rey de DB?La mejor manera de almacenar el árbol de prefijo grande

+0

¿CÓMO grande es demasiado grande? Los límites de memoria rondan los 500 gb estos días. – TomTom

+1

Dependiendo del juego, puede que no haya una solución, excepto que NO se almacenen todas las variaciones. El ajedrez, por ejemplo, tiene demasiadas combinaciones de campos, por lo que al final tienes que programar, no usar tablas de búsqueda. – TomTom

+0

El inglés no es mi lengua materna y no sé el nombre de los juegos en inglés. La traducción directa es Marine Chess. Pero mi objetivo es una versión mucho más difícil con una placa 50x50 o incluso más grande. – IordanTanev

Respuesta

4

Lo que está buscando es una base de datos incrustada y la mayoría están escritas en C++, pero hay algunas que tienen envolturas de C#. Recomiendo Berkeley DB for .NET (que es un contenedor alrededor de Oracle's Berkeley DB).

Lo que yo recomendaría es que se genera un hash único para cada árbol de prefijo, donde los valores hash generada tendría una localidad que representa adecuadamente árboles prefijo similares: en otras palabras, los hashes de dos árboles de prefijo similares deben estar muy cerca de cada uno otro. El juego al que te refieres se conoce como Tic-Tac-Toe, por lo que hashing juegos similares de Tic-Tac-Toe debería ser fácil, aquí hay algunas referencias (Realmente no los leí, hice una búsqueda rápida de "hash Tic-Tac-Toe" y los que fueron los resultados):

el hash se almacena en la base de datos Berkeley y el árbol de prefijo es almacenado en un archivo auxiliar, o si lo desea, también puede almacenarlo en el valor mi. Como Berkeley DB almacena pares clave-valor, puede establecer el hash como la clave y el valor para cualquier cosa (es decir, su árbol de prefijos o una ruta a un archivo auxiliar que contenga su árbol de prefijos). Entonces, todo lo que debes hacer es buscar hashes similares y recuperar los árboles correspondientes de los archivos auxiliares.

Berkeley DB almacena claves similares en secuencia, por lo que puede confiar en el hecho de que no moverá las teclas y romperá la localidad de sus valores hash. Dado que la localidad no se romperá, puede hacer una optimización adicional y recuperar una gran página de pares clave-valor y reducir la cantidad de búsquedas y búsquedas que hace en el disco.

Cuestiones relacionadas