Pregunta

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

Pero mi problema es: ¿Cómo podría codificar esa red neuronal? Mi idea era utilizar una matriz [1-18] para las neuronas de entrada. Los valores de esta matriz son los pesos de entrada. El Me gustaría caminar a través de la matriz mediante un bucle. Cada vez que hay una neurona para ser activado, agrego el peso al valor de salida. Por lo que el valor de salida es la suma de los pesos de las neuronas de entrada activados:

Output = SUM(ActivatedInputNeurons)

¿Crees que esto es una buena manera de programar la red? ¿Tiene ideas mejores?

Espero que me puedan ayudar. Gracias de antemano!

¿Fue útil?

Solución

Bueno, usted tiene una capa de entrada de 18 neuronas, y una capa de salida de 1 neurona. Está bien. Sin embargo, es necesario dar a su red neuronal la oportunidad de poner las entradas en relación. Por eso, es necesario al menos una capa intermedia. Yo propondría utilizar 9 neuronas en la capa intermedia. Cada uno de éstos se debe conectar a cada neurona de entrada, y la neurona de salida debe estar conectada a cada intermedio. Cada tal conexión tiene un peso, y cada neurona tiene un nivel de activación.

A continuación, vaya a través de todas las neuronas, una capa a la vez. La capa de entrada es sólo activa con el estado del tablero. Para todas las neuronas más, vas a través de todas sus respectivas conexiones y suma más el producto de nivel de activación de la neurona conectado y el peso de la conexión. Por último, se calcula el nivel de activación mediante la aplicación de una función sigmoide en esta suma.

Este es el principio de funcionamiento. Ahora, es necesario entrenar esta red para obtener mejores resultados. Existen varios algoritmos para esto, usted tiene que hacer algunas google y leer. Por último, es posible que desee ajustar el número de neuronas y las capas cuando los resultados no consiguen convencer suficientemente rápido. Por ejemplo, se podría reducir la capa de entrada a 9 neuronas y activarlos con 1 para una X y -1 para un O. Tal vez la adición de otra capa intermedia da mejores resultados, o aumentando el número de neuronas de una capa.

Otros consejos

Yo particularmente no entiendo cómo se espera obtener un resumen significativo de la situación bordo de una neurona de salida. Me gustaría ver más tener:

    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 completamente conectada, es decir, 81 pesos. A continuación, entrenar las neuronas de salida para la conveniencia relativa de jugar en esa posición.

Tenga una mirada en mi proyecto Tic. He resuelto este problema tanto con redes neuronales y algoritmos genéticos. El código fuente está disponible libremente.

http://www.roncemer.com / tic-tac-toe-an-experimento-in-máquina-aprendizaje

Creo que se debe implementar un 'tradicional' de alimentación hacia adelante ANN usando funciones de transferencia, como que le permite entrenar usando propagación hacia atrás. El código para estos por lo general 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)

Este es un excelente proyecto inicial para la codificación de la IA, pero la elaboración de una solución completa será de gran manera de una respuesta para el SO.

Al igual que con la mayoría del software, recomiendo el uso de un diseño orientado a objetos. Por ejemplo: Definir una clase Neuron que tiene entradas, pesos, y una función de salida. A continuación, cree varios de estos Neuron objetos con el fin de construir su red.

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

Buena suerte con el código! Suena como un montón de diversión.

No es una respuesta directa a su pregunta, pero usted debe tener una mirada en el siguiente marco / herramienta: SNNS o su equivalente en Java JavaNNS . Estoy bastante seguro de que encontrará una respuesta a su pregunta.

Después de la adición de los pesos, es necesario normalizar la suma usando una función, la gente suele utilizar TANH, si desea permitir que los números negativos.

editar

Aquí es aplicación de un perceptrón multicapa java que trabajé hace unos años. éste fue utilizado para las damas, pero con menos insumos se puede utilizar para las damas también.

Además, es necesario determinar, probablemente, una manera de enseñar a ganar, pero eso es otro problema

Usted ahorrará tiempo si se utiliza la biblioteca de redes neuronales como FANN o Neuroph.

Una forma de codificar su entrada es por 9 neuronas de entrada. La salida también es bueno para ser 9 neuronas. Lo que no veo en las otras repeticiones es el tamaño de la capa oculta. Supongo que se va a utilizar MLP con 3 capas tradicionales. El tamaño de la capa oculta es siempre misterio. Me gustaría probar 10 neuronas ocultas.

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

0.0 -. Reproductor de O

1.0 -. X reproductor

0.5 -. Vacío

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top