IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Pascal Discussion :

Cherche bibliothèque permettant de gérer un arbre n-aire


Sujet :

Pascal

  1. #1
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 382
    Par défaut Cherche bibliothèque permettant de gérer un arbre n-aire
    Bonjour,

    J'ai mis le préfixe Lazarus, mais en fait, je cherche une Bibliothèque (package, unité, algorithme détaillé) dans tous les langages Pascal, Free Pascal, Lazarus, Kylix etc ainsi que Delphi qui permette de gérer un arbre de connaissance (typiquement arbre n-aire) qui offre toutes les fonctions de gestion de l'arbre:
    Création, ajout, suppression, recherche de noeuds, comptabiliser le nombre de noeuds, de feuilles terminales, de profondeur de branches et éventuellement de rééquilibrage...

    J'ai n'ai pas trouvé de composant ou de package natif à Lazarus. Sur la toile, j'ai vu TTree et GTree mais je n'ai pas trouvé de lien pour les télécharger.
    Au pire, s'il y en a une unité existant en C, j'essaierais de l'adapter, grr...

    Voilà si vous avez un lien, une application qui utilise des arbres n-aires, je suis preneur.

    Merci à vous.

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 193
    Billets dans le blog
    9
    Par défaut
    Bonjour ! Sujet intéressant. Pourriez-vous expliquer un peu quel serait l'usage, pour qu'on puisse bien se représenter la chose ?

    J'ai une unité dans un programme d'échecs qui permet de créer et d'utiliser un livre d'ouvertures. L'unité est capable de lire et d'écrire deux formats de fichiers différents, dont celui-ci qui est amusant. Au cas où, je peux fournir de petits exemples d'utilisation.

  3. #3
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 382
    Par défaut Lien de Roland
    Citation Envoyé par Roland Chastain Voir le message
    Bonjour ! Sujet intéressant. Pourriez-vous expliquer un peu quel serait l'usage, pour qu'on puisse bien se représenter le chose ?

    J'ai une unité dans un programme d'échecs qui permet de créer et d'utiliser un livre d'ouvertures. L'unité est capable de lire et d'écrire deux formats de fichiers différents, dont celui-ci qui est amusant. Au cas où, je peux fournir de petits exemples d'utilisation.
    Bonjour Roland,

    Merci de t'intéresser au sujet. En fait à la base, je suis allergique aux bases de données bien qu'à une époque lointaine, je les ai enseigné... Tous ces problèmes de sécurité, mots de passe et j'en passe, formats et évolution des moteurs des bases évoluent trop vite pour moi. Je préfère travailler sur les réseaux neuronaux ou des arbres de connaissance dont je maitrise le fonctionnement de base et les formats. Cela me servirait de moteur de base pour différentes applications, soit en développant un composant, soit dans une simple unité dédiée. Chose amusante, j'avais à une époque développé un programme d'échec (j'ai été un compétiteur régional aux échecs) où effectivement, les ouvertures sont déterminantes au plan stratégique. Bref, une autre époque...

    Donc ce que je cherche pour l'instant, c'est une structure de type Arbre n-aire qui peut se développer au gré de l'utilisateur qui enrichit sa propre base de connaissance. Les applications sont multiples...
    1. 1ère application : Actuellement, je développe un programme d'astronomie pour mes propres recherches où il me faut saisir des données sur des objets célestes particuliers. Un des problèmes que je dois régler sont les projections cartographiques selon le référentiel utilisé : terrestre, solaire ou galactique entre autres...
    2. 2ème sujet d'intérêt : je suis passionné de jeux sur internet mais ne trouve pas chaussure à mon pied malgré l'offre importante mais qui vous limite si vous ne payez pas ou n'y passez pas des heures entières... J'aime les jeux de stratégie mais pour me détendre et donc maintenant moins compliqué que les échecs...
    3. Ma véritable passion sont la physique cosmologique et les mathématiques appliquées. J'ai un penchant pour la pédagogie, alors, j'aime développer des modèles d'apprentissage ludiques. J'ai un projet commencé, il y a des années sur un système de résolution des calculs de dénombrements. L'arbre dans ce cas se traduit par une série de question qui amène vers la solution et dans ce domaine, bon nombre de subtilités existent sur la façon de formuler le problème.

    Enfin, je dirai que d'autres sujets m'intéressent, mais je travaille sur le n°2 et 3 essentiellement.

    Ce que je cherche actuellement, c'est une structure qui gère toutes fonctions de base listées dans mon précédent post, mais j'en ai peut être oublié. Le déséquilibre des branches peuvent poser problème ou pas, je ne sais pas encore... Il faudrait donc aussi une fonction de rééquilibrage des branches en harmonisant par exemple, les profondeurs...

    Par contre, la structure des données seront regroupées dans des structures classiques de fichiers typés je pense, mais un mécanisme de raccordement des nœuds devra être simple: adresse ou index...
    Voilà, j'espère t'avoir précisé mes besoins. Bien entendu je ne garderai pas mon travail pour moi, je le partagerais avec ce site, mais je suis plus lent qu'il y a 20 ans

    Je viens de voir que tu avais mis un lien, j'y regarde et reviens vers toi si j'ai des questions...
    A+

  4. #4
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 382
    Par défaut Pour Roland
    Merci Roland pour cette belle unité. Il faut que je penche dessus pour la comprendre. J'ai déjà ajouté une procédure qui manquait : la suppression d'un Nœud sur un exemple simple ou je créé une structure de type record:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TObjetCosmique = Record 
      indexUAI : LongInt;
      NomUAI : String[30];
    end;
    Je te tiens au courant.
    Merci

  5. #5
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 382
    Par défaut Distinction entre Noeud TTree et TTreeView


    @ Roland J'avance avec prudence, les choses se gâtent avec l'affichage de l'arbre dans un TTreeView. il y a un conflit d'affectation entre TTree et TTreeNode.
    Pour les essais j'ai modifié le nom de l'unité Tree.pas en NTree.pas que je n'ai pratiquement pas modifié. Juste ajouté une sécurité lors de la création...

    La classe personnalisée TTree (Tree.pas et NTree.pas) manipulent des nœuds par le pointeur PTreeNode vers TTreeNode.
    Mais je veux utiliser le composant visuel TTreeView de Lazarus pour afficher l'Arbre, enfin ça me semble le meilleur choix pour l'Affichage de l'arbre.
    Or le pointeur de Noeud du composant est nommé également TTreeNode mais dans une classe différente pour gérer les nœuds du composant TtreeView.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    {--- ConvertToTreeViewNode -----------------------------------------------------
      Résout un conflit d'affectation entre TTree et TTreeNode
      La classe personnalisée TTree (NTree.pas) manipule des nœuds par le pointeur
      PTreeNode vers TTreeNode.
      Mais je veux utiliser le composant visuel TTreeView de Lazarus, le pointeur de
      Noeud du composant nommé également TTreeNode mais dans une classe différente
      pour gérer les nœuds du composant TtreeView.
    --------------------------------------------------------------------------------}
    function TForm1.ConvertToTreeViewNode(TreeView: TTreeView; ParentItem: TTreeNode;
                                          Node: PTreeNode): TTreeNode;
    begin
      if Node = nil then
        Exit(nil);
     
      {Ajoute le nœud au TreeView}
      if ParentItem = nil then
        Result := TreeView.Items.Add(nil, Node^.Data) // Ajoute un nœud racine
      else
        Result := TreeView.Items.AddChild(ParentItem, Node^.Data); // Ajoute un enfant
    end;
     
     
    {--- AfficherArbreDansTreeView -------------------------------------------------
    - Utilisation d'une pile pour gérer les nœuds logiques
    -------------------------------------------------------------------------------}
    procedure TForm1.AfficherArbreDansTreeView;
    var
      CurrentNode: PTreeNode;
      TreeItem, ParentItem: TTreeNode;
      NodeStack  : TStack;
    begin
      {initialisations de TreeView}
      TViewArbre.Items.Clear;
     
      if FArbre.GetRoot = nil then
      begin
        ShowMessage('L''arborescence est vide.');
        Exit;
      end;
     
      NodeStack := TStack.Create;
     
      {Parcours de l'Arbre}
      try
        CurrentNode := FArbre.GetRoot;
        ParentItem  := nil;
     
        while CurrentNode <> nil do
        begin
          {Convertit le nœud logique en nœud graphique}
          TreeItem := ConvertToTreeViewNode(TViewArbre, ParentItem, CurrentNode);
     
          {Si le nœud a des enfants => Empile le parent et passe au premier enfant}
          if CurrentNode^.Child <> nil then
          begin
            NodeStack.Push(CurrentNode); // Empile nœud logique
            ParentItem  := TreeItem;     // Le parent se focalise sur l'élément du TreeView
            CurrentNode := CurrentNode^.Child; // Premier enfant
          end
          else if CurrentNode^.Sibling <> nil then
               begin {Passe au frère suivant s'il existe}
                 CurrentNode := CurrentNode^.Sibling;
               end
               else if NodeStack.Count > 0 then
                    begin {Remonte dans la pile pour traiter les frères restants du parent courant}
                      CurrentNode := PTreeNode(NodeStack.Pop);
                      ParentItem  := TViewArbre.Items.FindTopLvl(CurrentNode^.Parent^.Data);
                    end else
                        Break; // Fin du parcours si plus rien dans la pile.
        end;
      finally
        NodeStack.Free; // Libère la pile.
      end;
     
      ShowMessage('Arborescence affichée dans le TreeView.');
    end;
    Je n'arrive pas à régler le problème...
    Je pense qu'il faudrait clarifier les deux type de Noeud qui ont le même nom :
    type
    TLogicalNode = NTree.PTreeNode; // Nœud logique de l'arbre (TTree)
    TVisualNode = ComCtrls.TTreeNode; // Nœud du composant visuel (de TTreeView)

    As-tu un exemple du code de TTree avec affichage dans un TTreeView de Lazarus?

    Merci
    JL

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 193
    Billets dans le blog
    9
    Par défaut
    Je vais regarder ça dans les meilleurs délais.

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 193
    Billets dans le blog
    9
    Par défaut
    J'ai mis en ligne une démo de l'unité Trees, avec une notice.

    Reste à savoir si cette unité peut répondre à tes besoins, ce que je ne saurais dire à ce stade.

  8. #8
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 193
    Billets dans le blog
    9
    Par défaut
    Et voici une collection d'exemples que j'avais trouvés çà et là, pour les composants TreeView, VirtualStringTree, VirtualTreeView. J'avoue que tout ça est un peu loin dans ma mémoire, et là je n'ai pas trop le temps de m'y replonger. En espérant que ça puisse être utile.
    Fichiers attachés Fichiers attachés

  9. #9
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 382
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Et voici une collection d'exemples que j'avais trouvés çà et là, pour les composants TreeView, VirtualStringTree, VirtualTreeView...En espérant que ça puisse être utile.
    Merci Roland pour ton aide!

    Je vais m'y replonger et reviendrais avec une solution j'espère... Je ne mets pas résolu pour l'instant.

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/11/2008, 10h43
  2. Réponses: 1
    Dernier message: 15/03/2007, 22h18
  3. [Zip] Cherche librairie permettant le unzip/unrar d'un fichier uploadé
    Par vallica dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 02/09/2006, 14h33
  4. cherche algorithme de construction d'un arbre
    Par Invité(e) dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 07/05/2006, 12h04
  5. cherche algorithme de construction d'un arbre
    Par Invité(e) dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 05/05/2006, 13h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo