Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
829 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Page Suivante
Auteur Sujet :

[Algo] Vous ne préférez pas une bonne partie d'échecs ?

n°2179262
PB-
Posté le 08-03-2013 à 06:42:42  profilanswer
 

Reprise du message précédent :
Tu veux dire qu'il te faut 3 minutes pour faire un minmax niveau 1 ??

mood
Publicité
Posté le 08-03-2013 à 06:42:42  profilanswer
 

n°2179281
Profil sup​primé
Posté le 08-03-2013 à 09:10:35  answer
 

PB- a écrit :

Tu veux dire qu'il te faut 3 minutes pour faire un minmax niveau 1 ??


Je voulais dire que j'ai modifié minmax de manière à ce qu'il appelle alternativement les successeurs du joueur et de l'adversaire et que ça joue plus vite.
Cela dit, ça m'a pris 5 minute pour le faire.
Par contre pour les valeur des cavalier ou des fou c'est peut-être à réajuster.

n°2179350
Profil sup​primé
Posté le 08-03-2013 à 12:44:59  answer
 

Je sais pas encore si c'est mieux, le truc, c'est que je tombe parfois soit sur des truc interminable ou des bug... Oui je programme par essai-erreur.
 
 


     A   B   C   D   E   F   G   H  
 
 8   BT  BC  BV  BQ  BK  BV  BC  BT  
 
 7   BP  BP      BP  BP  BP  BP  BP  
 
 6           BP                      
 
 5                                  
 
 4       WP      WP                  
 
 3                                  
 
 2   WP      WP      WP  WP  WP  WP  
 
 1   WT  WC  WV  WQ  WK  WV  WC  WT  
 
White :  
Black :  
Les noirs jouent pour le coup N° 2
Total Black :  0.00000E+00
Total Black :  0.00000E+00
White Heuristic :  5.70000E+03
Black Heuristic :  5.70000E+03
White timer : 00:01:24
Black timer : 00:00:40

n°2179411
Profil sup​primé
Posté le 08-03-2013 à 16:27:21  answer
 

8   BT  BC  BV  BQ  BK  BV  BC  BT  
 
 7   BP  BP          BP  BP  BP  BP  
 
 6           BP                      
 
 5               BP                  
 
 4       WP      WP                  
 
 3                                  
 
 2   WP      WP  WQ  WP  WP  WP  WP  
 
 1   WT  WC  WV      WK  WV  WC  WT  
 
White :  
Black :  
Les noirs jouent pour le coup N° 3
Total Black :  0.00000E+00
Total Black :  0.00000E+00
White Heuristic :  5.70000E+03
Black Heuristic :  5.70000E+03
White timer : 00:02:37
Black timer : 00:01:25


 
C'est le coup des noir du même coup


Message édité par Profil supprimé le 08-03-2013 à 16:28:33
n°2179864
Profil sup​primé
Posté le 12-03-2013 à 04:01:55  answer
 

J'ai mis les stats des partie automatique de 1er niveau dans le premier post.
 
Merci encore au participant du sujet.

n°2179884
Profil sup​primé
Posté le 12-03-2013 à 09:53:36  answer
 

rufo a écrit :

Fais pas du récursif :/ C'est lent et ça pompe trop de mémoire...


 
 
Alpha béta c'est carrément récursif.

n°2179908
PB-
Posté le 12-03-2013 à 10:36:18  profilanswer
 

Je pense que c'est pas l'unique raison de la lenteur de ton code.


Message édité par PB- le 12-03-2013 à 10:36:57
n°2179911
rufo
Pas me confondre avec Lycos!
Posté le 12-03-2013 à 10:41:48  profilanswer
 


Je sais mais pour rappel, tout algo récursif peut être transformé en itératif (et inversement). Je te conseille vivement une implémentation itérative du alpha-béta pour de meilleures perfs et éviter des plantages dus à la saturation mémoire... :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2179925
breizhbugs
Posté le 12-03-2013 à 12:35:54  profilanswer
 

