[POO][Ada] Path Finding sur un arbre N -aire d'activité : comptable et annexe

Bonjour !
J’arrive à l’étape décisive du développement de mon programme.
En effet, je dois implémenté un Path_Finding.
A* pour être précis.
C’est pas tant A* qui m’inquiète le plus, mais la génération des successeur et l’heuristique qui va de paire pour exploiter A*.

Avant de me lancer dans ce développement je voulais vous présenter un projet level 10 (dans la classification des sytème). Son petit nom dans cette version est adaline.
Le programme est écrit avec Ada comme vous le pensiez.
J’utilise la bibliothèque REM_NN_Wrapper de PramgARC qui implémente un réseau de neurone.

Ce programme vous permettra de créer des objets parmis la 10ne de classes disponible.
Les objet sont gérés par un arbre N - air.
Tout objet peut contenir tout autre objet.
Il est possible en plus d’ajouter jusqu’à 4 attributs supplémentaire à un objet.
Les attributs peuvent être de type :

  • boolean
  • integer
  • float
  • string

Le programme est téléchargeable sur sourceforge.net :
Adaline level 10

Si je vous adresse ce message c’est pour vous laisser aujourd’hui la possibilité d’implémenter vous même les éléments manquant selon votre entendemment.

J’allais oublier ; La version corespondante à l’objet de ce message est la 1.2.1pre-alpha.

Good luck.

En espérant que ce programme vous séduise, voici le petit HOWTO rédigé à l’attention des utilisateurs :

Quick start :
Do ulimit -s unlimited or other value
-----------------------------------------------------


Control keys :
-----------------------------------------------------
Ctrl+A to save
Ctrl+P to list prevision object in list
Ctrl+O to list next object in list
Ctrl+L to refresh screen
-----------------------------------------------------
quit with Ctrl+D.

You can reload your Prehander.txt file.


-----------------------------------------------------
add TRUE at the end off command line if you want call
network train in reuse mode.

-----------------------------------------------------
give the Result Filename at the command line ;

