Livre pour apprendre les algo MinMax et Alpha/beta
fdiedler2000
Messages postés383Date d'inscriptionsamedi 29 janvier 2005StatutMembreDernière intervention 1 décembre 2008
-
8 déc. 2007 à 10:43
fdiedler2000
Messages postés383Date d'inscriptionsamedi 29 janvier 2005StatutMembreDernière intervention 1 décembre 2008
-
6 janv. 2008 à 22:50
Bonjour,
Je voudrais apprendre les bases des l'algorithmes Min/Max et Alpha/Beta avec un bon livre pour débutant !
Mon but et de comprendre comment réfléchie une IA pour en developper une dans le cadre d'un morpion ou puissance 4 dans un premier temps.
De plus, si vous connaissez des ressources sur le net qui explique vraiment pas à pas ces deux algos avec si possible un exemple en vb.net ca serait génial :)
mstarsup5
Messages postés527Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention10 octobre 20131 26 déc. 2007 à 11:26
Euh... c'est con ce que je t'ai dit...
Dans tes fcts calcmax et calcmin remplace le Return eval() par
tmp=eval()
msgbox "1" & "," & str(prof) & "," & str(eval)
return tmp
puis dans calcmax, avant le return max, mets msgbox "2" & "," & str(prof) & "," & str(max)
puis dans calcmin, avant le return min, mets msgbox "3" & "," & str(prof) & "," & str(min)
mstarsup5
Messages postés527Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention10 octobre 20131 26 déc. 2007 à 11:29
Ah tu veux dire la :
If tmp > max Then
C'est pour éviter le If tmp = max Then qu'on change la valeur des const ?
Ben en fait, si on trouve un coup équivalent, ça sert à rien de changer celui qu'on avait déjà trouvé, d'où le > au lieu de >=
Par contre, si tous les coups possibles valent -1000, on va se faire niquer sachant qu'à chaque fois on va avoir une égalité (et dans ce cas là, aucunes coordonnées de coup ne sera choisie, ce qui est embêtant ;-) )
Pourapprendretoujoursplus!
Vous n’avez pas trouvé la réponse que vous recherchez ?
mstarsup5
Messages postés527Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention10 octobre 20131 26 déc. 2007 à 11:53
Salut,
Un problème flagrant: ton algo ne s'arrête pas s'il y a un gagnant: il continue à jouer des coups après...
Elle sert à quoi ta fonction IsFinish()?
fdiedler2000
Messages postés383Date d'inscriptionsamedi 29 janvier 2005StatutMembreDernière intervention 1 décembre 2008 26 déc. 2007 à 12:04
IsFinish permet de savoir si le jeu est fini (toutes les cases sont remplies) mais ne vérifie pas qui est gagnant !
La fonction IsWinner avec comme argument une couleur permet de vérifier si les ROND (couleur rouge) ont gagné ou si les CROIX (couleur vert) ont gagné. Elle retourne un Boolean : True si la couleur en question a gagné sinon False.
mstarsup5
Messages postés527Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention10 octobre 20131 26 déc. 2007 à 12:06
Il faut que isfinish, quand tu l'appelles dans calcmin ou calcmax te renvoie true si le plateau est rempli, ou si un joueur gagne, sinon, ça va faire n'importe quoi comme maintenant...
Renvoie moi le fichier quand ça ça sera changé déjà ^^"
fdiedler2000
Messages postés383Date d'inscriptionsamedi 29 janvier 2005StatutMembreDernière intervention 1 décembre 2008 26 déc. 2007 à 12:20
Explication donc de la fonction IsFinish :
Private Function IsFinish() As Boolean
Dim res As Integer = 0
For row As Integer = 0 To 2
For col As Integer = 0 To 2
If Grid1.Cell(row, col).BackColor = Color.White Then
res = -1 'le plateru n'est pas rempli
GoTo 10 'on va directement tester la 2eme condition
End If
Next
Next
res = 1 ' le plateau est rempli
10:
Dim winner As Boolean = IsWinner(couleur)
If winner True Or res 1 Then
Return True 'dans ce cas, si y'a un gagnant ou si la plateau est rempli
Else
Return False 'pour tous les autres cas
End If
End Function
mstarsup5
Messages postés527Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention10 octobre 20131 26 déc. 2007 à 12:25
pas bon: ça fait pareil (teste: mets, sur la première diagonale: un rouge, un vert, un rouge, et regarde ce qui se passe.
Dans ta fonction, y'a des fois t'as deux gagnants...
Ca peut venir de deux choses:
Soit la fonction IsFinish n'est toujours pas correcte, soit quand tu fais "return qqch", la fonction continue d'exécuter ce qu'il y a après.
fais un test: mets un msgbox "hello" après un return qqch
mstarsup5
Messages postés527Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention10 octobre 20131 26 déc. 2007 à 12:30
(Ps: à mon avis, une fois que t'auras réglé ce problème, l'algo fonctionnera, mais là, tant qu'il s'arrête pas quand il trouve un gagnant, ça pourra pas fonctionner (pour deux raisons:
La première, c'est bête de continuer à voir ce qui se passe après qu'un gagnant a déjà été trouvé, si tu comprends pas ça, tu n'as rien compris de l'algo.
Deuxième raison: imagine tu trouves un gagnant, il continue de tester et trouve un deuxième gagnant (ce qui arrive des fois dans ton algo d'ailleurs).
Comment attribuer des points dans ce cas? A qui, et pourquoi? C'est débile ^^
mstarsup5
Messages postés527Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention10 octobre 20131 26 déc. 2007 à 12:33
Ps: si il y a une erreur dans ta fonction IsFinish, elle est là:
Dim winner As Boolean = IsWinner(couleur)
(mais j'en sais rien perso s'il y a une erreur, je peux pas la tester ni rien ^^") => A toi de vérifier
fdiedler2000
Messages postés383Date d'inscriptionsamedi 29 janvier 2005StatutMembreDernière intervention 1 décembre 2008 26 déc. 2007 à 12:37
pas bon: ça fait pareil (teste: mets, sur la première diagonale: un
rouge, un vert, un rouge, et regarde ce qui se passe.
Dans ta fonction, y'a des fois t'as deux gagnants...
Ca peut venir de deux choses:
Soit
la fonction IsFinish n'est toujours pas correcte, soit quand tu fais
"return qqch", la fonction continue d'exécuter ce qu'il y a après.
fais un test: mets un msgbox "hello" après un return qqch
Pas compris, pourtant en jouant sans IA ca marche très bien... comment peut-il y avoir deux gagants ?
mstarsup5
Messages postés527Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention10 octobre 20131 26 déc. 2007 à 12:43
Bah écoute, fais ce que je t'ai dit, tu prends le programme que tu m'as passé, tu joue rouge en haut à gauche, vert au milieu, rouge en bas à droite, tu lances l'IA et tu regardes ce qui se passe... A un moment t'as deux gagnants, c'est clairement pas bon lol
mstarsup5
Messages postés527Date d'inscriptionlundi 15 octobre 2007StatutMembreDernière intervention10 octobre 20131 26 déc. 2007 à 12:53
Bien sûr qu'il faut tester les deux, c'est ce que je t'avais marqué.
"Ca a l'air de marcher", mais je vais pas faire 2000 tests non plus pour voir si c'est fini complètement ^^"
Par contre l'IA est hyper lente...
Et ça pour deux raisons:
1 l'algo minmax pas du tout optimisé (utilise alpha beta qui est bien mieux, beaucoup plus rapide)
2 changer les couleurs des cases à chaque fois, ça prend beaucoup plus de temps que de mettre dans une variable la valeur de la case (0 pour vide, 1 pour rouge, 2 pour vert par exemple)
fdiedler2000
Messages postés383Date d'inscriptionsamedi 29 janvier 2005StatutMembreDernière intervention 1 décembre 2008 26 déc. 2007 à 12:57
Biensur maintenant que ca marche, je vais optimiser tout ca et puis je vais me lancer dans l'algo Alpha/Beta maintenant que j'ai compris le Min/Max.
Merci encore pour ta grande aide et tout le temps passé sur ce topic pour m'aider :) Je vais te laisser tranquille et puis je me donne 10 jours pour comprendre le nouvel algo et puis je te tiens au courant sur ce thread :)