Jade appliqué cours 1 : hello world, et fenêtres pour agent
par
popularité : 2%
Cet article décrit quelques codes de base pour développer son/ses premiers agents en Jade.
Agent cordial
Classiquement, lorsqu’on apprend un langage, on tente de créer un exemple qui affiche « Hello world ».
Voici le code associé :
- public class HelloAgent extends Agent {
- protected void setup() {
- }}
Pour lancer un agent de type HelloAgent, il faut charger la plateforme Jade et lui demander d’instancier un agent.
Cela peut se faire en ligne :
java jade.Boot monPremierAgent:HelloAgent
Des lignes apparaissent sur la console montrant l’installation en mémoire de Jade, puis le message de l’agent apparaît.
Pour lancer plusieurs agents :
java jade.Boot a1:HelloAgent;a2:HelloAgent;a3:HelloAgent
Il est possible de passer des paramètres (séparés par des virgules , )
java jade.Boot a1:HelloAgent(hello);a2:HelloAgent(salut);a3:HelloAgent(coucou)
On modifie le code précédent pour récupérer le paramètre :
On peut également demander le chargement de la plateforme à partir d’une classe java :
- /**class that launch Jade and the agents*/
- import jade.core.Profile;
- import jade.core.ProfileImpl;
- import jade.util.ExtendedProperties;
- import jade.util.leap.Properties;
- import jade.core.Runtime;
- public class LaunchAgents {
- // préparer les arguments pout le conteneur JADE
- // demander la fenêtre de contrôle
- prop.setProperty(Profile.GUI, "true");
- // nommer les agents
- prop.setProperty(Profile.AGENTS, "a1:HelloAgent(hello);a2:HelloAgent(salut);a3:HelloAgent(coucou)");
- // créer le profile pour le conteneur principal
- ProfileImpl profMain = new ProfileImpl(prop);
- // lancer le conteneur principal
- rt.createMainContainer(profMain);
- }
- }
(Remarque, le paramètre -gui permet d’afficher une fenêtre de contrôle liée à la plateforme)
Agent et comportements
Un agent peut posséder un ou plusieurs comportements.
Jade exécute les agents en tant que processus et, pour chaque agent, prend chacun de ses comportements, exécute son action, vérifie ensuite s’il est fini (`done`) et doit être retiré de la liste.
Le code présent ici crée des agents qui affiche alternativement ’bonjour’, ’salut’ et se retire de la plateforme au bout de 10 secondes.
PingPong
Un exemple classique de test de communication est de créer deux agents, ping et pong, qui se renvoie un message contenant un texte.
Le code présent ici crée ces deux qui s’envoient des messages 30 fois.
Agent et Fenêtre
Un agent étant un processus, de même qu’une fenêtre, la communication entre une fenêtre et un agent doit passer par une gestion d’événements.
Un agent lié à une interface graphique doit étendre la classe GuiAgent
et doit surcharger la méthode protected void onGuiEvent(GuiEvent ev)
pour pouvoir traiter les événements émis par cette interface.
Cette méthode est activée dès qu’un événement lancée par la fenêtre est reçu.
Voici ci-dessous un extrait de fenêtre (à télécharger plus bas) :
- // .......
- /**agent lié à cette interface */
- GuiAgent myAgent;
- /**texte associé au bouton Quitter */
- /**code associé au bouton Quitter*/
- public final static int QUITCODE = -1;
- // .....
- /**Traitement d'un événement utilisateur et transmission à l'agent*/
- //
- if(source.equals(QUITCMD)){
- myAgent.postGuiEvent(ev);
- }
- }
- }
Notez la fonction myAgent.postGuiEvent(ev);
qui propage un élément de type GuiEvent
qui se construit avec deux paramètres : un pointeur sur la fenêtre émettant l’événement, et un code entier.
Un agent `fenêtré` est alors légèrement adapté pour recevoir l’événement :
- public class HelloAgent extends GuiAgent{
- /** petite console d'affichage graphique*/
- public Window4Agent window;
- /** initialisation de l'agent */
- protected void setup() {
- window = new Window4Agent(this);
- window.println(msg + "!, je suis " + this.getLocalName());
- }
- /**réaction à un événement fenêtre (GuiEvent)*/
- protected void onGuiEvent(GuiEvent ev) {
- switch(ev.getType()) {
- case Window4Agent.QUITCODE:
- window.dispose();
- doDelete();
- break;
- }
- }
- }
Ici se trouve les sources d’agents fenêtrés, 4 agents sont lancés, a,b,c et d.
Au clic sur `go` l’agent `a` envoie un message aux agents `b`, `c`, `d` qui l’affichent sur leurs consoles.
Protocoles
En programmation objet, si un objet o1 lance une méthode d’un objet o2 qui n’existe pas ; une erreur est déclenchée.
En programmation agent, si un agent a1 envoie un message à un agent a2 et que cet agent a2 ne comprend pas le message ou choisit de ne pas le traiter, rien ne se passe, et l’agent a1 n’est pas nécessairement mis au courant de l’échec à sa requête.
Les protocoles de communications permettent d’établir des cadres stricts d’échanges.
La norme FIPA propose plusieurs protocoles,
- AchieveRE est un protocole où le destinataire est obligé de répondre, soit qu’il a bienreçu et traité le message, soit qu’il le refuse, soit que ce message est considéré comme un erreur
- ContractNet est un protocole de type appel à propositions.
- SimpleAchieveRE, ...
Une protocole peut être vu comme un comportement. Des méthodes sont exécutées automatiquement à la réception de messages selon leurs performatifs (Inform, Request, .....)
Le code situé ici montre un exemple de dialogue entre 2 agents par le protocole AchieveRE. Un agent soumet une requête à un autre agent et gère ses réponses.
Les négociations peuvent être codées sous forme de protocoles.