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

 


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

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

n°2177410
Profil sup​primé
Posté le 25-02-2013 à 16:11:52  answer
 

Reprise du message précédent :
Un roi ne peut pas se faire prendre.
 
Si non comment il le pourrait si ne vaut pas de point.
 
Comment compte t'on ?  :heink:

mood
Publicité
Posté le 25-02-2013 à 16:11:52  profilanswer
 

n°2177411
rufo
Pas me confondre avec Lycos!
Posté le 25-02-2013 à 16:14:06  profilanswer
 

Ben si le roi peut se faire prendre : c'est le mat, ce qui arrête la partie.


---------------
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°2177419
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 25-02-2013 à 16:52:13  profilanswer
 

rufo a écrit :

Ben si le roi peut se faire prendre : c'est le mat, ce qui arrête la partie.


voila, donc dans ton algo, tu vas affecter une valeur très élevée au noeud de ton arbre qui représente la position dans laquelle le roi se fait prendre


---------------
J'ai un string dans l'array (Paris Hilton)
n°2177484
rufo
Pas me confondre avec Lycos!
Posté le 26-02-2013 à 09:47:09  profilanswer
 

J'imagine qu'il fait distinguer la valeur affectée au roi de l'adversaire et le sien : une forte valeur si on prend le roi adverse mais au contraire une très faible valeur si le coup qu'on va jouer conduira par la suite à se faire prendre le sien... La valeur 0.0 mentionnée par Jovalise représente sans doute le valeur de son propre roi (pas la valeur du roi adverse).


---------------
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°2177530
Profil sup​primé
Posté le 26-02-2013 à 12:35:26  answer
 

Ca dépend de la logique des (+, -) après.

n°2177531
Profil sup​primé
Posté le 26-02-2013 à 12:37:27  answer
 

Heureusement que j'ai pas commencé, je serais déjà arrêté.  :o  
 
Si non, donc, vous auriez plus d'info ou quoi parce que là.  :D

n°2177538
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 26-02-2013 à 13:05:29  profilanswer
 

Une très bonne explication claire du minimax : http://www.flyingmachinestudios.co [...] g/minimax/


---------------
J'ai un string dans l'array (Paris Hilton)
n°2177703
Profil sup​primé
Posté le 27-02-2013 à 10:14:11  answer
 

Oui, oui, minimx, on aura compris.
 
Mais pour l'évaluation du jeux d'échec, et l'application des règles ca ce programme comment ?

n°2177706
PB-
Posté le 27-02-2013 à 10:22:55  profilanswer
 

Bah y a 70 ans un mec assez connu à fait une fonction d'évaluation elle même très connue ; tu devrais pouvoir t'en inspirer.
Quelque chose comme : evaluation(position) = (P−P′) + 3(N−N′+B−B′)+ 5(R−R′) + 9(Q−Q′) + 200(K−K′)−0.5(D−D′+S−S′+I−I′)+ 0.1(M−M′)

 

Avec les lettres = tes pièces les primes = pièces de l'adversaire et D les pions doublés, S les pions isolées et M la mobiilité.

 

C'est tout simple mais déjà tu peux battre un humain moyen avec ça.

 

Inutile de dire que contre un top programme ça ne suffit pas (tout comme minmax/alpha-beta ne suffient pas).

 

Sans indiscrétion tu es en quoi ?

Message cité 1 fois
Message édité par PB- le 27-02-2013 à 10:23:56
n°2177713
Profil sup​primé
Posté le 27-02-2013 à 11:17:51  answer
 

PB- a écrit :


 
Sans indiscrétion tu es en quoi ?


 
Je suis en acier.
 
Je suis pas étudiant, je cogite un jeu. je voudrait voir ce que va donner minimax sur un jeux d'échecs, avec peut-être élagage, contre lui même déjà.
 
Merci P-B-
 
Je vais voir si je peux améliorer mon heuristique avec ta fonction. Que je teste avec A* : http://80.15.188.151/others/WChess-0.2.0.tar.gz avec Ada.
Ca joue, mais ça plante au 8 ou 9eme coup. Mais ça joue. Bref, je met à minimax demain probablement.
 
Et pour mon arbre, comment ça s'appelle un arbre adapté à mon problème ?
Merci, si non, je me démerderai.

mood
Publicité
Posté le 27-02-2013 à 11:17:51  profilanswer
 

n°2177739
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-02-2013 à 13:06:48  profilanswer
 


Un Graphe Acyclique Dirigé (Acyclique car pas de boucle, Dirigé car dans un seul sens -du haut vers le bas-)

 

edit: je vois toujours pas à quoi tu joues avec A* qui n'a strictement rien à voir avec la choucroute

Message cité 1 fois
Message édité par Harkonnen le 27-02-2013 à 13:07:34

---------------
J'ai un string dans l'array (Paris Hilton)
n°2177749
Profil sup​primé
Posté le 27-02-2013 à 13:38:35  answer
 

Harkonnen a écrit :


Un Graphe Acyclique Dirigé (Acyclique car pas de boucle, Dirigé car dans un seul sens -du haut vers le bas-)


Du haut vers le bas... Bon d'accord, je vais voir ce que je peux faire.

Harkonnen a écrit :


