Question

Je veux jouer Tic-tac-toe en utilisant un réseau de neurones artificiels. Ma configuration du réseau est la suivante: Pour chacune des 9 champs, j'utilise deux neurones d'entrée. J'ai donc 18 neurones d'entrée, bien sûr. Pour chaque domaine, j'ai 1 neurone d'entrée pour un morceau de joueur 1 et 1 neurone pour un morceau de joueur 2. En plus de cela, je 1 neurone de sortie qui donne une évaluation de la position actuelle du conseil. Plus la valeur de sortie est, meilleure est la position pour le joueur 1. Plus il est bas, meilleure est pour le joueur 2.

Mais mon problème est: Comment pourrais-je coder ce réseau de neurones? Mon idée était d'utiliser un tableau [1-18] pour les neurones d'entrée. Les valeurs de ce tableau sont les poids d'entrée. Le je marcherais à travers le réseau en utilisant une boucle. Chaque fois qu'il ya un neurone à activer, ajouter le poids à la valeur de sortie. Ainsi, la valeur de sortie est la somme des poids des neurones d'entrée activés:

Output = SUM(ActivatedInputNeurons)

Pensez-vous que cela est une bonne façon de programmer le réseau? Avez-vous des meilleures idées?

J'espère que vous pouvez me aider. Merci d'avance!

Était-ce utile?

La solution

Eh bien, il faut une couche d'entrée de 18 neurones et une couche de sortie de 1 neurone. C'est bon. Cependant, vous devez donner à votre réseau neuronal l'occasion de mettre les entrées en relation. Pour cela, vous devez disposer d'au moins une couche intermédiaire. Je propose d'utiliser 9 neurones de la couche intermédiaire. Chacun de ces éléments doit être connecté à chaque neurone d'entrée et le neurone de sortie doit être reliée à chaque intermédiaire. Chaque telle connexion a un poids, et chaque neurone a un niveau d'activation.

Ensuite, vous passez par tous les neurones, une couche à la fois. La couche d'entrée est activé seulement à l'état de la carte. Pour tous les neurones plus, vous allez à travers toutes ses connexions respectives et la somme sur le produit du niveau d'activation du neurone connecté et le poids de la connexion. Enfin, vous calculez le niveau d'activation en appliquant une fonction sigmoïde sur cette somme.

Ceci est le principe de fonctionnement. Maintenant, vous devez pour former ce filet pour obtenir de meilleurs résultats. Il existe plusieurs algorithmes pour cela, vous devrez faire quelques googler et de la lecture. Enfin, vous pouvez ajuster le nombre de neurones et des couches lorsque les résultats ne reçoivent pas assez vite convaincre. Par exemple, vous pouvez réduire la couche d'entrée 9 neurones et les activer avec +1 pour un X et -1 pour un O. Peut-être ajouter une autre couche intermédiaire donne de meilleurs résultats, ou en augmentant le nombre de neurones d'une couche.

Autres conseils

Je ne comprends pas comment vous vous attendez surtout d'obtenir un résumé de la situation du conseil d'administration sur un neurone de sortie. Je carrosserie plus d'avoir:

    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

dans un réseau entièrement connecté, à savoir 81 poids. former ensuite les neurones de sortie pour l'opportunité relative de jouer dans cette position.

Jetez un oeil à mon projet Tic. Je l'ai résolu ce problème avec les deux réseaux de neurones et de l'algorithme génétique. Le code source est disponible.

http://www.roncemer.com / tic-tac-toe-une-expérience en apprentissage automatique

Je pense que vous devriez mettre en œuvre un 'traditionnel' feed-forward ANN en utilisant les fonctions de transfert, comme qui vous permet de former à l'aide de rétropropagation. Le code pour ces se termine généralement par être quelques lignes de code, quelque chose comme ceci:

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)

Ceci est un excellent projet de démarrage pour le codage AI, mais à venir avec une solution complète sera ainsi à la taille d'une réponse SO.

Comme avec la plupart des logiciels, je recommande d'utiliser une conception orientée objet. Par exemple: définir une classe de Neuron qui comporte des entrées, les poids, et une fonction de sortie. Ensuite, créez plusieurs de ces objets Neuron afin de construire votre réseau.

Voir l'article sur wikipedia réseaux de neurones artificiels pour un bon point de départ.

Bonne chance avec le code! Sonne comme beaucoup de plaisir.

Il n'est pas une réponse directe à votre question, mais vous devriez jeter un oeil sur le cadre / outil suivant: SNNS ou son homologue Java JavaNNS . Je suis sûr que vous y trouverez une réponse à votre question.

Vous gagnerez du temps si vous utilisez la bibliothèque de réseau de neurones comme FANN ou Neuroph.

Une façon d'encoder votre entrée est de 9 neurones d'entrée. La sortie est aussi bon d'être 9 neurones. Ce que je ne vois pas dans les autres replays est la taille de la couche cachée. Je suppose que vous allez utiliser MLP avec 3 couches traditionnelles. La taille de la couche cachée est toujours mystère. Je voudrais essayer 10 neurones cachés.

Si la fonction de transfert est sigmoïde, vous pouvez encoder l'entrée comme suit:

0.0 -. Lecteur O

1.0 -. Lecteur X

0,5 -. Vide

La sortie du ANN sera de 9 nombres réels. Dans ce cas, certaines des cellules seront occupés déjà. Vous pouvez rechercher la valeur de sortie la plus élevée qui correspond à une cellule vide.

scroll top