toe tic tac artificial-intelligence neural-network game-ai

artificial-intelligence - tic tac toe minimax c++



¿Cómo codificar una red neuronal artificial(Tic-tac-toe)? (8)

Ahorrará tiempo si utiliza una biblioteca de red neuronal como FANN o Neuroph.

Una forma de codificar su entrada es mediante 9 neuronas de entrada. La salida también es buena para ser 9 neuronas. Lo que no veo en las otras repeticiones es el tamaño de la capa oculta. Supongo que vas a usar MLP con 3 capas tradicionales. El tamaño de la capa oculta es siempre un misterio. Probaría 10 neuronas ocultas.

Si la función de transferencia es sigmoide, puede codificar la entrada de la siguiente manera:

0.0 - O jugador.

1.0 - X jugador.

0.5 - Vacío.

La salida de la ANN será de 9 números reales. En este caso algunas de las celdas ya estarán ocupadas. Puede buscar el valor de salida más alto que corresponde a una celda vacía.

Quiero jugar Tic-tac-toe usando una red neuronal artificial. Mi configuración para la red es la siguiente: Para cada uno de los 9 campos, uso 2 neuronas de entrada. Así que tengo 18 neuronas de entrada, por supuesto. Para cada campo, tengo 1 neurona de entrada para una pieza de la neurona del Jugador 1 y 1 para una pieza de la neurona del Jugador 2. Además de eso, tengo 1 neurona de salida que da una evaluación de la posición actual del tablero. Cuanto mayor sea el valor de salida, mejor será la posición para el Jugador 1. Cuanto más bajo sea, mejor será para el Jugador 2.

Pero mi problema es: ¿cómo podría codificar esa red neuronal? Mi idea fue usar una matriz [1-18] para las neuronas de entrada. Los valores de esta matriz son los pesos de entrada. El pasearía por la matriz usando un bucle. Cada vez que hay una neurona que debe activarse, agrego el peso al valor de salida. Entonces, el valor de salida es la suma de los pesos de las neuronas de entrada activadas:

Output = SUM(ActivatedInputNeurons)

¿Crees que esta es una buena manera de programar la red? ¿Tienes mejores ideas?

Espero que puedas ayudarme. ¡Gracias por adelantado!


Bueno, tienes una capa de entrada de 18 neuronas y una capa de salida de 1 neurona. Está bien. Sin embargo, debe darle a su red neuronal la oportunidad de poner en relación las entradas. Para eso, necesitas al menos una capa intermedia. Propondría usar 9 neuronas en la capa intermedia. Cada uno de estos debe estar conectado a cada neurona de entrada, y la neurona de salida debe estar conectada a cada intermedio. Cada una de esas conexiones tiene un peso, y cada neurona tiene un nivel de activación.

Luego, atraviesas todas las neuronas, una capa a la vez. La capa de entrada solo se activa con el estado del tablero. Para todas las neuronas adicionales, usted pasa por todas sus conexiones respectivas y suma el producto del nivel de activación de la neurona conectada y el peso de la conexión. Finalmente, calcula el nivel de activación aplicando una función sigmoide en esta suma.

Este es el principio de funcionamiento. Ahora, necesitas entrenar esta red para obtener mejores resultados. Hay varios algoritmos para esto, tendrás que hacer un poco de googlear y leer. Finalmente, es posible que desee ajustar el número de neuronas y capas cuando los resultados no sean lo suficientemente convincentes. Por ejemplo, podría reducir la capa de entrada a 9 neuronas y activarlas con +1 para una X y -1 para una O. Tal vez agregar otra capa intermedia produzca mejores resultados, o aumentar el número de neuronas de una capa.


Creo que deberías implementar un ANN de avance "tradicional" usando funciones de transferencia, ya que eso te permite entrenarlo usando la propagación hacia atrás. El código para estos usualmente termina siendo unas pocas líneas de código, algo como esto:

SetupInputs(); for (l = 1 .. layers.count) for (i = 0 .. layers[l].count) sum = 0 for (j = 0 .. layers[l-1].count) sum += layers[l-1][j] * weights[l-1][j] layers[l][i] = TransferFunction(sum)


Después de agregar los pesos, necesita normalizar la suma usando una función, las personas usualmente usan TANH, si quieren permitir números negativos.

editar:

Aquí hay una implementación de perceptrón multicapa de Java en la que trabajé hace unos años. éste se usó para los inspectores, pero con menos entradas también se puede usar para los inspectores.

Además, es probable que necesites encontrar una manera de enseñarle a ganar, pero ese es otro problema.



Este es un excelente proyecto de inicio para la codificación AI, pero encontrar una solución completa será una gran respuesta para SO.

Como con la mayoría de los programas, recomiendo usar un diseño orientado a objetos. Por ejemplo: defina una clase Neuron que tenga entradas, pesos y una función de salida. Luego, crea varios de estos objetos Neuron para construir tu red.

Vea el artículo de wikipedia sobre redes neuronales artificiales para un buen punto de partida.

Buena suerte con el código! Suena muy divertido.


No entiendo particularmente cómo espera obtener un resumen significativo de la situación de la junta de una neurona de salida. Me gustaría más tener en cuenta:

I I I O O O I I I x O O O I I I O O O 9 input neurons 9 output neurons

En una red totalmente conectada, es decir, 81 pesos. Luego entrene las neuronas de salida para la conveniencia relativa de jugar en esa posición.


No es una respuesta directa a su pregunta, pero debería echar un vistazo al siguiente marco / herramienta: SNNS o su homólogo de Java JavaNNS . Estoy bastante seguro de que allí encontrarás una respuesta a tu pregunta.