Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 06/08/2012, à 16:08

philoup44

Script jeu d'echec ---> les Tableaux

Salut

j'apprends depuis peu les commandes shell
et pour me motiver sérieusement à potasser la partie théorique
je me suis lancer dans un script shell
qui devrait m'obligeait à revoir régulierement ma copie...

Mon script n'est qu'un simple jeu d'échec
Je sais , c'est pas bien...
Mais pour essayer d'exploiter un max de lectures indigestes, c'est pas mal
Au debut mes connaissances s'arretaient aux commandes ls -l et cd

jusqu'à maintenant je me suis débrouillé seul
Mais maintenant, j'arrive à une phase ou je bloque un peu

Toutes mes pieces se déplace bien sur 1 coup sans commettre d'erreur
Mon Cavalier à un sous programme
pour déterminer le chemin le plus rapide pour atteindre une cible

exemple ci-dessous

Entre les coordonnées du cheval (ex: c3) ----->  c3
Cavalier en c3 

Tableau des cibles   ---> tablciblmax
3 4 3 4 3 4 3 4
2 3 2 3 2 3 4 3
3 2 3 2 3 2 3 4
4 1 2 1 4 3 2 3
1 2 3 2 1 2 3 4
2 3 0 3 2 3 2 3
1 2 3 2 1 2 3 4
4 1 2 1 4 3 2 3

la valeur 0 represente la position du cavalier (ici c3 = colonne 3 ligne 3)
les autres valeurs représentes le nombre de coups pour atteindre chaque case

Entre les coordonnées de la cible (ex: b8) ----->  b8
nombre de coups pour atteindre b8 = 4
voici le nouveau tableau
x 4 x x x x x x
2 x 2 3 2 x x x
3 2 3 x x 2 x x
x 1 2 1 x x x x
1 2 x 2 1 x x x
x x 0 x x x x x
1 x x x 1 x x x
x x x x x x x x

les x représentent les cases « interdites »
pour aller en b8 (28)
le cavalier choisi d'abord une case de valeur 1, puis 2 puis 3 et finalement 4

Depuis peu ,j'ai réussi à utiliser un tableau pour le déplacement de mon roi

Question
En quoi les tableaux sont ils plus pertinents ?
Jusqu'à maintenant, j'utilisais des fichiers temporaires pour stocker des données
Mais depuis que j'ai réussi à utiliser un tableau pour le déplacement d'une pièce
je me demande si cela n'est pas plus approprié pour stocker des données ?

de meme, pour aborder la partie évaluation d'une position
je dois stocker temporairement la position
pour chaques coups possibles (et ce pour chaque piece)
je suis parti du principe que si 2 sacrifices successifs de pièces lourdes (Dame+Tour)
mene à un mat au 3 eme coup
alors l'évaluation de la position ne peut commencer qu'au 3eme coup
Car au 1er coup ---> sacrifice de la dame = -10
       au 2eme coup ---> sacrifice de la tour = -5
evaluation du matériel = -15
la, il faut vraiment que la partie evaluation positionnelle soit beton
si le programme ne voit pas le coup suivant

Mais ,si je pars d'une moyenne de 30 coups possibles pour chaque joueur
Cela donne
1 er    coup    ---> 30 x 30 = 900 (environ 1000 combinaisons)
2 eme coup   ---> 1000 x 1000
3 eme coup   ---> 1000 x 1000 x 1000

en partant du principe que 1 position = 1caractere = 1 octet
alors au 3eme coup le stockage des données temporaires = 1 Go de ram

a moins que le stockage dans un tableau pese moins lourd

est ce plus rapide de lire dans un tableau ?
Est ce que le stockage dans un tableau pese moins lourd ?

Sinon, pour dire
calcul pour les blanc puis pour les noirs puis pour les blancs etc...

est ce un truc du style

while true
do
commande

exit 0
done

exit 0 ;

Merci d'avance pour toutes réponses