edit: je vois toujours pas à quoi tu joues avec A* qui n'a strictement rien à voir avec la choucroute


 
Si je lui donne le point terminal ?
Enfni, j'y suis pas arrivé encore.

n°2177751
rufo
Pas me confondre avec Lycos!
Posté le 27-02-2013 à 13:49:54  profilanswer
 

Le point terminal, tu peux pas savoir puisqu'il existe des milliers de configurations dans lesquelles toi ou l'adversaire peuvent être mat (et je parle même pas des situations de pat).


---------------
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°2177897
Profil sup​primé
Posté le 28-02-2013 à 05:55:47  answer
 

Y a qu'à choisir...
 
 
Je suis encore sur A* =
 
Je sais je vais vous décourager.  :D  
 

    A  B  C  D  E  F  G  H
 
 8                 BV      
 7  BP          BP WC      
 6  WP    BT                
 5                 WP      
 4                          
 3                          
 2                          
 1  WT WC WV WQ WK WV      
White : (BP, 1.00000E+02), (BP, 1.00000E+02), (BV, 4.00000E+02), (BC, 3.00000E+02), (BP, 1.00000E+02), (BP, 1.00000E+02), (BP, 1.00000E+02), (BQ, 9.00000E+02), (BP, 1.00000E+02), (BT, 5.00000E+02), (BC, 3.00000E+02), (BK, 4.10000E+03),  
Black : (WP, 1.00000E+02), (WP, 1.00000E+02), (WP, 1.00000E+02), (WP, 1.00000E+02), (WP, 1.00000E+02), (WP, 1.00000E+02), (WT, 5.00000E+02),  
Les noirs jouent pour le coup N° 46
Black Mat.


 
Premier parti Noirs mat en 45.5 coups. Avec la liste des points gagnés.
 
Mais ça joue mal, mais ça joue.
 
Je recommence... Non, je vais me coucher. +A Comme dirait Gilou.

n°2178104
Profil sup​primé
Posté le 01-03-2013 à 10:41:46  answer
 

J'attaque Minimax mais j'ai un problème de lecture.
 
Dans le code ci dessous, dans ValeurMini et ValeurMaxi on fait un pour tous les successeurs de P, mais c'est N qui est donné, alors je voulais savoir si il n'y a pas une erreur et si c'est bien pour tous les successeur de N ?
Merci

Code :
  1. procedure Main is
  2.  
  3.   function ValeurMINI ( N ) is
  4.   begin
  5.      if Feuille( N )= Vrai Then
  6.         return F(N);
  7.      else
  8.         V_Min = MAX_VAL;
  9.         for *) Chacune Fils = Successeur(P) loop
  10.            V_Fils = ValeurMAX(Fils);
  11.            V_Min = Min (V_Min, V_Fils);
  12.         end loop;
  13.      end if;
  14.      return V_Min;
  15.   end;
  16.  
  17.  
  18.   function ValeurMAX ( N ) is
  19.   begin
  20.      if Feuille( N )= Vrai Then
  21.         return F(N)
  22.      else
  23.           V_Max = -MAX_VAL;
  24.           for *) Chacune Fils = Successeur(P) loop
  25.              V_Fils = ValeurMINI(Fils);
  26.              V_Max= Max(V_Max,V_Fils);
  27.           end loop;
  28.      end if;
  29.      return V_Max;
  30.   end;
  31.  
  32.  
  33.   function MINIMAX( P) is
  34.      Maxime = -MAX_VAL;
  35.   begin
  36.      for *) Chacune Fils = Successeur(P) loop
  37.         Val_Fils = ValeurMINI(Fils);
  38.         if Val_Fils > Maxime Then
  39.            Maxime = Val_Fils;
  40.            Coup = Fils;
  41.         end if;
  42.      end loop;
  43.      return Coup;
  44.   end;
  45.  
  46.  
  47. begin
  48.   null;
  49. end Main;

n°2178218
Profil sup​primé
Posté le 01-03-2013 à 19:31:25  answer
 

Implémentation avec Ada de Minimax façon pseudo générique pour un jeu d'échecs.

Code :
  1. generic
  2.   type Usr_Type is private;      
  3. package Games is            
  4.  
  5.   type Heuristic_Access is
  6.     access function (Usr : in Usr_Type) return Float;
  7.  
  8.   type Plan_Type is array(Positive range <> ) of Usr_Type;
  9.  
  10.   type Successors_Type is
  11.      record
  12.      Plan       : Plan_Type(1..1024);
  13.      Successor  : Natural := 0;
  14.      end record;
  15.  
  16.   type Move_Access is
  17.     access function (Usr : in Usr_Type) return Successors_Type;      
  18.  
  19.   type Game_Type is
  20.      record
  21.      Usr        : Usr_Type;
  22.      Heuristic  : Heuristic_Access;
  23.      Successors : Move_Access;
  24.      end record;
  25.      
  26.   function MINIMAX(Game : in Game_Type) return Usr_Type;
  27.  
  28. end Games;


Code :
  1. package body Games is            
  2.  
  3.   function ValeurMINI (Game : in Game_Type) return Float;
  4.   function ValeurMAX (Game : in Game_Type) return Float;
  5.  
  6.   function ValeurMINI (Game : in Game_Type) return Float is
  7.      
  8.       V_Min : Float := Float'Last;
  9.   begin
  10.      
  11.      if Game.Heuristic(Game.Usr) > 0.0 then
  12.     
  13.      declare
  14.         
  15.         Successors : Successors_Type := Game.Successors(Game.Usr);
  16.         New_Game : Game_Type := Game;
  17.      begin
  18.         
  19.         if Successors.Successor /= 0 then
  20.            for Succ in 1..Successors.Successor loop        
  21.           
  22.           New_Game.Usr := Successors.Plan(Succ);
  23.           
  24.           declare
  25.             
  26.              V_Fils : float := ValeurMAX(New_Game);
  27.           begin
  28.             
  29.              V_Min := Float'Min (V_Min, V_Fils);
  30.           end;
  31.            end loop;
  32.         end if;
  33.      end;
  34.      else
  35.     
  36.      V_Min := Game.Heuristic(Game.Usr);
  37.      end if;
  38.      return V_Min;
  39.   end;
  40.  
  41.  
  42.   function ValeurMAX (Game : in Game_Type) return Float is
  43.      V_Max : Float := Float'First;
  44.   begin    
  45.      
  46.      if Game.Heuristic(Game.Usr) > 0.0 then
  47.       
  48.      declare
  49.         
  50.         Successors : Successors_Type := Game.Successors(Game.Usr);
  51.         New_Game : Game_Type := Game;        
  52.      begin                 
  53.                 
  54.  
  55.         if Successors.Successor /= 0 then
  56.           
  57.            for Succ in 1..Successors.Successor loop        
  58.           
  59.           New_Game.Usr := Successors.Plan(Succ);
  60.           
  61.           declare
  62.             
  63.              V_Fils : float := ValeurMINI(New_Game);
  64.           begin
  65.             
  66.              V_Max := Float'Max(V_Max,V_Fils);    
  67.           end;
  68.            end loop;
  69.         end if;
  70.      end;
  71.      else
  72.      V_Max := Game.Heuristic(Game.Usr);
  73.      end if;
  74.      
  75.      return V_Max;
  76.   end;
  77.  
  78.   function MINIMAX (Game : in Game_Type) return Usr_Type is
  79.      Maxime : Float := Float'First;      
  80.      Successors : Successors_Type := Game.Successors(Game.Usr);
  81.      Coup : Usr_Type;
  82.      New_Game : Game_Type := Game;
  83.   begin      
  84.      
  85.      if Successors.Successor /= 0 then
  86.     
  87.      for Succ in 1..Successors.Successor loop        
  88.         
  89.         New_Game.Usr := Successors.Plan(Succ);
  90.         
  91.         declare
  92.           
  93.            Val_Fils : Float := ValeurMINI(New_Game);
  94.         begin
  95.           
  96.            if Val_Fils > Maxime then
  97.           
  98.           Maxime := Val_Fils;
  99.           Coup := Successors.Plan(Succ);
  100.            end if;
  101.         end;
  102.      end loop;
  103.      end if;
  104.      return coup;
  105.   end;
  106. end Games;


 
Les sources complète du jeu d'échecs sans les heuristique : http://80.15.188.151/dev/MinimaxChess-0.0.1.tar.gz
 
Donc, il le reste les heuristiques à écrire.

n°2178313
Profil sup​primé
Posté le 02-03-2013 à 18:41:30  answer
 

Bon, j'ai mis au point une heuristique, mais elle est pas au point encore.
 
Si vous pouviez jeter un oeil...
Je suis perdu dans les calcul.
Pour le moment, elle retourne 0.0 au départ en suite l'avantage de l'un et au désavantage de lautre. mais le jeu est obscure quand même.
Bon, je vous donne mon heuristique puis je vais vérifier mon prog.
 

Code :
  1. function Black_heuristic(Echiquier : in Echiquier_Type) return Float is
  2.      Ucost : Float := 0.0;        
  3.      Hcost : Float := 0.0;
  4.      Successors : Successors_Type;
  5.      Count : Float := (8.0*1.0+2.0*5.0+2.0*3.0+2.0*4.0+9.0+100.0);
  6.      sum : Float := 0.0;
  7.   begin                        
  8.      Hcost := Count - (total(Echiquier.Black, Echiquier.Black_last));
  9.      Hcost := hcost - (Count - (Total(Echiquier.White, Echiquier.White_last)));
  10.      Successors  := Black_Successors(echiquier);      
  11.      
  12.      if Successors.Successor /= 0 then
  13.           for I in 1..Successors.Successor loop
  14.              declare
  15.                 Tmp : Echiquier_Type := Successors.Plan(i);
  16.              begin
  17.            Sum := Sum - (Total(Tmp.Black, Tmp.Black_last) - Total(Echiquier.Black, Echiquier.Black_last));
  18.                 Sum := Sum + (Count - (Total(Tmp.White, Tmp.White_last) - Total(Echiquier.White, Echiquier.White_last)));
  19.                
  20.              end;
  21.              
  22.           end loop;    
  23.           Sum := (Sum/Float(Successors.Successor));
  24.           Ucost := sum + Float(Successors.Successor)/10.0;
  25.      end if;      
  26.      Sum := 0.0;
  27.      Successors  := white_Successors(echiquier);        
  28.      if Successors.Successor /= 0 then          
  29.           for I in 1..Successors.Successor loop
  30.              declare
  31.                 Tmp : Echiquier_Type := Successors.Plan(i);
  32.              begin
  33.                
  34.                 Sum := Sum - (Count - (Total(Tmp.White, Tmp.White_last) - Total(Echiquier.White, Echiquier.White_Last)));
  35.            Sum := Sum + (Total(Tmp.Black, Tmp.Black_last) - Total(Echiquier.Black, Echiquier.Black_last));
  36.           
  37.              end;
  38.              
  39.           end loop;    
  40.           Sum := (Sum/Float(Successors.Successor));
  41.           Ucost := Ucost + (Sum - Float(Successors.Successor)/10.0);
  42.      end if;      
  43.      return Hcost + Ucost;--Ucost + (Hcost - (8.0*1.0+2.0*5.0+2.0*3.0+2.0*4.0+9.0+100.0));
  44.   end Black_Heuristic;


Code :
  1. function White_heuristic(Echiquier : in Echiquier_Type) return Float is
  2.      Ucost : Float := 0.0;        
  3.      Hcost : Float := 0.0;
  4.      Successors : Successors_Type;
  5.      Count : Float := (8.0*1.0+2.0*5.0+2.0*3.0+2.0*4.0+9.0+100.0);
  6.      Sum : Float := 0.0;
  7.   begin                  
  8.      Hcost := Count - (Total(Echiquier.White, Echiquier.White_last));
  9.      Hcost := Hcost - (Count - (total(Echiquier.Black, Echiquier.Black_Last)));      
  10.      Successors  := white_Successors(echiquier);
  11.      if Successors.Successor /= 0 then
  12.           for I in 1..Successors.Successor loop
  13.              declare
  14.                 Tmp : Echiquier_Type := Successors.Plan(i);
  15.              begin
  16.                 Sum := Sum - (Total(Tmp.White, Tmp.White_last) - Total(Echiquier.White, Echiquier.White_last));
  17.                 Sum := Sum + (Count - (Total(Tmp.Black, Tmp.Black_last) - Total(Echiquier.Black, Echiquier.Black_last)));
  18.              end;
  19.              
  20.           end loop;    
  21.           Sum := (Sum/Float(Successors.Successor));
  22.           Ucost := Sum + Float(Successors.Successor)/10.0;
  23.      end if;      
  24.      Sum := 0.0;
  25.      Successors  := black_Successors(echiquier);        
  26.      if Successors.Successor /= 0 then          
  27.           for I in 1..Successors.Successor loop
  28.              declare
  29.                 Tmp : Echiquier_Type := Successors.Plan(i);
  30.              begin
  31.                 Sum := Sum - (Count - (Total(Tmp.Black, Tmp.Black_last) - Total(Echiquier.Black, Echiquier.Black_last)));
  32.                 Sum := Sum + (Total(Tmp.White, Tmp.White_last) - Total(Echiquier.White, Echiquier.White_Last));
  33.           
  34.              end;
  35.     
  36.           end loop;    
  37.           Sum := (Sum/Float(Successors.Successor));
  38.           Ucost := Ucost + (Sum - Float(Successors.Successor)/10.0);
  39.      end if;      
  40.      return Hcost + Ucost;
  41.      
  42.      
  43.   end White_Heuristic;


 
Les sources complète avec un certain équilibre du jeu. Mais donc, je suis perdu dans les heuristiques.
http://80.15.188.151/Applications/ [...] 0.0.tar.gz
 
Merci.
 
 
Par exemple, je me trouve dans cette situation ou un pion noir menace le roi, mais celui ci n'a pas fuit. Entre autre anomalie probable.

    A  B  C  D  E  F  G  H
 
 8              BT       BT
 7  BP BP                  
 6  BC          BK       BQ
 5        BP    BP    WT    
 4        WP BP            
 3  WP WP    WP WK          
 2           WT WV          
 1  BV    WV WQ    WC      
White : (BP, 1.00000E+00), (BP, 1.00000E+00), (BC, 3.00000E+00), (BV, 4.00000E+00), (BP, 1.00000E+00),  
Black : (WP, 1.00000E+00), (WP, 1.00000E+00), (WC, 3.00000E+00), (WP, 1.00000E+00), (WP, 1.00000E+00),  
Les noirs jouent pour le coup N° 46
Total White :  1.00000E+01
Total Black :  7.00000E+00
 
White Heuristic : -2.92902E-01
Black Heuristic :  2.92908E-01


Message édité par Profil supprimé le 02-03-2013 à 18:53:08
n°2178314
Profil sup​primé
Posté le 02-03-2013 à 19:02:05  answer
 

Peut-être qu'en autant ucost à hcost en fin d'algo, c'est mieux.
 
J'y retourne.  :whistle:

n°2178315
Profil sup​primé
Posté le 02-03-2013 à 19:27:46  answer
 

Peut-être qu'en autant hcost à ucost en fin d'algo, c'est encore plus existant . [:bounce]
 

Spoiler :

[:dawa]


 

n°2178319
Profil sup​primé
Posté le 02-03-2013 à 20:24:37  answer
 

Yep !
 
J'ai apporté quelque modif à mon algo, je pense rien que vous ne sachiez faire vous même.
Ca marche un poil mieu, cependant, à présent je pense que les valeur de mes pieces ne sont pas bonne.
 
