Générer toute les parties possibles d'un jeu de morpion. - Algo - Programmation
Marsh Posté le 15-09-2011 à 11:13:19
Ca serait pas plutôt "qui mènent aux parties gagnantes"?
J'avais développé un petit soft pour jouer aux allumettes et où l'ordinateur apprenait à jouer au début. C'était basé sur l'apprentissage par renforcement et on simulait x parties pour permettre à l'ordi d'apprendre et enregistrer les coups qui menaient à la victoire. C'était très efficace, d'autant plus que x était grand (par ex 1000 parties simulées) Pas de récursivité, pas trop compliqué à programmer et très efficace...
Marsh Posté le 15-09-2011 à 14:35:43
Bonjour rufo,...
Mon objectif est de produire la totalité des partie coup par coup pour donner la liste à un réseau de neurones. Pour résoudre le tic-tac-toe par RdN
Donc, je doit trouver un algo pour lister les coup des différente partie.
Marsh Posté le 15-09-2011 à 16:26:37
C'est juste le tic-tac-toe à 9 cases que tu veux?
A+,
Marsh Posté le 15-09-2011 à 16:56:33
gilou a écrit : C'est juste le tic-tac-toe à 9 cases que tu veux? |
Oui, effectivement... Pourquoi ?
Marsh Posté le 15-09-2011 à 19:31:21
Parce que c'était pas explicite: morpion -> nxn cases
Le tic tac toe est un cas très particulier du morpion.
Ça doit pas être trop dur a générer, sachant qu'il n'y a que 8 ensembles de 3 sommets gagnants et que le nombre de parties est borné par 9! = 362880.
A+,
Marsh Posté le 15-09-2011 à 20:21:11
Backtracking ? C'est sympa pour bruteforcer
Marsh Posté le 15-09-2011 à 23:36:21
Tiens, en perl, un petit programme qui génère les 255168 parties possibles (j’arrête la partie dès qu'on a un gagnant).
Code :
|
Ça prend environ 1mn sur ma vieille bécane pour faire l'ensemble des parties possibles. A rediriger dans un fichier texte (de 5 697 502 octets).
Le principe de l'algo:
Je fais un pattern des combinaisons gagnantes ordonnées (il y en a 8).
Algorithm::Permute([1..9]) va generer toutes les permutations de 1..9.
Pour chaque permutation, je chope les valeurs d'indice pair (donc les coups du premier joueur) rangées dans la liste first et les autres dans la liste second.
Ensuite je regarde:
si les 3 premiers coups du 1er joueur contienne un pattern gagnant
si les 3 premiers coups du 2eme joueur contienne un pattern gagnant
si les 4 premiers coups du 1er joueur contienne un pattern gagnant
si les 4 premiers coups du 2eme joueur contienne un pattern gagnant
si les 5 premiers coups du 1er joueur contienne un pattern gagnant
pour chercher si une liste de coups contiennent un pattern gagnant, je peux chercher sur la liste ordonnée, et donc utiliser mon pattern des combinaisons gagnantes ordonnées.
A la fin, je réordonne pour virer les doublons (l'algo est en force brute sur toutes les permutations, donc on a des doublons engendrés par des permutations ayant un même début gagnant et une suite de coups (virtuels) après que la partie ait été gagnée qui diffèrent).
A+,
Marsh Posté le 16-09-2011 à 07:55:44
Bonjour,
WiiDS a écrit : Backtracking ? C'est sympa pour bruteforcer |
C'est quoi le backtracking ?
gilou a écrit : Tiens, en perl, |
Merci Gliou. Excuse moi, je me suis couché tôt hier, j'essuyais déjà une nuit blanche.
Marsh Posté le 16-09-2011 à 08:07:07
Arff, ton code est incomplet, il manque l'algo de Permute, il me faudrait Permute...
Ou alors, Je serais intéressé de savoir comment tu initialise un morpion, et savoir quelle permutation tu effectues.
Marsh Posté le 16-09-2011 à 10:31:27
http://en.wikipedia.org/wiki/Backtracking
Je peux essayer de t'implémenter en C si tu ne vois pas trop le concept. Par contre, ça serait probablement en récursif. (même si ça doit être jouable en itératif mais bon).
C'est un algo assez générique qui n'est finalement qu'un bruteforce intelligent. Après, et après réflexion, je me demande si c'est vraiment utile dans ce cas, et je pense que la solution de gilou doit être la meilleure
Marsh Posté le 16-09-2011 à 10:39:28
Ouais, te casse pas la tête, si Gilou veux bien produire l'algo de permutation.
Ou alors, il faudrais que j'arrive à dé-récursiver cet algo.
Code :
|
Marsh Posté le 16-09-2011 à 11:11:10
D'après ce que j'ai compris dans le code de Gilou, mais je peux me tromper parce que je ne connais pas le Perl, "Permutation" semble être une fonction d'une lib Perl nommée "Algorithm"
Marsh Posté le 16-09-2011 à 11:29:39
Ah, merci WIIDS.
J'ai installé la bibliothèque en question, mais rien à faire, perle ne trouve pas la bibliothèque la ou elle est pourtant, malgré la présence du chemin dans les chemins de recherche de perl.
Marsh Posté le 16-09-2011 à 11:33:07
ReplyMarsh Posté le 16-09-2011 à 11:49:44
Je pense que tu seras intéressé par ce lien: http://search.cpan.org/~edpratomo/ [...] Permute.pm
Marsh Posté le 16-09-2011 à 12:41:17
Exactement, c'est implémenté dans un mix de C et de liaison perl.
Je pensais que ce qui intéressait Jovalise était juste la liste générée.
S'il veut un algo (plus lent) pour les permutations, voici un exemple, pas optimal, car adapté d'un algo plus générique.
Code :
|
A+,
Marsh Posté le 16-09-2011 à 12:42:34
Il suffit de l'installer avec ppm (sous active state) ou CPAN (sous un autre système).
A+,
Marsh Posté le 16-09-2011 à 12:57:50
Merci Gilou, oui, c'est le résultat que je veux, peu importe la méthode.
Je suis en cours de réeinstall système, je vous dis après si mon réseau de neurones fonctionne.
Marsh Posté le 16-09-2011 à 16:53:03
gilou a écrit : Exactement, c'est implémenté dans un mix de C et de liaison perl. |
Bon, c'est pas le bon résultat.
Marsh Posté le 16-09-2011 à 16:56:39
A oui, et je sais pas si sa vas t'embêter, mais il me faux chaque ligne écrite en double.
Pas de signe au positifs et zero et une espace avant un positif ou zero.
Merci Gilou.
edit
Du coup, je sais pas si c'est pas moi qui me suis mal exprimé....
Je souhaite la liste des plateau à chaque coup.
genre :
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0
-1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0
-1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0
Ah oui sauf le plateau de début qui doit être inséré simplement au début de chaque parti.
En espérant que c'est clair.
Marsh Posté le 16-09-2011 à 17:27:33
Ceci dit, si quelqu'un avais un algo en français ce serait pas mal.
Code :
|
C'est une nataserie...
Marsh Posté le 16-09-2011 à 18:05:12
Non! Les lignes 2 et 3 et 4 et 5 de ton exemple sont identiques (tu as dit que tu les voulait en double), mais pas la première, je ne comprends donc pas ta notation. Ou alors la première ligne n'est pas double, et elle seule?
Et comment explicites tu la victoire?
Chaque ligne contient la liste des cases (1) jouées dans l'ordre joué (et s’arrête des qu'un joueur a gagné) suivie de +1.0 si le 1er joueur a gagné, -1.0 si le 2e a gagné, et 0.0 si le match est nul.
C'est pas dur a transformer dans un autre format, encore faut il que tu expliques clairement quel format de sortie tu désires.
(1): La numérotation des cases est comme d'hab
123
456
789
A+,
Marsh Posté le 16-09-2011 à 18:24:35
Merci Gilou d'abord.
La première ligne est le plateau de départ de partie, donc il apparaît une seule fois à chaque début de partie.
Mais toute les autre doive êtres en double.
Ok pour le (1)
La notation c'est le tableau de taille (1..9) de Status_type (Empty, White, black) { " 0.0" pour Empty, "-1.0" pour black, " 1.0" pour white}.
la première ligne le plateau vide
à la seconde je joue au milieu
je répète la ligne
à la troisième, je joue dans un coin.
je répète la ligne
Marsh Posté le 16-09-2011 à 18:26:54
Et même, si tu peux me mettre les partie gagné par black et white et les nulle dans trois fichiers distinc, t'est un as.
Marsh Posté le 16-09-2011 à 18:55:49
Code :
|
vu que python, c'est lisible, tu devrais sans trop de problème pouvoir adapter ca pour que ca te sorte des fichiers distincts.
J'ai laissé en commentaire les appels à la fonction qui sort la liste de tous les coups pour arriver à la solution, le cas échéant.
Edit : vu que je repose entièrement sur l'état initial, tu dois pouvoir sans problème commencer par un tableau à 10 éléments si ca te chante
Marsh Posté le 16-09-2011 à 19:18:45
Il suffit de remplacer la derniere ligne
print join("\n", @result);
par
Code : |
A+,
Marsh Posté le 16-09-2011 à 19:32:56
Yep, merci Gilouuuu !
theshockwave, je le prend ou l'import copy ?
J'ai lancé le réseau avec toute des combinaison je vous tien au courant.
Marsh Posté le 16-09-2011 à 19:54:25
Bon, ça passe, j'ai 4567104 enregistrement qui point sur chaque coup en double, avec le plateux de départ en double également finalement, j'ai réfléchis un poil plus et en fait il le falait en double aussi. Bref,
Une époque toute les deux minute,
RMS_Error, l'indice d'erreur, est à 7.34923772157265640E-02, et j'ai fixé la limite de RMS_Error à 0.050.
Le début de la séquence et pas prometteuse cependant.
|
Je vais recommencer au cas où.
Marsh Posté le 16-09-2011 à 20:01:17
Bon, le programme en perl hacké vite fait et sans doute pas optimal
Code :
|
En sortie
winfirst.txt 87 Mo, winsecond.txt 50 Mo et winnone.txt 33 Mo.
A+,
Marsh Posté le 16-09-2011 à 20:44:01
Yer !
Merci Gilou. T'es un as.
J'ai lancé deux process, un avec la totalité des combinaisons avec une couche cachée de 9 neurones et un autre auquel je vais donnez la totalité mais fichier par fichier avec une couche cachés de 81 neurones.
Marsh Posté le 17-09-2011 à 17:32:25
Ok merci theshockwave.
Je vous avais dit que je vous tiendrais au courant, ben ça fonctionne pas pour le moment.
Pas moyen de jouer au morpion, ne serais-ce qu'une partie, avec mon réseau de neurones.
Marsh Posté le 17-09-2011 à 18:05:07
Si vous souhaitez tester vous même le Tic-Tac-Toe contre un réseaux de neurone... Voici deux sources, Main et tictactoe qui implémente un tel processus.
Le réseau de neurones est fourni par une bibliothèque externe.
Les deux programmes dépende de la bibliothèque PragmARC (j'ai une version avec FannAda si vous souhaitez)
Main, le générateur de Réseau de neurones.
Code :
|
Tictactoe, l'exploitation du réseaux de neurone, pour jouer contre la machine.
Code :
|
Vous pouvez tester des alternative des produits des code de Gilou, merci Gilou , en supprmant les plateau vide et avec un seul exemplaire du coup jouer.
Marsh Posté le 20-09-2011 à 14:46:15
Bonjour, bonjour Gilou ! Bonjour à tous.
Donc, pour le moment ça fonctionne pas. Et j'aimerais tester une autre solution.
J'aurais besoin d'une solution pour le même problème sauf qu'au lieu d'avoir l'état du jeu complet en seconde ligne, je souhaiterais essayer avec en une seconde ligne seulement le coup joué.
on part de :
état : 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
puis : (pour le premier coup ça change rien)
coup :1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
état : 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
coup: 0.0 -1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Voila, si ça branche quelqu'un...
Merci.
Marsh Posté le 20-09-2011 à 16:05:28
theshockwave a écrit : |
C'est pas faux, tiens, je vais me débrouiller tout seul finalement à partir de là.
Merci theshockwave.
Marsh Posté le 20-09-2011 à 17:53:06
Je viens de voir ton message, je te met ça dans 5 mn.
A+,
Marsh Posté le 15-09-2011 à 08:38:26
Bonjour, je reposte cette requête, j'aurais besoin d'un coup de main pour générer toute les partie d'un morpion.
J'ai trouvé un bout de code, mais c'est du récursif, et j'ai du mal à m'en sortir avec.
J'ai besoin de lister les coup qui même aux parties gagnante et partie nulle, sous forme de N-uplet de 9 réels prenant pour valeur 0.0 pour les case vides, 1.0 pour le joueur un et -1.0 pour le joueur deux.
Si vous aviez un tuyau ?
S'il vous plaît,
Merci.