Hors ligne

#2 Le 06/08/2012, à 22:18

darunia_goron

Re : Script jeu d'echec ---> les Tableaux

Tu t'attaques à du lourd pour débuter. Je vais te donner quelques pistes.

Tout d'abord, le script est un langage interprété. Il n'y a pas de compilation, lors de l'exécution, le shell traite ton script ligne par ligne. Pour ce genre de problème, il vaut mieux choisir un langage compilé qui sera bien plus rapide à l'exécution.
Pour les tableaux et les fichiers, la grosse différence et que ton tableau sera en mémoire vive et ton fichier sur le disque dur. Utiliser des fichiers et donc beaucoup plus lent.
Pour les problèmes de stockage, tu utilises un algorithme de type backtracking. La complexité est exponentielle, quelle que soit la manière dont tu t'y prends, tu ne pourras pas tout stocker ni tout évaluer. Un des principes et d'utiliser une heuristique. Déjà, conserve ton idée de points, c'est une bonne base. Étoffe la un peu en rajoutant une « valeur » du coup. Par exemple, un déplacement qui créé une fourchette ou un clouage aura une valeur importante.
À cela tu rajoutes des algorithmes de calcul de prise de pièces. Par exemple, si une pièce est attaquée par trois pièces et est défendue par deux, alors elle peut être prise.

Une fois ton heuristique créé, tu évalues tout les premiers coup et tu ne gardes en mémoire que ceux qui ont une bonne évaluation (par exemple cinq coups). À partir de là, tu passes au second coup et ainsi de suite, en jetant au fur et à mesure les coups qui ont une mauvaise évaluation. De cette manière tu évites que la mémoire ne gonfle trop.

Bon courage, tu en auras besoin.

Hors ligne

#3 Le 07/08/2012, à 00:08

philoup44

Re : Script jeu d'echec ---> les Tableaux

Salut darunia_goron
Je te remercie pour ta réponse
Sans savoir ce qu'est vraiment la compilation (compression en langage machine ?? à savoir 0 et 1 ?? )
J'ai deja pu lire que le shell n'était pas armé pour un programme d'échec
c'est la raison pour laquelle je dis plus haut " je sais c'est pas bien " tongue

Mais quand on part de zéro, et qu'il faut se manger entre autre, la syntaxes du shell " '  ' [ ] ` $1 () etc ...
Un peu de motivation ne fait pas de mal ...
Et autant commencer par le shell, puisque c'est par lui que je dois passer sur la console
Qui maintenant, ne m'effraie plus ... big_smile

Ce qui m'importe avant tout c'est
1) savoir utiliser le langage "shell"
2) Finir  ce script et le mener le plus loin que je peux ( en shell )
Et pour l'instant, le SHELL se "débrouille" bien mieux que je l'aurais cru ...
Au vu de tout ce que j'ai pu lire sur le sujet

Quand aux tableaux

Si cela est vrai
Je vais devoir réecrire une partie de mes scripts (pour optimiser le bébé )
Heureusement, pour l'instant toute les parties sont écrites dans des scripts differents (Que je rassemblerait plus tard)

backtracking
Je connaissais pas
J'ai lu des sujets sur les Algorithme, Algorithme récursif, L’algorithme MinMax, Arbre enraciné, La récursivité...

heuristique
J'aime bien la definition

darunia_goron a écrit :

un déplacement qui créé une fourchette ou un clouage aura une valeur importante

J'avais deja pensé entre autre au clouage, au structure de pions, colonnes ouvertes, etc ...
mais curieusement pas à ... la fourchette hmm
A rajouter à mon fichier EVALUATION

Nombres de pièces qui attaquent ou défendent une case

J'ai déja fait ce "sous programme"

      3 66
      3 65
      3 57
      3 46
      3 33
      2 15
      2 13
      2 83
      1 77
etc ...