Par exemple, un reine qui vient se mettre en danger par l'appât d'une fourchette sur une tour et un fou c'est pas normal.
Donc, peut-être y a -t- il des valeur plus juste des pièces.
 
Mais bon. Je suis qu'un amateur, pas une calculette.

n°2178378
Profil sup​primé
Posté le 03-03-2013 à 14:55:50  answer
 

Ca me parait logique de faire un roi à zéro points.
Par contre il doit avoir un max de facteur de mouvement.
 
/note

n°2178425
Profil sup​primé
Posté le 03-03-2013 à 18:28:34  answer
 

Du coup, j'ai implémenter un calcul de mobilité un poil plus précis que le précédent.
Bon, mais maintenant on cherche le mat et pas la prise du roi.
 
http://80.15.188.151/dev/MinimaxChess-1.2.0.zip
http://80.15.188.151/dev/MinimaxChess-1.2.0.tar.gz
 

Code :
  1. -- Heuristique pour les black.
  2.   function Black_heuristic(Echiquier : in Echiquier_Type) return Float is
  3.      Ucost : Float := 0.0;        
  4.      Hcost : Float := 0.0;
  5.      Successors : Successors_Type;
  6.      sum : Float := 0.0;
  7.   begin                        
  8.      Hcost := Count - (Total(Echiquier.White, Echiquier.White_last));
  9.      Hcost := Hcost - (Count - (total(Echiquier.Black, Echiquier.Black_Last)));      
  10.      
  11.      for Line in Line_Type loop
  12.      for Colum in Colum_Type loop
  13.         if Echiquier.Board(Line, Colum).piece in WK..WP then
  14.            declare
  15.           The_Successors : Successors_Type;
  16.            begin
  17.           Echiquier_Succ(Echiquier.Board(Line, Colum).Piece)(Echiquier, Line, Colum, The_Successors);
  18.           case Echiquier.board(Line, Colum).Piece is
  19.              when Empty =>
  20.             null;
  21.              when WK =>
  22.             Sum := Sum + Float(The_Successors.Successor) * 2000.0;
  23.              when WQ =>
  24.             Sum := Sum + Float(The_Successors.Successor) * Queen_Val;
  25.              when WC =>
  26.             Sum := Sum + Float(The_Successors.Successor) * Chavalier_Val;
  27.              when WV =>
  28.             Sum := Sum + Float(The_Successors.Successor) * Valey_Val;
  29.              when WT =>
  30.             Sum := Sum + Float(The_Successors.Successor) * Tower_Val;
  31.              when WP =>
  32.             Sum := Sum + Float(The_Successors.Successor) * Pion_Val;
  33.              when others =>
  34.             null;
  35.           end case;
  36.            end;
  37.         end if;
  38.      end loop;
  39.      end loop;
  40.      Hcost := Hcost - Sum;
  41.      Sum := 0.0;
  42.      
  43.      Successors  := Black_Successors(echiquier);
  44.      if Successors.Successor /= 0 then
  45.           for I in 1..Successors.Successor loop
  46.              declare
  47.                 Tmp : Echiquier_Type := Successors.Plan(i);
  48.              begin
  49.                 Sum := Sum - (Total(Tmp.Black, Tmp.Black_last) - Total(Echiquier.Black, Echiquier.Black_last));
  50.                 Sum := Sum + (Count - (Total(Tmp.White, Tmp.White_last) - Total(Echiquier.White, Echiquier.White_last)));
  51.              end;
  52.              
  53.           end loop;    
  54.           Sum := (Sum/Float(Successors.Successor));
  55.           Ucost := Sum + Float(Successors.Successor);
  56.      end if;      
  57.      Sum := 0.0;
  58.      Successors  := White_Successors(echiquier);        
  59.      if Successors.Successor /= 0 then          
  60.           for I in 1..Successors.Successor loop
  61.              declare
  62.                 Tmp : Echiquier_Type := Successors.Plan(i);
  63.              begin
  64.                 Sum := Sum - (Count - (Total(Tmp.White, Tmp.White_last) - Total(Echiquier.White, Echiquier.White_last)));
  65.                 Sum := Sum + (Total(Tmp.Black, Tmp.Black_last) - Total(Echiquier.Black, Echiquier.Black_Last));
  66.           
  67.              end;
  68.     
  69.           end loop;    
  70.           Sum := (Sum/Float(Successors.Successor));
  71.           Ucost := Ucost - (Sum + Float(Successors.Successor));
  72.      end if;      
  73.      return (ucost - hcost);
  74.   end Black_Heuristic;


 
Pour les White c'est l'inverse.  :D  
 
Matez les source de chess.ads qui change un poil aussi.
 

n°2178966
Profil sup​primé
Posté le 06-03-2013 à 13:16:15  answer
 

rufo a écrit :

Le point terminal, tu peux pas savoir puisqu'il existe des milliers de configurations dans lesquelles toi ou l'adversaire peuvent être mat (et je parle même pas des situations de pat).


 
 
Bonjour rufo, je souhaite revenir sur ce point, car il m'intéresse particulièrement.
Si j'affronte un algo a lui même optimalement, je doit obtenir une partie.
A partir de là n'est - il pas possible de chercher le chemin optimal avec A* ?
 
J'ai pas trouvé avec minmax encore mais je commence à comprendre mon code, je commence à gagner qui je veux comme je veux ou bien perdre.
Comme je disais peut-être plus haut, ça dépend de la logique des + et des -
 
A part ça, j'en suis à donner des centaines pour les pièces, des k pour le King mais des 0.01 comme facteur de déplacement, en fait j'ai déprécier les déplacements, ça marche un poil mieux. je manipule difficilement minimax par contre, pour inverser la logique c'est à l'essai-erreur.
 
 
Là j'affronte les noirs avec un calcul d'un coup d'avance (cad l'évaluation d'un coups après) contre les blanc sans coup d'avance. Mais les blanc jouent avant.
En fait je cherche une erreur dans mon code mais bon ici, c'est interressant de voir comment ça ce passe.
Je vous laisse testet d'autre solution, je mettrai bien tôt de nouvelle sources dans le répertoire Games.
Bref, les blanc, on l'avantage du premier coup, les noir l'avantage de cacul d'un coup d'avance.

    A  B  C  D  E  F  G  H
 
 8  BT          BK BV BC    
 7     BP BP BV BP    BP    
 6  BP             BP      
 5                          
 4                          
 3  WP    WC       WP WP    
 2     WP WP    WP       BT
 1           WT WK    WC WT
White : (BP, 1.00000E+02), (BQ, 9.00000E+02), (BP, 1.00000E+02), (BC, 3.00000E+02),  
Black : (WV, 3.25000E+02), (WP, 1.00000E+02), (WV, 3.25000E+02), (WQ, 9.00000E+02), (WP, 1.00000E+02),  
 
Les blancs jouent pour le coup N° 11
Total White :  1.40000E+03
Total Black :  1.75000E+03
 
White Heuristic : -3.16000E+02
Black Heuristic :  6.38313E+02
 
White timer : 00:07:31
Black timer : 00:10:03


 
L'algo minmax est appelé pour une profondeur max de 2.
Après c'est plus long.
 
J'ai vue aussi que j'avais fait des tableau de successeurs de 1024 échiquiers, j'ai réduit à 128, ça gagne pas mal de temps.
 
Amuser vous avec mes codes, je les trouve ingénieux, maintenant reste à savoir ce qu'il valent vraiment.
C'est écrit avec Ada for ever.
 
 
Bref,  :D  
 
 
Rufo, réponses ?
 
Merci.

n°2178973
rufo
Pas me confondre avec Lycos!
Posté le 06-03-2013 à 14:06:12  profilanswer
 

Ben le minmax sur 2 de profondeur, ça va pas donner des résultats terribles :/ Faut pas oublier qu'au échecs, t'as 2h pour jouer 40 coups donc 3 minutes de réflexion par coup. Faudra caler la profondeur sur cette donnée (ton PC met combien de temps pour calculer un minmax de profondeur 2?).
 
Après, tu peux combiner l'algo minmax avec une BD contenant des parties. Si Situation courante dans BD et que celui qui doit jouer le coup a aussi gagné la partie dans la BD, alors jouer le coup en BD, sinon, appliquer minmax sur la profondeur adaptée au temps... ;)
 
C'est pas pour rien que les bécanes qui jouent aux échecs (correctement :D) sont des gros calculateurs...Pas des PCs.


---------------
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°2178974
Profil sup​primé
Posté le 06-03-2013 à 14:19:04  answer
 

Bonjour rufo.
 
Une bd, c'est carrément exclu,  :D  
 
Pour jouer au niveau 1 c'est 1minute * 2 par coup.
Niveau 2 c'est attends, attends, je viens de corriger mon algo....
 
J'ai enfin trouvé un joueur en déséquilibre, c'est à dire que l'ago est enfin le même, et ça joue quand même, enfin niveau un, parce que niveau deux, ça n'a pas encore joué depuis que j'ai commencé à écrire ce message.
 
Alors voilà.
 
/blabla.
Je suis passé par plein d'algo différent, autant dans les heuristique que dans les condition de fonctionnement de minmax. C''est intéressant.
Mon problème principale et dans l'application des règle du jeux d'échecs, notamment dans le comportement en échec, et pour la mise en mat, mais encore faut-il trouvé un algo qui veuille bien combatre contre lui même ou qui ne fini pas en boucle en milieu de partie.
bla/
 
 
Toujours pas sortie depuis 5 minutes de plus !  :D  
 
Je met en ligne la version 2.0.0 dans 5 minutes.

n°2178977
Profil sup​primé
Posté le 06-03-2013 à 14:42:10  answer
 

Niveau 1 une minute donc sur Gnu/Linux et 2 minutes sur Windwos.  :D  
 
Je dis ça, je dis rien, je préviens.

n°2178982
Profil sup​primé
Posté le 06-03-2013 à 14:59:14  answer
 

Avec la version 2.0.0 donc, le jeux termine vite contre lui même niveau 1 car les blancs ne détectent pas l'échec.
La partie est pliée en 8 minutes et 4 coups.
Le main détecte bien la prise du roi, c'est à dire que le programme termine lorsque qu'il a mangé le roi.
 
Si non, il y a du mieux par rapport à la version 1.
Mais il y a encore un truc à l'envers.
 
Version 2 en ligne dans mon répertoire Applications/Games, MinimaxChess pour Gnu et Win. Avec sources et binaires.
 
Voilà, je prendrais bien un coup de pied, non un coup de main, non plus quelques corrections... pourquoi pas.

n°2178993
rufo
Pas me confondre avec Lycos!
Posté le 06-03-2013 à 15:29:25  profilanswer
 

Bizarre tes perfs :/ Soit t'as une machine qui date de 10 ans, soit ton algo n'est pas optimisé pour 2 sous.
 
Par ailleurs, une partie gagnée en 4 coups (c'est le coup du berger, là!), je dirais que l'algo est pas au point. Tu ferais un algo avec un random que la partie durait bien plus longtemps.


---------------
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°2178995
Profil sup​primé
Posté le 06-03-2013 à 15:32:06  answer
 

Là j'essaie simplement une inversion de logique puisque enfin mes algo sont les même pour les blancs et les noirs, j'ai soustrait ucost à hcost en fin d'heuristique.
Ca donne 1 minute au premier coup, d'un joueur puis deux minute au deuxieme puis trois au troisième etc, pour le moment et ça continue à jouer au 5ieme coup.
 
Screen shot :
 

    A  B  C  D  E  F  G  H
 
 8  BT BC BV    BK BV BC BT
 7        BP BP BQ BP BP BP
 6                          
 5  BP BP       BP          
 4              WP          
 3        WC       WQ      
 2  WP WP WP WP    WP WP WP
 1  WT    WV    WK WV WC WT
White :  
Black :  
 
 
Les blancs jouent pour le coup N° 5
Total White :  0.00000E+00
Total Black :  0.00000E+00
 
White Heuristic :  1.37166E+02
Black Heuristic : -1.37166E+02
 
White timer : 00:07:59
Black timer : 00:07:55


 
On as toujours le pile ou face de l'avantage.

n°2178997
Profil sup​primé
Posté le 06-03-2013 à 15:34:42  answer
 

rufo a écrit :

Bizarre tes perfs :/ Soit t'as une machine qui date de 10 ans, soit ton algo n'est pas optimisé pour 2 sous.
 
Par ailleurs, une partie gagnée en 4 coups (c'est le coup du berger, là!), je dirais que l'algo est pas au point. Tu ferais un algo avec un random que la partie durait bien plus longtemps.


 
 
Euh oui, elle a 10 ans ma bécane pourquoi ?

n°2179002
Profil sup​primé
Posté le 06-03-2013 à 15:59:38  answer
 

rufo a écrit :

Faut pas oublier qu'au échecs, t'as 2h pour jouer 40 coups


Ca va être ça grosso modo, niveau 1.
 
Avec Hcost - Ucost. Mais je ne sais pas encore comment ça termine, j'en suis à 1:00 8 coups.

n°2179006
rufo
Pas me confondre avec Lycos!
Posté le 06-03-2013 à 16:10:23  profilanswer
 


 
Ben ce genre d'algo nécessite de grosses ressources de calcul :/ Un vieux PC va vachement te limiter en puissance de calcul...


---------------
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°2179007
Profil sup​primé
Posté le 06-03-2013 à 16:17:36  answer
 

Pour le moment je suis dans les temps, mais c'est pas terminé.
 
 
Merci rufo.  :jap: Merci PB- aussi.  :jap: Merci Harko également.  :jap:

n°2179028
Profil sup​primé
Posté le 06-03-2013 à 17:09:49  answer
 

Finalement, j'arrive à peine à 20 coups en deux heures. Mais ça joue. J'attends la fin.

n°2179055
Profil sup​primé
Posté le 06-03-2013 à 18:33:49  answer
 

Bon, au moins je sais comme ça, il faut faire exactement l'inverse.  :bounce:  

Spoiler :

:lol:


 
 [:painkiller]
 
 
 
 
La partie de tout a l'heure... vous en pensez quoi, vous pouvez voir les dernier coup dans le sujet presse papier.
 

Citation :

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



 
 
Les noirs ont joué.

    A  B  C  D  E  F  G  H
 
 8     BC BV                
 7  WC    BP BP BK    BV    
 6  BT             BC      
 5     BP    BQ BP BP BP WQ
 4  BP WP       WP WV WP BT
 3  WP    WC WP          BP
 2        WP    WK WP WV WP
 1  WT                   WT
White :  
Black :  
 
 
Les blancs jouent pour le coup N° 25
Total White :  0.00000E+00
Total Black :  0.00000E+00
 
White Heuristic : -1.29297E+00
Black Heuristic :  1.29297E+00
 
White timer : 01:55:59
Black timer : 01:25:28
 



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


 
 
Nouvelle partie en inversant un truc.

Code :
  1. if Game.heuristic(Game.Usr)>= -Game.The_end and then


dans ValeurMin
et  
 
 

Code :
  1. if Game.Heuristic(Game.Usr) < Game.The_end and then


Dans ValeurMAx
 
 [:neo_xp]  Ca marche pas.  [:pingouinator]


Message édité par Profil supprimé le 06-03-2013 à 22:31:52
n°2179104
Profil sup​primé
Posté le 07-03-2013 à 03:05:00  answer
 

Bon, on recommence parce qu'il y avais tricherie.
Chercherais l'équilibre des compte plus tard.
J'ai passé 3 jour a calculer un coup avec un seul échiquier. C'est intéressant.
Mais mieux vaut en avoir deux.  :lol:  
Donc, niveau 1 ça joue,  
 

    A   B   C   D   E   F   G   H  
 
 8       BC  BV  BQ  BK      BC  BT  
 
 7       BP  BP  BP          BP  BP  
 
 6   BT              BP  BP          
 
 5                                  
 
 4                                  
 
 3   BV      WP      WP  WP          
 
 2               WP          WP  WP  
 
 1   WT  WC  WV  WQ  WK  WV  WC  WT  
 
White : (BP, 1.00000E+02),  
Black : (WP, 1.00000E+02), (WP, 1.00000E+02),  
 
 
Les noirs jouent pour le coup N° 7
Total White :  1.00000E+02
Total Black :  2.00000E+02
 
White Heuristic : -1.14100E+04
Black Heuristic : -1.15183E+04
 
White timer : 00:02:17
Black timer : 00:03:51
 

n°2179186
Profil sup​primé
Posté le 07-03-2013 à 13:39:40  answer
 

Je l'ai je crois, faut vérif, mais je crois que j'ai bon enfin.
 
 

    A   B   C   D   E   F   G   H  
 
 8           BV      BK          BT  
 
 7       BP  BP  BP      BP  BP      
 
 6               BV  BP              
 
 5                               BP  
 
 4                               WP  
 
 3           WP  WP  WP  WC          
 
 2   BT                  WK  WP      
 
 1       WT                          
 
White : (BQ, 9.00000E+02), (BC, 3.00000E+02), (BP, 1.00000E+02), (BC, 3.00000E+02),  
Black : (WQ, 9.00000E+02), (WP, 1.00000E+02), (WP, 1.00000E+02), (WV, 3.50000E+02), (WC, 3.00000E+02), (WT, 5.00000E+02), (WV, 3.50000E+02), (WP, 1.00000E+02),  
Les noirs jouent pour le coup N° 16
Total Black :  1.60000E+03
Total Black :  2.70000E+03
White Heuristic :  0.00000E+00
Black Heuristic :  0.00000E+00
White timer : 00:00:02
Black timer : 00:00:02
White Mat.
 
raised CHESS.MAT : chess.adb:148
root@Muse:MinimaxChess#


 
Ca y était pas.
 
 
Voyons celui-ci !
 

   A   B   C   D   E   F   G   H  
 
 8                                  
 
 7       BP          BK          BP  
 
 6   BP  WV          BP              
 
 5   WP          BP      BT          
 
 4   BV          WP      WP          
 
 3               WP  BQ              
 
 2                                  
 
 1                   WK              
 
White : (BP, 1.00000E+02), (BV, 3.50000E+02), (BC, 3.00000E+02), (BP, 1.00000E+02), (BT, 5.00000E+02), (BC, 3.00000E+02), (BP, 1.00000E+02),  
Black : (WP, 1.00000E+02), (WQ, 9.00000E+02), (WV, 3.50000E+02), (WT, 5.00000E+02), (WP, 1.00000E+02), (WC, 3.00000E+02), (WC, 3.00000E+02), (WT, 5.00000E+02), (WP, 1.00000E+02), (WP, 1.00000E+02),  
Les noirs jouent pour le coup N° 36
Total Black :  1.75000E+03
Total Black :  3.25000E+03
White Heuristic :  3.60000E+03
Black Heuristic :  5.73000E+03
White timer : 00:00:03
Black timer : 00:00:04
White Mat.
 
raised CHESS.MAT : chess.adb:148
root@Muse:MinimaxChess#


 
 
Oh Oh, Oh,  [:le_coyote]


Message édité par Profil supprimé le 07-03-2013 à 13:56:32
n°2179189
Profil sup​primé
Posté le 07-03-2013 à 13:59:52  answer
 

niveau zéro, c'est à dire que Minimax n'entre jamais dans ValeurMin.  
 
 
 [:pr3-]  [:pr3-]  [:pr3-]  [:pr3-]  [:pr3-]  [:pr3-]  
 
 [:kadreg]  [:intercalaire]

n°2179239
Profil sup​primé
Posté le 07-03-2013 à 20:01:40  answer
 

Code :
  1. --
  2.   Pion_Val      : constant Float := 100.0;
  3.   Tower_Val     : constant Float := 500.0;
  4.   Chavalier_Val : Constant Float := 300.0;
  5.   Valey_Val     : constant Float := 300.0 + 20.0 * Float(Level);
  6.   Queen_Val     : constant Float := 900.0;
  7.   King_Val      : constant Float := 1750.0 + 50.0 * Float(Level);
  8.   King_Move_Factor : constant Float := King_Val;


 
 
Niveau dynamique dans la version 3.0.1.

n°2179253
Profil sup​primé
Posté le 07-03-2013 à 22:36:19  answer
 

J'ai de nouvelle perfs.
 
22 coup en 3 secondes minutes niveau 1, mais cette fois j'apelle Minimax comme il faut.
 
 
 
J'espère que ça va jouer le mat.
 


Message édité par Profil supprimé le 07-03-2013 à 22:41:18
n°2179262
PB-
Posté le 08-03-2013 à 06:42:42  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3

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