Default is Prehander.txt
Neural network :

  • you must write a samples set, to fix the network geometry to words size * line width

    • you must train the network with the max epochs and a value for converged.
    • eventualy you must to fix reused condition.

    – detail implementation

    You can create the following classes :

    • animal
    • universe
    • contact
    • event
    • note
    • saved account
    • personal account
    • entpise account
    • car
    • house
    • content
    • activity
    • Deal (line) only 1xxxx and 2xxxx account num have states effects.
    • planning

    for this class you can try « help NAME » where name is class name.

    Implemented command

    • help [ CLASS ] to obtain CLASS help
    • create ARG1 … ARGN, … to create an object
    • list to list the current content of current object
    • switch INDEX to switch to object indexed INDEX
    • parent to back to parent.
    • print to print the current object
    • search NAME to search the 1st occurancy of object named NAME

    Ctrl-? command :

    • Ctrl+A to save
    • Ctrl+P to list prevision object in list
    • Ctrl+O to list next object in list
    • Ctrl+L to refresh screen
    • Ctrl+D to quit

    command line :
    bin/adaline [ FILENAME [ BOOL ] ]
    where FILENAME is the objects tree file
    where BOOL is reused additional parameters to train reused network between FALSE | TRUE

    you must eventualy run ulimit -s LIMIT before adaline call.

    the file prehander-listing containe the adaline entered commands.

    the Data/Human-Lexic.txt is the lexic file.
    the Data/samples-set.txt is the samples set file.
    the adaline.shared.sh_reused file is the persistant reused internal parameter after the network trainning.
    the adaline-human_dialog.wgt is the neural network obtained with PragmARC.REM_NN_Wrapper. from ProgAda developpers.

    to fix the neural network and others value of program, you can to edit the src/lib/adaline-shared.ads file.
    to develop classes you can see the src/lib/prehander-classes* files ; in this case you must to edit the adaline-main.ads and adaline-main.adb file.

    Fonctionment :
    the natural language entry is read from input/command line to be interpreted by neural network.
    the internal result is added with the input.
    the output/Error is the response of neural network.
    the response/internal is the response of output/error line.

    At the 128 request, the network enterring in train period ; The counter renew at 1.

    Structure :

    • the object tree is N-air tree.
    • the state is result of deal traitment.
    • the accounting list is the deal list in activity object.
      – Global Read do this :
      —> at the left_line = 0 the line is printed begining at the top of left_line.

    the state period is between from the first deal line in the activity object to the last deal line in this same activity object.

    usage :
    you can create this : (an object can contain all another object.

    • universe
      • animal
      • house
        • content
        • personal account
        • saved account
        • enteprise account
        • contact
        • car
        • activity
          • event
            • planning
          • deal
          • deal
          • deal
            …/…

    the acc_line can be placed in account object.
    the deal can must be placed in activity ;

    Semantics :

    • the deal in is teh depense
    • the deal out is the recet
    • the tva in is the tva in
    • the tva out is the tva out
    • the result is HT.
      you must to substract or to add the TVA to the result.

    – Attribut –

    you can create four attribut by object.
    use attribute command (ex : attribute Name,Name,Name=value).


    – Path finding –

    Path finding is not implemented.

Bonjour,
J’ai corrigé deux ou trois erreur/oublis ; Du coup j’ai une une floppé de problème.
J’ai corrigé vite fait mais l’idéal serait de réécrire, pour les courageux, dans la procédure read de chaque classe dans les paquet prehand-class-*_class.adb, les lecture de chaîne qui sont faite directement dans la variable cible.

Donc l’idéal serait de lire une variable de cette manière :

declare
       chaine : wide_string := W_Io.Get_Line(File);
begin
       Wide_Fixed.Move(chaine, var);
end;

Du coup j’ai posté un nouveau paquet sur sourceforge.net : Adaline_level_10-1.2.1alpha_pre.tgz.
Subtile nuance ; La aussi je me suis gouré.

Autre chose, j’ai oublié d’exposer le fonctionnement de base :

  • la commande « switch INDEX » permet de passer de l’objet courant à l’objet indexé INDEX.

  • la command « list » permet de lister les objets contenus dans l’objet courant ; Ctrl+O pour l’objet suivant ; Ctrl+P pour l’obkjet précédent.

  • la commande « parent » permet de revenir à l’objet parent.

  • la command « print » affiche l’objet courant.

  • la commande « search NAME » permet d’aller à la première occurance d’un objet nommé NAME.

  • la commande « help » permet d’avoir de l’aide.

  • la commande « help TAG_NAME » permet d’avoir de l’aide pour la creation d’un objet de type TAG_NAME.

  • la commande « atribute name=value » permet d’ajouter un attribut typé à l’objet courant.

  • la commande « dump » n’est pas implémenté.

Bonjour,

Juste pour vous dire ;

J’ai uploadé une archive avec les correction qui s’imposaient. La version 1.2.4b.

J’ai rédigé une petite release note dans laquel je me suis trompé.

La release note indique que le réseau de neurone entre en periode d’apprentissage après 16 requettes.
En fait c’est 8.

L’index est bien à 16 à ce moment là mais comme j’ajoute deux sample à chaque requête…

Merci pour votre compréhension.
Veuillez m’excuser pour la confusion.

Je vous parles deux secondes du réseau de neurones.
Il fait office d’agent de dialogue.
toute les 8 requête donc il entre en période d’apprentissage.
Il connait le beaba de l’agèbre de bool.
il apprend, en tout cas il utilise avec précision le noveau vocabulaire.
il sais de quoi il parle dans la mesure où on lui parle concrètement de quelque chose de réel.
il sais ce que apprendre et sais ce que répondre et interroger.

Bien sûr ce qu’il sait dépend directement de l’ensemble d’exemple.
Je me suis appliqué trois mois pour faire la version actuelle.
il faut pour entamer le dialogue, utiliser le maximum de ses mots et introduire petit à petit un autre dialogue.

Donc l’initialisation est minimale.

J’ai commencé l’apprentissage de la bible sur une machine actuellement à l’arrêt mais je ferai passer le réseaux lorsque l’apprentissage sera suffisant.
Ceci dit c’est très long.

Bonjour,

En espérant que vous me permétiez la question.
J’ai eu des difficulté à sauvegarder pour restaurer un arbre N-air.
Depuis j’ai constaté plusieurs fois qu’il y avait un problème.
Comme j’ai éllaboré l’algo moi même, je vousdrais vous le soumettre pour vérificartion.

voici la sauvegarde :

procedure Save_Object (Object : Abstracted_Access;
                          File : W_Io.File_Type;
                          Index  : Natural := 0) is
      O : Abstracted_Access := Object;
      New_Index : Natural := Index;
   begin

      O.all.Write(File);



      for I in 1..Index-2 loop
         W_Io.Put_Line(File, Wide_Character'Val(7) & "");
      end loop;

      if not Is_Empty(O.Vector) then


         for I in 1..Last_Index(O.Vector) loop
            declare
               E : constant Abstracted_Access :=
                 Element(O.Vector, I);
            begin

               Save_Object(E, File, New_Index+1);

            end;
         end loop;



      end if;

   end Save_Object;

Le caractère bell ici improbable dans les données est utilisé pour la gestion de la restaurationde l’arbre.

Merci pour votre expertise. S’il vous plait.

Je viens de modifier, parce qu’en vérifiant, ça marchais pas ;

 procedure Save_Object (Object : Abstracted_Access;
                          File : W_Io.File_Type;
                          Index  : Natural := 0) is
      O : Abstracted_Access := Object;
      New_Index : Natural := Index;
   begin

      O.all.Write(File);

      W_Io.Put_Line(File, Wide_Character'Val(7) & "");


      if not Is_Empty(O.Vector) then


         for I in 1..Last_Index(O.Vector) loop
            declare
               E : constant Abstracted_Access :=
                 Element(O.Vector, I);
            begin

               Save_Object(E, File, New_Index+1);

            end;
         end loop;

         for I in 1..Index loop
            W_Io.Put_Line(File, Wide_Character'Val(7) & "");
         end loop;


      end if;

   end Save_Object;

Ca semble aller mieux, peut-être que j’ai déjà fais ceci et il y a autre chose.
Je vais poursuivre l’utilisation et vérifier l’état.

Re- bonjour.
Je me demandais, peut - être êtes vous un peu timide sur ce forum.

Volià, ce soir je m’interroge sur le bien fondé de poursuivre ce programme tel qu’il est.

A t - il un interrêt quelconque ?
Faut - il le réécrire ?
Quelqu’un veux t -il me l’acheter ?
Peu mieux faire ? Comment ?

Des question… ?