ici la case 66 (f6) est "controlée" 3 fois par les noirs
    la case 83 (h3) est "controlée" 2 fois par les noirs

darunia_goron a écrit :

Une fois ton heuristique créé, tu évalues tout les premiers coup et tu ne gardes en mémoire que ceux qui ont une bonne évaluation (par exemple cinq coups)

Je n'ai pas bien saisi la fin
il faut lire 5 points d'avance ??

Encore merci pour ton temps passé à me répondre smile

Dernière modification par philoup44 (Le 07/08/2012, à 00:24)

Hors ligne

#4 Le 07/08/2012, à 11:11

darunia_goron

Re : Script jeu d'echec ---> les Tableaux

philoup44 a écrit :

Sans savoir ce qu'est vraiment la compilation (compression en langage machine ?? à savoir 0 et 1 ?? )

Dans l'idée, c'est ça. Le terme est plutôt traduction en langage machine. Je t'invite à déambuler sur les articles de Wikipédia traitant le sujet (script shell, compilation…)
Libre à toi de programmer ça en script. Je maintiens que c'est inadapté. Le but étant juste de parfaire ton niveau, pourquoi pas.

philoup44 a écrit :
darunia_goron a écrit :

Une fois ton heuristique créé, tu évalues tout les premiers coup et tu ne gardes en mémoire que ceux qui ont une bonne évaluation (par exemple cinq coups)

Je n'ai pas bien saisi la fin
il faut lire 5 points d'avance ??

Je n'ai pas été très clair, je reprends. Dans ton premier message tu donnes l'exemple de 30 coups possible par tour. Grâce à ton heuristique, tu peux classer ces coups et éliminer les moins bon. Par exemple, tu gardes 5 de ces 30 coups comme ça (je reprends ton exemple) :
1 er    coup    ---> 5 x 5 = 25
2 eme coup   --->  25 x 25 = 625
3 eme coup   ---> 25 x 25 x 25 = 15625
En plus de ça, tu peux à tout moment supprimer des coups. Par exemple au troisième coup, tu en gardes 1000 sur les 15625. De cette manière tu peux anticiper plus loin. Là, je te donne des valeurs au pif, à toi d'adapter et de trouver le bon compromis. De plus, l'algorithme ne devra pas se comporter pareil en début et en fin de partie. Lorsqu'il reste peu de pièces, on peut se permettre d'évaluer tout les coups.
Bien sûr, cette méthode ne sera pas capable de calculer un bon sacrifice (du type sacrifice du cavalier dans une fégatello) car le coup sera jugé comme mauvais et donc supprimé immédiatement.

Hors ligne

#5 Le 07/08/2012, à 15:21

philoup44

Re : Script jeu d'echec ---> les Tableaux

darunia_goron a écrit :

Je n'ai pas été très clair

En fait si
Mais hier soir, apres 2 heures de lecture sur les Tableaux, tableaux associatifs etc ...
Je n'avais plus beaucoup de neurones valides tongue

Tes exemples sont à mon sens tres pertinents

darunia_goron a écrit :

sacrifice du cavalier dans une fégatello

Celui ci ... est tres bien pour servir de test au script EVALUATION
que je vais commencer à mettre en forme
Toute la difficulté est de savoir comment stocker des données pour les exploiter plus tard
Car il y a plusieurs méthodes possibles

a)Variables
cases='a8 b8 c8 d8 e8 f8 g8 h8'
b)Tableau
Cases=( a8 b8 c8 d8 e8 f8 g8 h8 )
c)Fichier
cat < fichier

les tableaux me plaisent bien
pour appeler un élément du tableau
${nomTableau[indice]}
ex:

echo $ {Cases[0]}   ----> affiche la valeur à la position 0    ici a8
echo ${Cases[*]}     ----> affiche tous les éléments             ici a8 b8 c8 d8 e8 f8 g8 h8
echo ${#Cases[*]}    ---> affiche le nombre d'éléments       ici 8

Mais si une position = 64 cases
et que je prends par exemple 1 caractere par case
alors 1 position = 64 caracteres
donc 1 tableau contiendra minimum 64 elements

1 er    coup    --->      25
2 eme coup   --->     625
3 eme coup   ---> 15625  ---> 15625 positions  x 64 éléments

Question
Quel est la capacité des tableaux ?
Combiens d'éléments maxi peuvent-ils contenir ?
Combiens pésent les données sous forme de tableau ? (1 caractere = 1 octet ??)

Dans un fichier , je me représente bien
15625 positions  de 64 éléments = 15625 lignes de 64 caractéres (mini)
On peut savoir la taille du fichier
les données étant dans un fichier => soulage la ram ?
apres pour le traitement des données ... qui sera le plus efficace ??

encore merci à toi darunia_goron smile

Dernière modification par philoup44 (Le 12/08/2012, à 20:55)

Hors ligne

#6 Le 23/08/2012, à 14:31

philoup44

Re : Script jeu d'echec ---> les Tableaux

J'ai fait un petit test
Je me suis fait 2 scripts differents
pour simuler 3 demi-coups (un coup, les blancs un coup les noirs et enfin un coup les blancs)
l'un en stockant le résultat dans un fichier texte
l'autre en stockant le résultat dans un tableau
( ici , 1 position = 1 ligne = 88 à 150 caracteres max)

Fichiers
Temps (sec)  Lignes
2             3650
3             5550
5             9861
8            13308
20           26175
40           45552
67           72552

Tableaux
Temps (sec)  Positions
2             4623
4             8721
8            18831
11           23547
15           34704
21           41652
29           57633
34           67242

En passant par les tableaux, je gagne en rapidité
Ils peuvent, à priori stocker pas mal de données
Au mieux, pour l'instant j'atteint 2000 positions / sec ---> soit 2 Kn/s ??
Ce qui à l'air rapide mais , un moteur d'echec à ... 2 Kn/s
...... c'est un cycliste amateur qui participe au 24h du mans lol

ça m'a un peu bloqué pour déterminer la suite ...
Je cherche comment améliorer ses calculs (tableaux à trous etc ... )
Calculs en paralleles (je ne sais pas si c'est faisable en shell)
Je sais que l'on peut faire tourner un processus en tache de fond, mais je ne sais pas si c'est la meme chose ??
Mais bon, pour l'instant ça progresse
En tout cas j'aurais beaucoup appris sur le shell

Hors ligne

#7 Le 23/08/2012, à 21:09

darunia_goron

Re : Script jeu d'echec ---> les Tableaux

philoup44 a écrit :

J'ai fait un petit test
...... c'est un cycliste amateur qui participe au 24h du mans lol

Utilise une voiture. Voici une liste des différentes écuries : C, Java, Python, OCaml, Prolog…
Je le redis, tu ne pourra pas faire quelque chose de performant en script shell. Ce n'est pas fait pour.

Je vais tout de même donner un peu de dopage à ton cycliste amateur.
As-tu des notions solides en complexité ? Tant que tu ne maîtrise pas ce point, tu n'arriveras à rien de performant. Par exemple, si tu as un tableau n x n, rechercher un élément dedans a une complexité en O(n²). C'est le genre de manipulation qu'il faut éviter car souvent inutilement gourmande.
Tu fais tout à l'aide de tableau, ce n'est pas la seule structure de donnée. Il y a aussi les structures de donnée de type récursif (les listes, les arbres, les graphes). Je n'ai aucune idée de comment ça se manipule en script bash mais c'est définitivement le genre de structure de donnée dont tu aurais besoin. Un tableau est statique ; tu ne peux pas l'agrandir à ta guise.


Le calcul en parallèle, dans le meilleur des cas, tu divises le temps d'exécution par le nombre de processeur.

Hors ligne

#8 Le 24/08/2012, à 00:08

philoup44

Re : Script jeu d'echec ---> les Tableaux

Merci darunia_goron smile

Je me rends bien compte de toutes les difficultés qui m'attendent
Meme si le shell n'est pas "armé" pour
ca me ferait plaisir d'arriver au bout
J'ai commencé à apprendre le shell il y a un peu pres un mois
Et sans ce "projet", je n'aurais jamais lu tout ce que j'ai lu ( lu ....lu hmm )
Mais sinon, pour plus tard

quel est le langage le plus adapté pour les échecs
et qui éventuellement, se rapproche le plus du shell ( transition douce oblige ) ??

NB
j'ai lu toute la page de ton lien
plusieurs lectures me seront nécessaires pour comprendre .... wink

Hors ligne

#9 Le 24/08/2012, à 15:33

darunia_goron

Re : Script jeu d'echec ---> les Tableaux

Le meilleur langage ? Quelle question épineuse.

Ma certitude est que le script shell est le pire (je crois que tu l'as compris).

Tout les langages que j'ai cité précédemment peuvent faire l'affaire.
À mon humble avis, j'utiliserai le Prolog. Seulement, Prolog est un langage de programmation logique qui n'a rien à voir avec la programmation impérative que tu as l'habitude de manipuler.

J'ai débuté avec OCaml (caml Light pour être plus précis). C'est un langage fonctionnel, il est au choix compilé ou interprété. Il est aussi orienté objet. Tu as donc un interpréteur de commande dans lequel tu peux taper tes fonctions, en ce sens, ça se rapproche un peu du shell.

Le C c'est le roi des langages, tout est faisable, c'est également le plus bas des langages de haut niveau (i.e. le plus proche de la machine). Certains le considèrent même de bas niveau au même titre que l'assembleur. Parmi les langages que j'ai cité, c'est le seul où tu es responsable de la gestion de la mémoire. Si tu codes bien, c'est ce langage qui te donnera les meilleurs performances. Du fait que tu doives géré la mémoire, ça en fait un langage assez difficile pour un débutant. Je le conseillerai comme second langage une fois que l'algorithmique et la complexité sont bien maîtrisées.

Python, je n'ai pas encore essayé mais je compte m'y mettre. Et pour ce que j'en ai entendu, il est très bon. Il est aussi utilisable comme langage de script. C'est sans doute lui qui est le plus proche de ce que tu désires.

Java est bon aussi, à mon goût le langage orienté objet le plus complet.

Pour conclure, le langage le plus performant sera C, le langage le plus adapté sera Prolog et le langage le plus proche de ce que tu connais déjà semble être Python (je dis semble car je n'ai jamais manipulé).

Enfin, je n'aime pas C++. Je risque de me faire incendier en disant cela ici-bas. Néanmoins,  Richard Stallman et Linus Torvarlds, les deux plus grand gourous du logiciel libre, partagent cet avis.

P.S. : j'ai balancé beaucoup de termes techniques. N'hésite pas à faire moult recherches.
P.S.S : ceci n'est que mon avis, il n'appartient qu'à toi de faire ton choix.

Dernière modification par darunia_goron (Le 24/08/2012, à 15:36)

Hors ligne

#10 Le 24/08/2012, à 21:12

philoup44

Re : Script jeu d'echec ---> les Tableaux

Merci pour le temps que tu as consacré à me répondre

Aujourd'hui, je serais bien incapable de choisir
Car pendant longtemps, j'étais à pied , depuis peu j'apprends à monter une mule
qui régulièrement refuse d'avancer et pas toujours à tord ( faut dire que je suis un pietre cavalier ) tongue
Et pour plus tard, on me propose de choisir entre des Rolls, jaguar, porches ... ( que je n'ai vu qu'en photo )
sans savoir si je pourrais y adapter les rennes de ma mule ... lol

encore merci
je suis toujours preneur d'infos

Hors ligne