Précédent   Forum du club des développeurs et IT Pro > Autres langages > Algorithmes > Intelligence artificielle
Intelligence artificielle Forum d'entraide sur l'intelligence artificielle. Avant de poster : Cours d'intelligence artificielle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/12/2012, 15h38   #1
Skydoo
Invité régulier
 
Inscription : mars 2009
Messages : 19
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 19
Points : 6
Points : 6
Par défaut Puissance4 - Algo MinMax - problème heuristique

Bonjour,

Alors voilà, j'essaie de faire un Puissance 4 client/serveur en C avec implémentation de l'algorithme MinMax pour le serveur.

J'ai lu quelque-part (je ne sais plus ou) qu'une heuristique gagné/perdu suffisait largement pour un jeu comme le puissance 4 même avec une profondeur de 6.
Mais ça fait deux jours que j'essaie de faire marcher mon algo et rien à faire.
J'ai même essayé d'afficher la grille du jeu à chaque situations final, mais je peux pas tous les voir car sous dos le nombre de lignes dans la fenêtre est limité.
Du coup, je n'arrive pas vraiment à savoir d'où vient mon problème. A mon avis, ça vient de mon heuristique ou de quelque chose directement lié à elle, seulement je ne trouve pas.

La fonction choix_colonne():
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
int choix_colonne(int jeu[7][6], int profondeur, int joueur){

    printf("entrer dans choix colonne\n");
    int valeurMax = -10000;
    int valeurtmp;
    int colonneOptimal = 0;
    int c, l;
    srand(time(NULL));
    int colonneHasard;

    if(profondeur==0||situationFinale(jeu, joueur)){     // Si profondeur atteinte ou situationFinale (grille remplie, bot joueur gagne, adversaire gagne)

            valeurMax = evaluationHeuristique(joueur, jeu, profondeur);
            printf("valeur max = %d\n", valeurMax);
    }
    else{

        for(c=0;c<=6;c++){    // Pour chaque colonnes

            if(!colonneRemplie(jeu, c)){   // Si la colonne n'est pas pleine

                ajouterJeton(jeu, c, joueur);       // simulation ajout jeton
                valeurtmp = IAmin(jeu, profondeur-1, inverserJoueur(joueur));

                if(valeurtmp>valeurMax){     // On veut la plus grande valeur des neuds de profondeur -1
                    valeurMax = valeurtmp;
                    colonneOptimal = c;
                }
                retirerJeton(jeu, c);   // simulation retire jeton
            }
        }
    }

    if(valeurMax==0){

        colonneHasard = rand()%7;
        colonneOptimal = colonneHasard;
    }
    printf("valeur max total : %d", valeurMax);
    return colonneOptimal;
}
la fonction IAmin() :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int IAmin(int jeu[7][6], int profondeur, int joueur){

    int valeurMin = 10000;
    int valeurtmp;
    int c;

    if(profondeur==0||situationFinale(jeu, joueur)){

        valeurMin = evaluationHeuristique(joueur, jeu, profondeur);  // -evaluation car joueur adversaire
        printf("valeur max = %d\n", valeurMin);

    }
    else{

        for(c=0;c<=6;c++){

            if(!colonneRemplie(jeu, c)){

                ajouterJeton(jeu, c, joueur);
                valeurtmp = IAmax(jeu, profondeur-1, inverserJoueur(joueur));
                if(valeurtmp<valeurMin)
                    valeurMin = valeurtmp;
                retirerJeton(jeu, c);
            }
        }
    }

    return valeurMin;
}
La fonction IAmax :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int IAmax(int jeu[7][6], int profondeur, int joueur){

    int valeurMax = -10000;
    int valeurtmp;
    int c;

    if(profondeur==0||situationFinale(jeu, joueur)){

           valeurMax = evaluationHeuristique(joueur, jeu, profondeur);
            printf("valeur max = %d\n", valeurMax);
    }
    else{

        for(c=0;c<=6;c++){

            if(!colonneRemplie(jeu, c)){

                ajouterJeton(jeu, c, joueur);
                valeurtmp = IAmin(jeu, profondeur-1, inverserJoueur(joueur));
                if(valeurtmp>valeurMax)
                    valeurMax = valeurtmp;
                retirerJeton(jeu, c);
            }
        }
    }

    return valeurMax;
}
la fonction heuristique :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int evaluationHeuristique(int joueur, int jeu[7][6], int profondeur){

    int c, l;
    int valeur = 0;

    if(joueurGagne(joueur, jeu)){

        valeur = 100*(profondeur+1);
        printf("joueur gagne\n");
        printf("profondeur : %d\n", profondeur);
        printf("valeur : %d\n", valeur);
    }
    if(joueurGagne(inverserJoueur(joueur), jeu)){

        valeur = -100*(profondeur+1);
        printf("inverse joueur gagne\n");
        printf("profondeur : %d\n", profondeur);
        printf("valeur : %d\n", valeur);
    }

    return valeur;
}
Toutes mes autres fonctionnent correctement normalement. Puisqu'elles fonctionnaient avant que je n'ajoute l'algo MinMax.

Je précise que ce n'est pas un devoir à rendre ou quelque chose comme ça, juste moi qui fait ça pour m’entrainer et comprendre l'IA. C'est mal parti apparemment... Un peu d'aide serait la bienvenue

Merci d'avance!
Skydoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 17h37.


 
 
 
 
Partenaires

Hébergement Web