Mon implémentation du Jeu du Taquin ::=la file de priorités [Ada] - Ada - Programmation
Marsh Posté le 11-05-2006 à 17:44:02
l'ultime operation, la construction de la liste des identifiants des voisins de l'élément vide dans une matrice
la specification
Code :
|
Si vous avez des idées ....
Marsh Posté le 11-05-2006 à 20:36:19
j'ai fait ça
Code :
|
mais dans l'etat, ça marche pas et je suis bien embété
Marsh Posté le 12-05-2006 à 10:48:09
j'ai fait ça
Code :
|
ça ça marche presque
mais j'ai encore un petit probleme, apriori, avec le tirage aleatoire
Marsh Posté le 12-05-2006 à 11:39:37
Il manque 1 élément dans ma liste des jetons voisins du vide
Marsh Posté le 12-05-2006 à 12:23:01
Maintenant, j'ai bien tous mes voisins dans ma liste, mais ça marche toujours pas,
Il doit y avoir un problème avec le tirage aleatoire à moins que ce soit cette function L_element (Dans : T_Liste;place : in Positive) return T_Borne_2;
Code :
|
Si non c'est le tirage aleatoire qui marche pas bien puisqu'il me renvoie presque toujours les même valeurs
La spécification de P_Random_Sans_Remise
Code :
|
Le corp de P_Random_Sans_Remise
Code :
|
JagStang spécifier dans son message à ce sujet de mélanger N/2 fois le tableau, mais en mélangant un peut plus, ça marche un peut mieu.
Ma procedure Melanger_Un_Jeton(Dans : in out T_Taquin);
Code :
|
Ma procedure Ranger_Un_Jeton(Dans : in out T_Taquin);
Code :
|
Marsh Posté le 12-05-2006 à 14:12:11
Et bien, on pourait se demander ce que fait Ada.Numerics.Discrete_Random, parce-que ça random pas beaucoup ...
Alors voila, en plus maintenant random est vraiment sans remise
Code :
|
Mais ça mélange toujours trés mal
Marsh Posté le 12-05-2006 à 17:05:21
J'ai légèrement modifié ma procedure Initialiser_Un_jeton(Dans : in out T_Taquin); pour avoir 2 fois plus de possibilités au premier coup
Code :
|
Le probleme concernant le tirage aleatoire se pose toujours, (saletée de machine)
En effet, à chaque appel du programme le jeton vide prend le même chemin. Stupéfiant
Marsh Posté le 12-05-2006 à 18:19:33
Comment repousser les limites de Ada.Numerics.Disctrete_Random.Random ou de Srandom, la fonction C de génération de nombre aléatoire
D'un coup, j'ai un doute, en effet, ne demeure t-il pas un bug au sein de ce petit programme
Marsh Posté le 12-05-2006 à 20:31:45
j'ai retapé la construction de la liste des voisins de l'élément vide pour pallier au maigre résultat de Ada.Numerics.Discrete_Random en y intégrant une part d'aleatoire.
Code :
|
Mais ça marche pas encore
Marsh Posté le 13-05-2006 à 17:03:07
Cette implémentation du jeu du Taquin ne reflétant pas en réalité le vrai problème posé, j'envisage d'y remédier. Malheuresement mes connaissances en mathématique, algorithmie et structure de donnée sont aujourd'hui insufisantes. Je me lance donc à la recherche d'un spécificateur qui souhaiterait partager le plaisir d'ecrire ou de réecrire une implémentation du jeu du Taquin avec Ada
Marsh Posté le 14-05-2006 à 04:35:26
En attendant l'affluance sur ce topic,
je m'amuse un peut
Code :
|
procedure Ranger_Une_Tuile(Dans : in out T_Jeu_Du_Taquin) is
Un_Char : Character;
Vide_Passe : Boolean := False;
begin
if Dans.Liste_Initiale.tete = null then
Dans.Matrice_Ordonnee := Dans.Matrice_melangee;
end if;
if Dans.Liste_Initiale.Courant = null then
Construire_Liste(Dans.Liste_Initiale, Dans.Matrice_ordonnee);
if not Vide_Passe then
Tronquer_queu_Liste(Dans.Liste_Initiale,0);
else
Tronquer_tete_Liste(Dans.Liste_Initiale,0);
end if;
Dans.Liste_Initiale.Courant := null;--Dans.Liste_Initiale.Tete;
-- while Dans.Liste_Initiale.Courant.Suivant /= null loop
-- Dans.Liste_Initiale.Courant := Dans.Liste_Initiale.Courant.Suivant;
-- end loop;
Renverser(Dans.Liste_Initiale);
Dans.Liste_Initiale.Courant := Dans.Liste_Initiale.Tete;
else
Permuter(Dans.Matrice_Ordonnee,Dans.Liste_Initiale.Courant.Id);
Dans.Liste_Initiale.Courant := Dans.Liste_Initiale.Courant.Suivant;
if Dans.Liste_Initiale.Courant.Id = 0 then
Vide_Passe := True;
Dans.Liste_Initiale.Courant := Dans.Liste_Initiale.Courant.Suivant;
end if;
end if;
Afficher(Dans.Liste_Initiale);
Get_Immediate(Un_Char);
------------------------------------------------------------
end Ranger_Une_tuile;
Marsh Posté le 15-05-2006 à 14:55:34
J'ai un gros problème URGENT, please HELP ME
En effet, je suis bloqué par mon incapacité à comprendre pourquoi dans le ma procedure ranger_une_tuile, à la ligne 58, ma liste_initiale n'est pas renversée lors de son affichage.
En fait je ne comprend pas le role de courant dans renverser, j'ai du mal à analiser ce probleme, vue que je suis dans l'algo du taquin, je fatigue.
?? Courant doit prendre quel valeur pour renverser la totalité de la liste ??
J'ai déjas utilisé les procedures renverser(sans l'avoir analisé) et afficher dans d'autres circonstances, elles fonctionnent tres bien.
Code :
|
La totalité des sources de Taquin_9 est disponible ICI
Marsh Posté le 15-05-2006 à 15:51:25
C'est bon, merci, j'ai trouvé que, comme je n'est pas incrémenté longueur durant la creation de la liste le premier test de renverser terminait le procedure prématurément.
Marsh Posté le 15-05-2006 à 21:47:24
cet algorithme est-il applicable dans mon cas ?
Soit C le chemin (liste d'états) menant d'un état E à l'état initial. Une fonction heuristique possible est : h(C) = longueur(C) + d(E).
Soit I l'état initial. F une file d'attente de chemins avec priorité h, et D un dictionnaire des états déjà visités. On suppose que I est différent de l'état final.
1. Rentrer le chemin réduit à I dans F (avec h(I)) et dans D
2. Fini := faux
3. Tant que (non Fini) et (F non vide) faire
1. Sortir un chemin C de F de priorité minimale; soit E le premier élément de C
2. Pour tous les successeurs S de E et tant que (non Fini) faire
1. Si S est l'état final alors Fini := Vrai et Solution := inverse(S.C)
2. Sinon, si S n'est pas dans D alors rentrer S.C dans F (avec h(S)) et S dans D
référence : Dijkstra
Autre ressources
METHODOLOGIE ET STRUCTURES DE DONNEES avec un exemple d'application au jeu du taquin (3x3)
Résolution de problèmes en Intelligence Artificielle
L'algorithme A*
Répartition de la charge dans les algorithmes parallèles irréguliers
Ce problème, la resolution du jeu du/de taquin est considéré comme difficile, moi qui ai eu du mal à parvenir a la 4eme ....
Je ne cherche pas la meilleur solution, d'ailleur son calcule est assé lourd ; Je ne rejéterais quans même pas cette ultime algorithme ideal ; Bien que je ne soi pas préssé, je me contenterai, dans un premier temps, d'un algorithme qui trouve une solution, Et ce serait déjàs pas mal
L'orsque les problèmes de resolution seront résoluts, j'envisagerai une version graphique avec GtkAda,
Je rappel que je ne suis ni étudiant, bien que (autodidacte en formation continue), ni salarié, ça c'est sure !
je rappel aussi que j'ai du champagne pour ceux qui m'aide a atteindre mes objectifs
j'ai faî ecrire un truc pas mal cet après midi mais j'ai eu un problème avec une inversion de liste et j'ai oublié ce que j'étais en train de faire ; Dommage
Avec un peut de travail et un peut de patience, je pense y arriver. Un peut d'aide ne serait pas de refus, tout de même.
Marsh Posté le 16-05-2006 à 10:33:26
Trève de plaisenterie,
Je suis en train de lire Christian Carrez dans Structures de données en Java,C++ et Ada 95.pour implémenter mon Jeu du Taquin
Ce qui m'interresse, ce sont les arbres généraux. Pour la resolution du taquin j'opte pour les arbres généraux avec aîné et frère droit
l'implementation du type presenté dans le livre, est en Java
Code :
|
j'ai besoin d'un peut d'aide pour traduire cette déclaration du Java à l'Ada
Code :
|
Merci
Marsh Posté le 16-05-2006 à 11:09:24
Pour le code java
La dernière ligne est le constructeur de la classe java. On passe en paramètre la variable val de type Object et on l'affecte à contenu.
en Ada, tu fait quelquechose dans ce style :
procedure Create( N : out Noeud; Val : in T_Item) is
begin
N.Contenue := Val;
end Create;
Ca répond à ta question?
Marsh Posté le 16-05-2006 à 11:12:48
Erreur de ma part, un arbre p-aire sera suffisant. En effet on connait le nombre maximum de fils de chaque noeud, en l'occurence : 4
Et la coup de bole j'ai la declaration en Ada
Marsh Posté le 16-05-2006 à 11:16:38
Loki du placard a écrit : Pour le code java |
Euh, je comprend pas trop en fait,
Ce serait pas un truc du genre
type Noeud(val : item) is
record
--
--
--
end record;
Marsh Posté le 16-05-2006 à 11:23:54
Donc, en fait, mon type est complet ?
Code :
|
Marsh Posté le 16-05-2006 à 11:47:44
C'est pas ça encore, bref je sais pas comment ça s'appel, c'est un arbre général, oui. une repérsentation contiguë par niveau.
Ce qui doit donner :
Code :
|
Corrigez moi si je me trompe !
Marsh Posté le 16-05-2006 à 14:49:35
Citation : Euh, je comprend pas trop en fait, |
Non, pas du tout. En java, il ne faut pas oublier que les déclarations et le code proprement dit sont dans le même source. La ligne 6 de ton exemple en java est une méthode, plus exactement un constructeur. C'est codé sur une ligne, et on peut faire plus lisible, mais ça correspond parfaitement à la méthode create que j'ai envoyé.
Marsh Posté le 16-05-2006 à 15:38:02
Loki du placard a écrit :
|
Ok, merci Loki du placard
je reprend mon type T_Arbre que j'ai définit ainsi
Code :
|
Integré à mon type T_Jeu_Du_Taquin
Code :
|
Dans le code suivant,
absisse et ordonnee sont deux fonctions renvoyants une valeur correspondant à leur nom,
solution est un tableau de pointeur sur les fonctions up, down, left et right renvoyants 0 si aucun element ne correspond a la position correspondante à leur nom par rapport à une position donnée, l'id de l'element correspondant si non.
dans la boucle while, certainement innadaptée, j'initialise le premier noeud de l'arbre de resolution du Jeu du Taquin
Code :
|
Mon probleme : construire l'arbre j'usqu'a trouver la solution
Une question que je me pose aussi : comment vais-je retrouver le chemin de la solution pour resoudre mon Jeu du Taquin ?
Avis aux arboriculteurs
Marsh Posté le 16-05-2006 à 17:08:45
Pour m'echauffer un peut, j'ai fait un truc de ouf, qui marche pas évidemment , un truc recursif, mais je suis vraiment pas fort en la matière. d'ailleur c'est pas une fonction mais une procedure n'y prété pas trop d'attention, je l'ai faite au pif il manque certainement quelque chose.
Code :
|
si qu'elqu'un pouvait me confirmer qu'un procedure recursive c'est forcement une function, ça m'arrangerait
Marsh Posté le 16-05-2006 à 18:13:01
Erreur de segmentation
(je suis sous Linux)
Avec une matrice 2x2 mon petit programme génère une erreur de segmentation.
Il y a qu'elque chose qui cloche ?
Marsh Posté le 17-05-2006 à 01:09:06
Citation : |
Bien qu'avoir implémenté la procedure contruire_arbre_de_resolution au pif, elle devrait tourner,
j'ai fait une version sous forme de fonction qui est maintenant ma version de developpement courante.
cette fonction est sensé construire un arbre de toute les combinaisons possibles à partir de la matrice melangée du jeu du taquin jusqu'a trouver une solution.
Merci à ceux qui planchent ou qui vont plancher
Marsh Posté le 17-05-2006 à 16:59:31
Rassures-moi : t'as interfacé avec du C ?
Parceque normalement, pas de ça en Ada ....
Marsh Posté le 17-05-2006 à 17:32:39
apprentitux a écrit : Rassures-moi : t'as interfacé avec du C ? |
A la, moi je suis sure d'avoir généré des Erreur de segmentation toute l'après midi, falait voir le code aussi
Enfin bref, je me ratrape un peut, j'ai réussi à généré une solution avec ma petite function construire arbre ... ,
c'est pas finit mais ça vien, Il ne me reste plus qu'a retrouver le chemin de resolution (a l'envers) est ça roule
Marsh Posté le 17-05-2006 à 18:30:26
il marche toujours pas en fait,
Trop surpris, j'ai fait un erreur de vaiable et du coup ben c'est toujours n'importe quoi en fait
Marsh Posté le 18-05-2006 à 11:09:54
quelqun aurais le code d'un arbre general p-aire ou avec aîné et frere droit ça m'avancerai, Ada bien sur
j'en suis la, faire un paquetage generique d'un arbre general p-aire ou avec aîné et frere droit, je sais pas le quel choisir
Marsh Posté le 18-05-2006 à 17:26:05
j'placarde mon code, encore au cas ou !!
dans la procedrue suivante, je trouve plus le resultat, c'est à dire
que j'arrive pas a sortir quant je trouve le resultat, pourtant j'ai mis des exit Main_Loop par tout
c'es dans un n-arbre "à la jovalise"
Code :
|
Marsh Posté le 19-05-2006 à 13:48:01
Je fait des tentatives par deduction mais si je suis partie avec une mauvaise abstraction du type je m'en sortirai pas
svp, jetez un coup d'oeuil a mon T_Arbre
Code :
|
Merci
Marsh Posté le 19-05-2006 à 22:11:03
J'ai un problème avec la procedruee construire_arbre_de_solution lignes 298 à 582 concernent le passage au frere_courant qui est en faite le frere suivant à visiter;
apres une iteration de passer_frere_suivant, courant.frere_courant doit prendre la valeur de courant.frere_courant.frere_courant, le frere suivant frere_courant
c'est ce que je fait ligne 434 a l'aide du tampon
ainsi en passant alternativement d'un courant a un frere_courant au courant, ainsi de suite, grace a passer_frere_suivant et passer_au_parent, je passe au frere suivant;
le probleme est que c'a n'itere pas, le frere_courant ne passe pas au frere suivant frere_courant.frere_courant;
les sources de Taquin_9 sont disponibles ICI
construire_arbre_de_solution est dans p_taquin.adb
Marsh Posté le 20-05-2006 à 05:18:53
j'ai enfin réussi a itere mes frere_courant, a priorie ça tourne
c'est un peut long a calculer mais ça sort la solution (testé à chaud avec matrice 2x2 et 3x3)
le reste, c'est de la rigolade, je vais essayer de suprimer les doublons direct,
je fait quelque test d'ici demain et je marque resolut dans le titre du topic
Marsh Posté le 20-05-2006 à 05:44:01
Bon, ben fausse anonce, ça marche toujours pas,
pour une matrice 2x2 pas de probleme
A+
Marsh Posté le 11-05-2006 à 13:27:16
Bonjour à tous et toutes,
la premiere partie du topic relate des evenements survenuent l'hors du developpement des premieres versions (lire le debut du topic)
A ce jour le problème principal est d'implémenter une file de priorité, (lire les derniers messages)
la version courante exploite un algorithme A* ou A etoile avec des listes chaînées (voir les sources)
Merci à tous et toutes
<<MESSAGE ORIGINAL>>
Je me propose de réaliser avec Ada un jeu du Taquin dont le solutionnement est une liste des permutations effectuée durant le mélange
mes sources sont disponibles ICI
n'esitez pas à participer à ce topic
Ma spécification de P_Taquin
Cette implémentation du jeu du Taquin ne reflétant pas en réalité le vrai problème posé, j'envisage d'y remédier. Malheuresement mes connaissances en mathématique, algorithmie et structure de donnée sont aujourd'hui insufisantes. Je me lance donc à la recherche d'un spécificateur qui souhaiterait partager le plaisir d'ecrire ou de réecrire une implémentation du jeu du Taquin avec Ada
Message édité par Profil supprimé le 11-06-2006 à 18:17:00