Plop les gens!
Didon jova, tu as essayé (ou dans l'idée) d'en faire un bot pour mesurer ton IA contre des programmes d'échec automatisés?
(pour éviter de tester en jouant toi même chaque partie par exemple?)
(ou alors organiser la base de ton programme pour faire en sorte que ton IA puisse jouer contre elle même et ses différentes versions?)
(Bon j'avoue que j'ai pas regardé le programme en lui-même (beurk le Ada :pouah:), c'est peut être déjà le cas?)


Message édité par breizhbugs le 12-03-2013 à 12:38:57

---------------
Seul Google le sait...
n°2179927
rufo
Pas me confondre avec Lycos!
Posté le 12-03-2013 à 13:01:31  profilanswer
 

ben c'est ce qu'il fait, son IA joue contre elle-même, c'est pas lui qui joue :o Il peut pas à la fois coder l'algo et jouer les parties pour le tester :D


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
mood
Publicité
Posté le 12-03-2013 à 13:01:31  profilanswer
 

n°2180069
Profil sup​primé
Posté le 12-03-2013 à 19:17:03  answer
 

rufo a écrit :

ben c'est ce qu'il fait, son IA joue contre elle-même, c'est pas lui qui joue :o Il peut pas à la fois coder l'algo et jouer les parties pour le tester :D


 
 
Effectivement.  :jap:  
 
Belle analyse.
 
 
Finalement je suis revenue sur mes premières heuristique, j'obtien des mat en 50 coup contre lui même au niveau 0.
Allé j'y retourne.


Message édité par Profil supprimé le 12-03-2013 à 19:18:18
n°2180284
Profil sup​primé
Posté le 13-03-2013 à 18:24:24  answer
 

Salutations les meilleurs.
 
Je voudrais au moins essayer d'implémenter alpa-beta.
J'ai trouvé un pseudocode que j'arrive à lire, mais que je pige pas encore.
C'est quoi alpha, c'est quoi beta, et quoi n.
Et comment dérécurssiver cette algo, bon si je comprend ce qu'on fait mais non.


Valeur-noeud(n, alpha, beta)
  si n est terminal alors retourner eval(n)
  sinon
    soient f1, ... , fj les fils de n
    si n est max
    alors
      pour i de 1 à j et tant que alpha < beta faire
        alpha <- max(alpha,Valeur-noeud(fi, alpha, beta))
      retourner alpha
    sinon
      pour i de 1 à j et tant que alpha < beta faire
        beta <- min(alpha,Valeur-noeud(fi, alpha, beta))
      retourner beta
    fsi
  fsi
 


 
Source http://www.emn.fr/z-info/pdavid/En [...] -beta.html
 
 
 
Voici déjà mon code Ada Minimax qui déjà donc, n'est sensiblement pas normal.
 

Code :
  1. with Text_Io;
  2. use Text_Io;
  3. package body Games is            
  4.  
  5.  
  6.      
  7.   function ValeurMINI (Game : in Game_Type;
  8.             Depth : in Natural;
  9.             Advers : in Game_Type) return Float;
  10.   function ValeurMAX (Game : in Game_Type;
  11.                Depth : in Natural;
  12.                Advers : in Game_Type) return Float;
  13.  
  14.   function ValeurMINI (Game : in Game_Type;
  15.             Depth : in Natural;
  16.             Advers : in Game_Type) return Float is      
  17.      V_Min : Float := Float'Last;
  18.   begin
  19.      
  20.      if not (game.Heuristic(Game.Usr, Game.pred) > Game.Val_Max) and then
  21.     game.Depth >= Depth then
  22.     
  23.      declare
  24.         
  25.         Successors : Successors_Type := advers.Successors(game.Usr);
  26.         New_Game : Game_Type := advers;
  27.      begin
  28.         
  29.         if Successors.Successor /= 0 then
  30.            for Succ in 1..Successors.Successor loop        
  31.           New_Game.Pred := Game.Usr;
  32.           New_Game.Usr := Successors.Plan(Succ);
  33.           
  34.           declare            
  35.              V_Fils : float := ValeurMAX(New_Game, Depth, game);
  36.           begin
  37.             
  38.              V_Min := Float'Min (V_Min, V_Fils);
  39.           end;
  40.            end loop;
  41.         end if;
  42.      end;
  43.      else
  44.     
  45.      V_Min := Game.Heuristic(Game.Usr, Game.pred);
  46.      end if;
  47.      --Put_Line("MaleurMINI : " & Float'Image(V_Min));
  48.      return V_Min;
  49.   end;
  50.  
  51.  
  52.   function ValeurMAX (Game : in Game_Type;
  53.                Depth : in Natural;
  54.                Advers : in Game_Type) return Float is
  55.      V_Max : Float := Float'First;
  56.   begin    
  57.      if not (game.heuristic(Game.Usr, game.pred) > Game.Val_max) and then    
  58.     advers.Depth >= Depth then
  59.     
  60.      declare
  61.         
  62.         Successors : Successors_Type := advers.Successors(Game.Usr);
  63.         New_Game : Game_Type := Advers;        
  64.      begin                 
  65.                 
  66.  
  67.         if Successors.Successor /= 0 then
  68.           
  69.            for Succ in 1..Successors.Successor loop        
  70.           New_Game.Pred := Game.Usr;
  71.           New_Game.Usr := Successors.Plan(Succ);
  72.           --Print(New_Game.Usr);
  73.           declare
  74.  
  75.              V_Fils : float := ValeurMINI(New_Game, Depth+1, game);
  76.           begin
  77.             
  78.              V_Max := Float'Max(V_Max,V_Fils);    
  79.           end;
  80.            end loop;
  81.         end if;
  82.      end;
  83.      else
  84.      V_Max := Game.Heuristic(Game.Usr, Game.pred);
  85.      end if;
  86.      --Put_Line("ValeurMAXI : " & Float'Image(V_Max));
  87.      return V_Max;
  88.   end;
  89.  
  90.   function MINIMAX (player : in Game_Type; Advers : in Game_Type) return Usr_Type is
  91.      
  92.      Maxime : Float := Float'first;      
  93.      Successors : Successors_Type := Player.Successors(Player.Usr);
  94.      Coup : Usr_Type;
  95.      New_Game : Game_Type := Player;
  96.   begin      
  97.      
  98.      if Successors.Successor /= 0 then
  99.     
  100.      for Succ in 1..Successors.Successor loop        
  101.         
  102.         New_Game.Usr := Successors.Plan(Succ);
  103.         
  104.         declare
  105.           
  106.            Val_Fils : Float := ValeurMINI(New_Game, 0, Advers);
  107.         begin
  108.           
  109.            if Val_Fils > Maxime then
  110.           Put_Line("MINIMAX : " & Float'Image(Val_fils));
  111.           Maxime := Val_Fils;
  112.           Coup := Successors.Plan(Succ);
  113.            end if;
  114.         end;
  115.      end loop;
  116.      end if;
  117.      return coup;
  118.   end;
  119.  
  120.  
  121. end Games;


 
 

n°2181840
Profil sup​primé
Posté le 22-03-2013 à 16:02:59  answer
 

Bonjour, pour la postérité et pour ceux que ça intéresserait, voici mon code final avec élagage alpha-beta.non récursif.
 
 

Code :
  1. with Text_Io;
  2. use Text_Io;
  3. package body Games is            
  4.      
  5.   function ValeurMINI (Game : in Game_Type;
  6.             Depth : in Natural;
  7.             Advers : in Game_Type;
  8.             Alpha : in Float;
  9.             Beta  : in float) return Float;
  10.   function ValeurMAX (Game : in Game_Type;
  11.                Depth : in Natural;
  12.                Advers : in Game_Type;
  13.             Alpha : in Float;
  14.             Beta  : in float) return Float;
  15.  
  16.   function ValeurMINI (Game : in Game_Type;
  17.             Depth : in Natural;
  18.             Advers : in Game_Type;
  19.             Alpha : in Float;
  20.             Beta  : in float) return Float is      
  21.      V_Min : Float := Beta;
  22.      Hcost : Float := game.Heuristic(Game.Usr, Game.pred);
  23.   begin
  24.      
  25.      if not (hcost > 0.0) and
  26.         Game.Depth > Depth then
  27.     
  28.      declare
  29.         V_Fils : Float := Float'Last;
  30.         Successors : Successors_Type := advers.Successors(game.Usr);
  31.         New_Game : Game_Type := Game;
  32.      begin
  33.         
  34.         if Successors.Successor /= 0 then
  35.            for Succ in 1..Successors.Successor loop        
  36.           New_Game.Pred := Game.Usr;
  37.           New_Game.Usr := Successors.Plan(Succ);
  38.           V_Fils := Float'Min (V_Fils, ValeurMAX(New_Game, Depth, Advers, Alpha, V_Min));
  39.           if Alpha >= V_Fils Then
  40.              return V_Fils;
  41.           else
  42.              V_Min := Float'Min (V_Min, V_Fils);
  43.           end if;          
  44.            end loop;
  45.         end if;
  46.      end;
  47.      else    
  48.      V_Min := Hcost;
  49.      end if;
  50.      
  51.      return V_Min;
  52.   end;
  53.  
  54.  
  55.  
  56.   function ValeurMAX (Game : in Game_Type;
  57.                Depth : in Natural;
  58.                Advers : in Game_Type;
  59.             Alpha : in Float;
  60.             Beta  : in float) return Float is
  61.      V_Max : Float := Alpha;
  62.      Hcost : Float := advers.Heuristic(Game.Usr, Game.pred);
  63.   begin    
  64.      if not (hcost > 0.0) and
  65.     
  66.     game.Depth > Depth then
  67.     
  68.      declare
  69.         V_Fils : float := Float'First;
  70.         Successors : Successors_Type := game.Successors(Game.Usr);
  71.         New_Game : Game_Type := game;        
  72.      begin                 
  73.         
  74.         
  75.         if Successors.Successor /= 0 then
  76.           
  77.            for Succ in 1..Successors.Successor loop        
  78.           New_Game.Pred := Game.Usr;
  79.           New_Game.Usr := Successors.Plan(Succ);
  80.           
  81.           V_Fils := Float'Max(V_Fils, ValeurMINI(New_Game, Depth+1, Advers, V_Max, beta));
  82.  
  83.           if V_Fils >= Beta then
  84.              return V_Fils;
  85.           else
  86.              V_Max := Float'Max(V_Max,V_Fils);    
  87.           end if;          
  88.            end loop;
  89.         end if;
  90.      end;
  91.      else
  92.      V_Max := Hcost;
  93.      end if;
  94.      
  95.      return V_Max;
  96.   end;
  97.  
  98.   function MINIMAX (player : in Game_Type; Advers : in Game_Type) return Usr_Type is
  99.      
  100.      Maxime : Float := Float'First;
  101.      
  102.      Successors : Successors_Type := Player.Successors(Player.Usr);
  103.      Coup : Usr_Type;
  104.      New_Game : Game_Type := Player;
  105.   begin      
  106.      
  107.      if Successors.Successor /= 0 then
  108.     
  109.      for Succ in 1..Successors.Successor loop        
  110.         
  111.         New_Game.Usr := Successors.Plan(Succ);
  112.         
  113.         declare
  114.           
  115.            Val_Fils : Float := ValeurMINI(New_Game, 0, Advers, Float'First, Float'last);
  116.         begin
  117.           
  118.            if Val_Fils > Maxime then
  119.           Put_Line("MINIMAX : " & Float'Image(Val_fils));
  120.           Maxime := Val_Fils;
  121.           Coup := Successors.Plan(Succ);
  122.            end if;
  123.         end;
  124.      end loop;
  125.      end if;
  126.      return coup;
  127.   end;
  128.  
  129.  
  130. end Games;


 
Merci au participants du sujet qui ont su me conseiller.


Message édité par Profil supprimé le 22-03-2013 à 16:13:48
n°2181937
Profil sup​primé
Posté le 22-03-2013 à 21:16:16  answer
 

En fait, je ne sais même pas si ce code est valide vue qu'il est très lent et que je n'ai pu faire des tests que niveau zéro et niveau 1.
Je teste couramment niveau 2 mais sans conviction vu que déjà le code niveau 1 donne la même partie que le niveau zéro.
Il me semble avoir corriger tous les bug de mon prog, mais ça doit être loin d'être optimal.
Encore une fois je doute de la consistance de mon implémentation.
Je n'ai pas vraiment su comment formuler (est feuille).
Quant à mon interprétation de l'apha-béta, j'ai une doute, vu la lenteur relative persistante.

n°2181958
Profil sup​primé
Posté le 23-03-2013 à 01:20:50  answer
 

En fait c'est inférieur à zéro dans ValeurMini et supérieur à zéro dans Valeur Maxi ou dans l'inverse.
Et j'ai fait une gourde j'ai testé avec < alpha et > à béta et ça marche pas en fait.
Donc, ça doit bien être < et > à 0.0. Mais qui  sait, j'ai peut-être loupé une truc.
Voilà, je voulais dire aussi que j'ai pas lu grand chose, deux pseudo code, et les valeur des piece. et ici. et un peut cherché la, mais j'y connais toujours rien.
Donc, même si on comprends pas un truc, de la manière dont on nous explique en cherchant on peut parvenir à un bon travail.
Mais le plus important c'est l'heuristique, si t'a une heuristique déséquilibré, ou mal proportionné, c'est fichu.
 
Voici la mienne finalement, enfin, pour le moment.
 

Code :
  1. function Black_heuristic(Echiquier : in Echiquier_Type; Pred : in Echiquier_Type) return Float is
  2.      Ucost : Float := 0.0;        
  3.      Hcost : Float := 0.0;
  4.      Successors : Successors_Type;
  5.      sum : Float := 0.0;
  6.    begin                        
  7.      
  8.       Hcost := (Total(Echiquier.Black, Echiquier.Black_last) -  (Total(pred.Black, pred.Black_last)));
  9.      
  10.       for Line in Line_Type loop
  11.       for Colum in Colum_Type loop
  12.          if Echiquier.Board(Line, Colum).piece in BK..BP then
  13.         declare
  14.            The_Successors : Successors_Type;
  15.                 begin
  16.                Echiquier_Succ(Echiquier.Board(Line, Colum).Piece)(Echiquier, Line, Colum, The_Successors);
  17.                case Echiquier.board(Line, Colum).Piece is
  18.                   when Empty =>
  19.                  null;
  20.                   when BK =>
  21.                  Sum := Sum + Float(The_Successors.Successor) * King_Val/50.0;
  22.                   when BQ =>
  23.                  Sum := Sum + Float(The_Successors.Successor) * Queen_Val/50.0;
  24.                   when BC =>
  25.                  Sum := Sum + Float(The_Successors.Successor) * Chavalier_Val/50.0;
  26.                   when BV =>
  27.                  Sum := Sum + Float(The_Successors.Successor) * Valey_Val/50.0;
  28.                   when BT =>
  29.                  Sum := Sum + Float(The_Successors.Successor) * Tower_Val/50.0;
  30.                   when BP =>
  31.                  Sum := Sum + Float(The_Successors.Successor) * Pion_Val/50.0;
  32.                   when others =>
  33.                  null;
  34.                end case;
  35.                 end;
  36.              end if;
  37.           end loop;
  38.      end loop;
  39.      Hcost := Hcost + Sum;
  40.           
  41.      
  42.      
  43.      Sum := 0.0;
  44.      
  45.            
  46.      for Line in Line_Type loop
  47.           for Colum in Colum_Type loop
  48.              if Echiquier.Board(Line, Colum).piece in WK..WP then
  49.                 declare
  50.                The_Successors : Successors_Type;
  51.                 begin
  52.                Echiquier_Succ(Echiquier.Board(Line, Colum).Piece)(Echiquier, Line, Colum, The_Successors);
  53.                case Echiquier.board(Line, Colum).Piece is
  54.                   when Empty =>
  55.                  null;
  56.                   when WK =>
  57.                  Sum := Sum + Float(The_Successors.Successor) * King_Val/50.0;
  58.                   when WQ =>
  59.                  Sum := Sum + Float(The_Successors.Successor) * Queen_Val/50.0;
  60.                   when WC =>
  61.                  Sum := Sum + Float(The_Successors.Successor) * Chavalier_Val/50.0;
  62.                   when WV =>
  63.                  Sum := Sum + Float(The_Successors.Successor) * Valey_Val/50.0;
  64.                   when WT =>
  65.                  Sum := Sum + Float(The_Successors.Successor) * Tower_Val/50.0;
  66.                   when WP =>
  67.                  Sum := Sum + Float(The_Successors.Successor) * Pion_Val/50.0;
  68.                   when others =>
  69.                  null;
  70.                end case;
  71.                 end;
  72.              end if;
  73.           end loop;
  74.      end loop;
  75.      
  76.      hcost := hcost - Sum;
  77.         
  78.      
  79.      
  80.      
  81.      
  82.  
  83.      
  84.      
  85.      Sum := 0.0;
  86.      Successors  := White_Successors(echiquier);        
  87.      if Successors.Successor /= 0 then          
  88.      for I in 1..Successors.Successor loop
  89.         declare
  90.            Tmp : Echiquier_Type := Successors.Plan(i);
  91.         begin
  92.            Sum := Sum + (Total(Tmp.White, Tmp.White_last) - Total(Echiquier.White, Echiquier.White_Last));               
  93.         end;
  94.         
  95.      end loop;               
  96.      Ucost := Sum / Float(Successors.Successor);    
  97.      end if;
  98.      
  99.      return (Hcost - ucost);
  100.    end Black_Heuristic;


Evidamment c'est l'inverse pour les blancs.
 
 
Faut tester avec plein de valeur de pieces aussi c'est intéressant.
 
La je joue niveau 5 en quelque seconde. ça devais pas être ça. oops.  [:clooney8]  
Voici l'ouverture du coup 9 des blancs.

    A   B   C   D   E   F   G   H
 
 8   BT      BV  BQ  BK  BV      BT
 
 7           BP  BP  BP  BP
 
 6   BP      BC              BP  BP
 
 5       BP                  WP
 
 4   WP  WP          BC
 
 3   WV      WC          WC      WP
 
 2           WP  WP  WP  WP
 
 1   WT          WQ  WK  WV      WT
 
White :
Black :
Total White :  0.00000E+00
Total Black :  0.00000E+00
White Heuristic : -8.53448E+00
Black Heuristic : -4.55769E+01
White timer : 00:01:07
Black timer : 00:00:56
 
Les noirs jouent pour le coup N 9
MINIMAX : -5.15769E+01
MINIMAX : -4.15769E+01
MINIMAX : -3.29231E+01
MINIMAX : -2.60000E+01
MINIMAX : -2.59286E+01


 
 
En fait je suis en train d'écrire j'ai pas vérifier si ça respecte bien les règles d'échecs, mais ça njoue vite et plutôt bien donc, puisque la situation d'éuquilibre deumeure au 40eme coup, avec un bug à 3 pions à 4. je vais teste niveau 10 ou 15 maintenant.
 
Voilà, je me repassionne pour les échecs du coups.


Message édité par Profil supprimé le 23-03-2013 à 01:28:53
n°2182346
Profil sup​primé
Posté le 25-03-2013 à 19:42:04  answer
 

Ca marche pas, et ça commence à m'enerver, alors, je viens demander votre aide.

n°2183218
Profil sup​primé
Posté le 29-03-2013 à 19:55:31  answer
 

Bonjour,
 
 
 
 
L'algo, c'est encore une question, NegaMax, c'est la même chose que minmax ?

n°2183250
Profil sup​primé
Posté le 29-03-2013 à 22:52:11  answer
 

Bon, j'ai mis un mois à saisir qu'il fallait que j'appel min en premier, je ne désespère pas de trouver sur combien de niveau l'appeller.

n°2183258
Profil sup​primé
Posté le 29-03-2013 à 23:25:49  answer
 

rufo a écrit :

Fais pas du récursif :/ C'est lent et ça pompe trop de mémoire...


 
 
J'ai essayé, j'ai échoué, le récursif est plus rapide.

n°2183304
Profil sup​primé
Posté le 30-03-2013 à 14:43:01  answer
 

J'ai re-essayé, j'ai réussi normalement. [:dawa_neowen]
Version X parce que les version en les compte plus, c'est même la X-0.2.  :D  
Ca fait 30 jour pile que j'ai commencé le truc. J'ai mis 8 heure à coder les successeurs et 15 jour à les débuger.
En suite j'ai mis 1( jours pour débuguer réimplémenter les algo MinMax et NégaMax, au moins 10 fois, alors, que mon erreur que j'ai introduite au cour du mois était du au calcul en moyen des pertes sur un coup.
J'ai optmimiser la structure du programme en passant un pointeur sur un game_type au lieu de copier un ame_type.
Et j'ai implémenter un algo random, mais qui doit pas fonctionner puisque c'est du randum.
Merci encore.

n°2183383
Profil sup​primé
Posté le 01-04-2013 à 02:33:04  answer
 


 
 
Raté. lol

n°2183384
Profil sup​primé
Posté le 01-04-2013 à 05:15:24  answer
 


 
Rien n'est moins certain en fait.
 
Mais mon jeux marche toujours pas.

n°2183573
Profil sup​primé
Posté le 02-04-2013 à 14:00:47  answer
 

Pour la mise en appliation les gars, faura revoir votre politique. Non ?  :sweat:

n°2184470
Profil sup​primé
Posté le 06-04-2013 à 13:41:54  answer
 

Bon en l'occurrence je commence par appeler Min
Je fais bien depth - 1 dans chacun des deux sauf que je donne un pair comme depth max.
Et je renvoie la négation de la valeur d'un coup dans min.
Je pense que le plus important est d'exécuter Min et Max au moins une fois.
j'ai trouvé un code qui à l'air de fonctionner, mais je suis pas convaincu de quoi que ce soit.
Du coup, je vous refile l'adresse des sources de DoChess écrit avec Ada
Merci encore pour votre aide.
 
Au prochain bug.  :hello:

n°2184940
Profil sup​primé
Posté le 09-04-2013 à 13:40:42  answer
 

Je laisee tomber, ça joue encore échecs. J'abandonne. De la mouise ce minmax.


Message édité par Profil supprimé le 09-04-2013 à 13:41:10
n°2201774
Profil sup​primé
Posté le 04-09-2013 à 17:21:58  answer
 

Bonjour, je viens donner des nouvelle, malheureusement je ne peux encore vous donner les sources de manque d'hébergement.
Normalement j'ai corriger les 5 algo de multichess-4.0.0 et ça joue aléatoirement avec les 5 algo niveau 0 et 1.
Je suis encore en cour de test.
Mais vous aurez corrigé par vous même je suis certain.
Merci encore, peut-être que finalement, minimax c'est pas si mal pour jouer au échecs.

n°2201833
Profil sup​primé
Posté le 05-09-2013 à 03:45:15  answer
 

Avec les caractères Unicode s'il vous plaît !
Mais bien sur M. le client.
 

Previsious algo is : NegaMax.
 
 
       A       B       C       D       E       F       G       H    
    ---------------------------------------------------------------
   |       |       |       |       |       |       |       |       |        
 8 |   ♜   |   ♞   |       |       |       |       |       |       |
   |       |       |       |       |       |       |       |       |        
    ---------------------------------------------------------------
   |       |       |       |       |       |       |       |       |        
 7 |   ♟   |   ♝   |       |       |   ♚   |       |       |   ♗   |
   |       |       |       |       |       |       |       |       |        
    ---------------------------------------------------------------
   |       |       |       |       |       |       |       |       |        
 6 |       |   ♟   |       |       |       |       |       |       |
   |       |       |       |       |       |       |       |       |        
    ---------------------------------------------------------------
   |       |       |       |       |       |       |       |       |        
 5 |       |   ♕   |   ♟   |   ♟   |   ♞   |       |       |       |
   |       |       |       |       |       |       |       |       |        
    ---------------------------------------------------------------
   |       |       |       |       |       |       |       |       |        
 4 |       |       |       |       |       |   ♛   |       |       |
   |       |       |       |       |       |       |       |       |        
    ---------------------------------------------------------------
   |       |       |       |       |       |       |       |       |        
 3 |   ♙   |       |   ♙   |       |       |       |       |   ♙   |
   |       |       |       |       |       |       |       |       |        
    ---------------------------------------------------------------
   |       |       |       |       |       |       |       |       |        
 2 |   ♖   |       |       |       |   ♔   |       |   ♙   |       |
   |       |       |       |       |       |       |       |       |        
    ---------------------------------------------------------------
   |       |       |       |       |       |       |       |       |        
 1 |   ♗   |   ♘   |       |       |       |       |   ♘   |   ♖   |
   |       |       |       |       |       |       |       |       |        
    ---------------------------------------------------------------
White : ♟♟♜♟♟♝
Black : ♙♙♙♙
White timer : 00:00:13
Black timer : 00:00:14
 
Les noirs jouent pour le coup N 72
NegaMax :


 
Le projet MultiChess est maintenant rattaché au projet Warborg. Vous pouvez retrouver Warborg-Chess_Solver sur sourceforge.net projet Warborg.


Message édité par Profil supprimé le 05-09-2013 à 03:52:26
n°2228252
par l'anne​au de l'ia
word master
Posté le 16-05-2014 à 20:02:20  profilanswer
 

Bonjour,
 
 
Je reviens parce que mon Negamax ne foctionnne toujours pas.
Le problème est visible par un coups d'échec, Negamax peu retourner une valeur théoriquement éronnée.
Je suppose que mon heuristique est correcte, alors j'incrémine Négamax en fait.
Si vous avez le temps de vérifir mon code, merci pour vos retours.
 
Voici mon code actuel: (écrit avec Ada)
 
 

Code :
  1. -- Negamax avec élagage.
  2.   function NegaMax (player : in Game_Access; Advers: in Game_Access; Depth : in Natural; A, B : in Float; Side : in Boolean := True) return float is
  3.      Alpha : Float := A;
  4.      Beta  : Float := B;
  5.      begin
  6.      if ((not Player.Terminator(player.Usr)) and (not advers.Terminator(player.Usr))) and then
  7.        Depth > 0 then
  8.         declare
  9.            V_Fils  : Float := 0.0;
  10.            Best    : Float := Float'First;
  11.            New_player : Game_Access;
  12.            New_advers : Game_Access;
  13.            Successors : Successors_Type;
  14.         begin
  15.           
  16.            New_advers := new Game_Type ' (Player.all);
  17.            New_player := new Game_Type ' (Advers.all);
  18.           
  19.            Successors := advers.Successors(New_player.Usr);
  20.            for Succ in 1..Successors.Last loop                  
  21.           New_Player.Usr := Successors.Plan(Succ);          
  22.           V_Fils := -NegaMax(New_Player, New_Advers, Depth-1, -Beta, -Alpha, not side);
  23.           Best := Float'Max(V_Fils, Best);
  24.           Alpha := Float'Max(V_fils, alpha);
  25.           if Alpha >= Beta then
  26.              exit;
  27.           end if;
  28.            end loop;
  29.            return Best;
  30.         end;
  31.      else
  32.         return player.Heuristic(player.usr, advers.usr);
  33.      end if;
  34.      end negaMax;


 
 
Voici mon appel.
 

Code :
  1. -- Appel de Negamax pour les deux joueur.
  2. -- On doit pour les deux Jouers avec une profondeur paire.
  3.   function jovajovi(player : in Game_Access; Advers : in Game_Access; Side : in boolean) return Usr_Type is
  4.      Maxime : Float := Float'First;
  5.     
  6.      Successors : Successors_Type := player.Successors(player.Usr);
  7.      Coup : Usr_Type;      
  8.      begin          
  9.      Text_Io.Put_Line("NegaMax : " );
  10.      if Successors.Last /= 0 then    
  11.         for Succ in 1..Successors.Last loop        
  12.           
  13.            player.usr := Successors.Plan(Succ);
  14.           
  15.            declare          
  16.           Val_Fils : Float := negamax(Player, Advers, Player.Depth, Float'First, Float'Last, side);
  17.            begin
  18.           
  19.           if Val_Fils > Maxime then
  20.              --Put_Line(Float'Image(Val_fils));
  21.              Maxime := Val_Fils;
  22.              Coup := Successors.Plan(Succ);
  23.              player.System.Movement := Movement_Type(Succ);
  24.           end if;
  25.            end;
  26.         end loop;
  27.      end if;
  28.      return coup;
  29.      end Jovajovi;


 
Je vais relire, ça me fera du bien.

n°2228256
par l'anne​au de l'ia
word master
Posté le 16-05-2014 à 20:42:56  profilanswer
 

Arf, ça fait 5 minutes que ça tourne pas d'erreur.
 
Désolé pour le dérangement, j'avais mis le roi potentiellement à une valeur inférieur aux autres pièces.
 
Merci en tout cas.  :whistle:

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
avis site web (bonne section?)Remplacer une partie de texte par une autre dans un fichier texte
Développer la partie PHP d'abord ?Script Javascript - Fond d'une partie du site
[ORACLE OCI] Select sur un clob ne retourne qu'une partie du contenuje suis bloqué dans une partie de mon prg
[BATCH] Lire une certaine partie d'un fichier textecode ça marche mais se n'est pas une bonne execution
besoin d'explication du fonctionnement de cette partie de programme![MySQL] update une partie d'un champ ?
Plus de sujets relatifs à : [Algo] Vous ne préférez pas une bonne partie d'échecs ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR