Un problème avec intélligence artificielle
NGUYEN
-
toninsa Messages postés 1 Statut Membre -
toninsa Messages postés 1 Statut Membre -
Bonjour,
Je suis en train de faire un jeu MORPION 3x3 de type AI sur Delphi mais j'ai rencontré un problème. Le programme maintenent n'est pas encore intélligent comme je veux. Je croix que ma Procédure de l'élagage alpha beta ne marche pas très bien. Est-ce que vous pouvez m'aider de chercher les erreurs? Voici le code source de minmaxalphabeta.
Merci en avance!
Procedure minmaxalphabeta( jeu:morpion; depth:byte; joueur:byte;var lecoup:coup; var score,alpha,beta:integer);
var
i,MM_score: integer;
MM_board : morpion;
prof:byte;
couppos : coupjeu;
MM_move : coup;
begin
{ incrémente la profondeur de recherche }
prof:=depth;
inc(prof);
alpha:=-99;beta:=99;
{vérifier le nombre de coups possibles}
if (coups_possibles(couppos,jeu,joueur )<>0 ) then
begin
if joueur=humain then
{ execute tous les coups possibles }
for i := 1 to couppos.ncoups do
Begin
score:=alpha;
move(jeu,MM_board,sizeof(morpion));
{ appel minmax avec la reccursivité }
{ ici on est à un noeud de l'arbre }
jouer_le_coup( MM_board, couppos.coups[i] );
if (prof<>9) and (not evaluation_jeu(MM_board,ordinateur)) then
minmaxalphabeta( MM_board, prof, inversejoueur(joueur), MM_move,MM_score,score,beta)
else
if (prof=9) or (evaluation_jeu(MM_board,humain)) or (evaluation_jeu(MM_board,ordinateur)) then
MM_score:=evaluation(jeu); { ici, on est aux feuilles de l'arbre. }
if score<MM_score then
Begin
score:=MM_score;
lecoup:=couppos.coups[i];
if score>=beta then exit;
end;
end;
if joueur=ordinateur then
for i := 1 to couppos.ncoups do
Begin
score:=beta;
move( jeu, MM_board, sizeof( morpion ) );
jouer_le_coup(MM_board, couppos.coups[i] );
if (prof<>9) and (not evaluation_jeu(MM_board,humain)) then
minmaxalphabeta(MM_board, prof, inversejoueur(joueur), MM_move,MM_score,alpha,score)
else
if (prof=9) or (evaluation_jeu(MM_board,humain)) or (evaluation_jeu(MM_board,ordinateur)) then
MM_score:=evaluation(jeu);
if MM_score<score then
Begin
score:=MM_score;
lecoup:=couppos.coups[i];
end;
if score<=alpha then exit;
end;
if joueur=humain then alpha:=MM_score else if joueur=ordinateur then beta:=MM_score;
end;
end;
Je suis en train de faire un jeu MORPION 3x3 de type AI sur Delphi mais j'ai rencontré un problème. Le programme maintenent n'est pas encore intélligent comme je veux. Je croix que ma Procédure de l'élagage alpha beta ne marche pas très bien. Est-ce que vous pouvez m'aider de chercher les erreurs? Voici le code source de minmaxalphabeta.
Merci en avance!
Procedure minmaxalphabeta( jeu:morpion; depth:byte; joueur:byte;var lecoup:coup; var score,alpha,beta:integer);
var
i,MM_score: integer;
MM_board : morpion;
prof:byte;
couppos : coupjeu;
MM_move : coup;
begin
{ incrémente la profondeur de recherche }
prof:=depth;
inc(prof);
alpha:=-99;beta:=99;
{vérifier le nombre de coups possibles}
if (coups_possibles(couppos,jeu,joueur )<>0 ) then
begin
if joueur=humain then
{ execute tous les coups possibles }
for i := 1 to couppos.ncoups do
Begin
score:=alpha;
move(jeu,MM_board,sizeof(morpion));
{ appel minmax avec la reccursivité }
{ ici on est à un noeud de l'arbre }
jouer_le_coup( MM_board, couppos.coups[i] );
if (prof<>9) and (not evaluation_jeu(MM_board,ordinateur)) then
minmaxalphabeta( MM_board, prof, inversejoueur(joueur), MM_move,MM_score,score,beta)
else
if (prof=9) or (evaluation_jeu(MM_board,humain)) or (evaluation_jeu(MM_board,ordinateur)) then
MM_score:=evaluation(jeu); { ici, on est aux feuilles de l'arbre. }
if score<MM_score then
Begin
score:=MM_score;
lecoup:=couppos.coups[i];
if score>=beta then exit;
end;
end;
if joueur=ordinateur then
for i := 1 to couppos.ncoups do
Begin
score:=beta;
move( jeu, MM_board, sizeof( morpion ) );
jouer_le_coup(MM_board, couppos.coups[i] );
if (prof<>9) and (not evaluation_jeu(MM_board,humain)) then
minmaxalphabeta(MM_board, prof, inversejoueur(joueur), MM_move,MM_score,alpha,score)
else
if (prof=9) or (evaluation_jeu(MM_board,humain)) or (evaluation_jeu(MM_board,ordinateur)) then
MM_score:=evaluation(jeu);
if MM_score<score then
Begin
score:=MM_score;
lecoup:=couppos.coups[i];
end;
if score<=alpha then exit;
end;
if joueur=humain then alpha:=MM_score else if joueur=ordinateur then beta:=MM_score;
end;
end;
A voir également:
- Un problème avec intélligence artificielle
- Comment utiliser l'intelligence artificielle - Accueil - Guide Intelligence artificielle
- Intelligence artificielle - Guide
- Intelligence artificielle whatsapp - Guide
- L'après smartphone : ils préparent un assistant numérique à emporter partout (et c'est effrayant) - Guide
- Cours intelligence artificielle gratuit - Accueil - Intelligence artificielle
2 réponses
Salut,
Je ne connais pas Delphi, donc j'ai du mal à tout suivre (surtout l'appel des sous fonctions : elles sont dans le code que tu as donné ?), mais tout me semble correct...
Juste une chose : comment tu compte ton score ? (fonction evaluation) -> il ne dépasse jamais de l'intervalle -99,99 ?
Sinon, ben... Vu que le problème est simple, tu peux demander à ton programme de te retourner toutes les valeurs intermédiaires, et faire la même chose en même temps que lui : tu verras tout de suite où ça coince !
Bonne chance.
Eléctions : Bush filled his SOUl with HOpe
Je ne connais pas Delphi, donc j'ai du mal à tout suivre (surtout l'appel des sous fonctions : elles sont dans le code que tu as donné ?), mais tout me semble correct...
Juste une chose : comment tu compte ton score ? (fonction evaluation) -> il ne dépasse jamais de l'intervalle -99,99 ?
Sinon, ben... Vu que le problème est simple, tu peux demander à ton programme de te retourner toutes les valeurs intermédiaires, et faire la même chose en même temps que lui : tu verras tout de suite où ça coince !
Bonne chance.
Eléctions : Bush filled his SOUl with HOpe