Livre pour apprendre les algo MinMax et Alpha/beta

fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008 - 8 déc. 2007 à 10:43
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Derniè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 :)

Merci à tous
A voir également:

101 réponses

fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
26 déc. 2007 à 11:22
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 ?
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
26 déc. 2007 à 11:25
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
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)

 Pourapprendretoujoursplus!
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
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!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
26 déc. 2007 à 11:32
L'archive a été mise à jour le lien est le meme que avant
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
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()?

 Pourapprendretoujoursplus!
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Derniè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.

Ai je fais une erreur ?
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
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à ^^"

 Pourapprendretoujoursplus!
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
26 déc. 2007 à 12:18
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Derniè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

Normalement c'est bon ... (j'espère)
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
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

 Pourapprendretoujoursplus!
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
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 ^^

Enfin bon voilà, il faut corriger ça quoi :)

 Pourapprendretoujoursplus!
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
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

 Pourapprendretoujoursplus!
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Derniè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 ?
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
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

 Pourapprendretoujoursplus!
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
26 déc. 2007 à 12:44
J'ai l'impression que ca marche !
J'ai mis à jour l'archive qu'en penses tu ?

En fait, il faut pas vérifier si le joueur courant à gagné mais si l'un des deux joueurs à gagné (donc il faut testé les deux !)
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
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)

 Pourapprendretoujoursplus!
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
26 déc. 2007 à 12:56
(Ps: j'ai fait deux autres test, et non ça ne marche pas, y'a encore qqch qui merde ^^")

 Pourapprendretoujoursplus!
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Derniè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 :)
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
26 déc. 2007 à 12:58
Mince !!! Quel test as tu fait ?
0
Rejoignez-nous