Le meilleur moyen pour construire un système multi-agent(SMA) est d'utiliser une plate-forme multi-agent. Une plate-forme multi-agent est un ensemble d'outils nécessaire à la construction et à la mise en service d'agents au sein d'un environnement spécifique. Ces outils peuvent servir également à l'analyse et au test du SMA ainsi créé. Ces outils peuvent être sous la forme d'environnement de programmation (API) et d'applications permettant d'aider le développeur. Nous allons étudier dans cette partie la plate-forme JADE(Java Agent DEvelopment framework).
2 Bref description de JADEJADE (Java Agent DEvelopement framework) est une plate-forme multi-agent créé par le laboratoire TILAB [TILAB] et décrite par Bellifemine et al. Dans [BEL 99][BEL 00]. JADE permet le développement de systèmes multi-agents et d'applications conformes aux normes FIPA [FIPA 00][FIPA 02]. Elle est implémentée en JAVA et fourni des classes qui implémentent « JESS » pour la définition du comportement des agents. JADE possède trois modules principaux (nécessaire aux normes FIPA).
Ces trois modules sont activés à chaque démarrage de la plate-forme.
3 La norme FIPALa FIPA (Foundation for Intelligent Physical Agents) est une organisation à but non lucratif fondée en 1996 dont l'objectif est de produire des standards pour l'interopération d'agents logiciels hétérogènes. Par la combinaison d'actes de langages, de logique des prédicats et d'ontologies publiques, la FIPA cherche à offrir des moyens standardisés permettant d'interpréter les communications entre agents de manière à respecter leur sens initial, ce qui est bien plus ambitieux que XML, qui ne standardise que la structure syntaxique des documents. Afin d'atteindre ce but, le FIPA émet des standards couvrant :
Ces standards évoluent, et sont régulièrement mis à jour, ainsi que de nouveaux standards qui sont nouvellement proposés. Les standards qu'édicte la FIPA ne constituent pas vraiment une plate-forme de construction multi-agents. Ce n'est pas non plus l'objectif que s'est fixé la FIPA. Tout au plus, la FIPA normalise une plate-forme d'exécution standardisée dans un but d'interopérabilité. Ces normes s'appliquent donc pour la plupart en phase de déploiement. Elles n'abordent pas les phases d'analyse ni de conception. Elles peuvent cependant guider certains choix d'implémentation.
3.1 Architecture logiciel de la plate-forme JADE
JADE reprend donc l'architecture de l'Agent Management Reference Model proposé par FIPA.
Les différents modules présentés dans la figure suivante sont présentés sous forme de services.
Les services de base proposés sont le Directory Facilitator (DF) et l'Agent Management System (AMS).
Il est possible de lui demander de tenir en plus le service de Message Transport Service (MTS) pour communiquer entre plusieurs plates-formes.
Mais ce service sera chargé à la demande pour ne conserver par défaut que les fonctionnalités utiles à tout type d'utilisation.
L'agent est l'acteur fondamental de la plate-forme, un Agent Identifier (AID) identifie un agent de manière unique.
Le DF est un composant qui fait office d'annuaire. C'est un service de « pages jaunes » qui permet de mettre en relation les agents avec leurs compétences.
Un agent peut enregistrer ses compétences dans le DF ou interroger le DF pour connaître les compétences proposées par les autres agents.
L'AMS est un autre composant important car il contrôle l'accès et l'utilisation de la plate-forme et maintient un répertoire contenant les adresses de transport des agents de la plate forme.
Ce service est plus un service de type « pages blanches » qui effectue la correspondance entre l'agent et l'AID.
Chaque agent doit s'enregistrer à un AMS pour avoir un AID. Il n'y a qu'un AMS par plate-forme.
Le MTS est une méthode par défaut de communication entre agents de différentes plates-formes.
Cela permet l'interconnexion entre systèmes hétérogènes ou tout au moins de système ne communicant pas de la même façon.
L'Agent Platform (AP) constitue l'infrastructure physique sur laquelle se déploient les agents. Il contient le DF, l'AMS et le MTS.
Lorsqu'on parle de AP, on inclut souvent le matériel électronique, l'OS, le software et les composants cités ci-dessus avec les agents.
Enfin, l'Agent Identifier (AID) est un identifiant précis d'un agent. On lui donne plusieurs paramètres tels que l'adresse de transport, l'adresse de service de résolution de nom, …
Un exemple est : name@HAP (Home Agent Platform)
Dans la plate-forme JADE, deux méthodes sont fournies par la classe Agent afin d'obtenir l'identifiant de l'agent DF par défaut et celui de l'agent AMS : getDefaultDF() et respectivement getAMS(). Ces deux agents permettent de maintenir une liste des services et des adresses de tous les autres agents de la plate-forme. Le service DF propose quatre méthodes afin de pouvoir :
Le service AMS s'utilise généralement de manière transparente (chaque agent créé est automatiquement enregistré auprès de l'AMS et se voit attribué une adresse unique).
Ces deux services fournissent donc les annuaires qui permettent à n'importe quel agent de trouver un service ou un autre agent de la plate-forme.
Le langage de Communication de la plate-forme JADE est FIPA-ACL(Agent Communication language). La classe ACLMessage représente les messages qui peuvent être échangés par les agents. La communication de messages se fait en mode asynchrone. Lorsqu'un agent souhaite envoyer un message, il doit créer un nouvel objet ACLMessage, compléter ces champs avec des valeurs appropriées et enfin appeler la méthode send(). Lorsqu'un agent souhaite recevoir un message, il doit employer la méthode receive() ou la méthode blockingReceive().
Un message ACL dispose obligatoirement des champs suivants :
| Performative : | type de l'acte de communication |
| Sender : | expéditeur du message |
| Receiver : | destinataire du message |
| reply-to : | participant de la communication |
| content : | contenu du message |
| language : | description du contenu |
| encoding : | description du contenu |
| ontology : | description du contenu |
| protocol : | contrôle de la communication |
| conversation-id : | contrôle de la communication |
| reply-with : | contrôle de la communication |
| in-reply-to : | contrôle de la communication |
| reply-by : | contrôle de la communication |
Tous les attributs de la classe ACLMessage peuvent être obtenus et modifiés par les méthodes set/get
Dans le protocole FIPA-request, un agent sollicite un autre agent pour
exécuter des actions et l'agent récepteur retourne soit
une réponse favorable à l'exécution d'actions,
soit une réponse défavorable expliquée par telle
ou telle raison.
Supposons que l'agent i aie besoin de l'agent j
pour exécuter l'action « action ».
Le protocole FIPA-Query signifie que l'agent émetteur sollicite l'agent récepteur pour exécuter un des types d'un performatif « inform », c'est-à-dire pour répondre à la demande.
Supposons que l'agent i fasse une demande à l'agent j.
Le Protocole Contract-Net (CNP) a été défini par Smith [SMI 80]. Il est un mécanisme de négociation par appel d'offre (ou Contract) entre deux types d'agents : l'agent gestionnaire et les agents contractants. L'agent gestionnaire, souhaitant sous-traiter une tâche qu'il doit accomplir, est l'initiateur du contrat. Chaque agent contractant est un agent auquel on propose ce contrat. Le fonctionnement du CNP à été décrit dans [SCD 92]. Ce protocole très souvent utilisé, a été normalisé par l'organisation FIPA et implémenté dans la plate-forme JADE.
La classe ContractNetInitiator (abstraite) implémente le protocole FIPA ContractNet du point de vue de l'agent qui initialise le protocole ie. L'agent qui envoie un message CFP (Call For Proposal).
Le comportement d'initiateur doit également prendre en compte les délais d'attente pour les réponses. Le temps limite est spécifié dans le champ reply-by du message ACL passé au constructeur de cette classe. Si rien n'est spécifié alors une attente infinie est utilisée par défaut. Toutes réponses arrivées hors délais ne sont pas consommées et reste dans la file d'attente des messages de l'agent.
Cette classe propose également un jeu de méthodes destinées à superviser chaque étape du protocole. Elles sont appelées lorsque des messages particuliers sont reçus ou sont à envoyer et doivent être surchargées afin d'adapter le protocole à son contexte d'utilisation :
Afin de pouvoir être en interaction avec plusieurs offrants, deux méthodes supplémentaires sont disponibles afin de collecter les messages par volé : handleAllResponse() et handleAllResultNotifications qui permettent respectivement de récupérer la première série de réponses (ie. NOT-UNDERSTOOD, REFUSE, PROPOSE) et la seconde (ie. FAILURE, INFORM).
Enfin, la classe ContractNetInitiator dispose d'une alternative aux méthodes décrites ci-dessus : il est possible de les remplacer par des comportements génériques correspondants.
Les méthodes registerPrepareCfps(), registerHandlePropose(), registerHandleAllResponses(), registerHandleAllResultNotifications(), permettent de spécifier ces comportements et d'écraser les méthodes qu'ils remplacent.
Dans ce cas le DataStore de la classe doit être utilisé comme mémoire partagée afin d'échanger les messages entre les différents comportements. JADE fournit un jeu de constantes, identifiables par le suffixe KEY, qui représente les clefs pour accéder au DataStore et retrouver tous messages envoyés ou reçus.
La classe ContractNetResponder (abstraite) implémente le protocole FIPA ContractNet du point de vue d'un agent qui répond au message CFP (ie. l'offrant). Il est important de passer le bon modèle de message au constructeur de cette classe car il est utilisé afin de séparer les messages ACL du protocole des autres messages reçus par l'agent. La méthode createMessageTemplate peut être utilisée à ces fins.
Tout comme la classe ContractNetInitiator, cette classe peut être facilement étendue en surchargeant une ou plusieures de ses méthodes prepare() afin de l'adapter à son contexte d'utilisation. Ces méthodes permettent de superviser les étapes du protocole et en particulier de préparer les messages à renvoyer à l'agent initiateur :
Les attributs des messages ACL retournés par ces différentes méthodes doivent être correctement sélectionnés. L'utilisation de la méthode createReply() est donc incontournable pour préparer les réponses. Elle permet entre autre de mettre la valeur appropriée dans le champ in-reply-to du message ACL. Ce champ est important car il contient le conversation-id qui est en fait un identificateur commun pour une série de messages échangés entre deux agents. Ceci permet à tout agent de maintenir plusieurs conversations sans se tromper dans les différents messages à envoyer.
Tout comme la clase ContractNetInitiator il est possible de remplacer les méthodes prepare() de la classe par des comportements spécifiques.
Les méthodes suivantes nommées registerHandleRejectProposal(), registerPrepareResponse(), registerPrepareResultNotification() et registerHandleOutOfSequnece() permettent cette opération. Le Datastore de la classe aura dans ce cas la même fonction que celui de la classe ContractNetInitiator.
L'API fournie par la plate-forme pour le protocole ContractNet est donc très complète et générique. Les opérations qui sont à la charge du programmeur reste la surcharge des différentes méthodes afin de les adapter au contexte d'utilisation du protocole et éventuellement la définition de comportement(s) visant à remplacer certaine(s) méthode(s).
Un agent doit être capable de gérer plusieurs tâches de manière concurrente en réponse à différents évènements extérieurs. Afin de rendre efficace cette gestion chaque agent de JADE est composé d'un seul thread et chaque comportement qui le compose est en fait un objet de type Behaviour. Des agents multi-thread peuvent être créés mais il n'existe pour l'heure actuelle aucun support fournis par la plate-forme (excepté la synchronisation de la file des messages ACL).
Afin d'implémenter un comportement, le développeur doit définir un ou plusieurs objets de la classe Behaviour, les instancier et les ajouter à la file des tâches « ready »de l'agent. Il est à noter qu'il est possible d'ajouter des comportements et sous-comportements à un agent ailleurs que dans la méthode setup().
Tout objet de type Behaviour dispose d'une méthode action() (qui constitue le traitement à effectuer par celui-ci) ainsi que d'une méthode done() (qui vérifie si le traitement est terminé). Dans les détails, l'ordonnanceur exécute la méthode action() de chaque objet Behaviour présent dans la file des tâches de l'agent. Une fois cette méthode terminée, la méthode done() est invoquée. Si la tâche a été complétée alors l'objet Behaviour est retiré de la file. L'ordonnanceur est non-préemptif et n'exécute qu'un seul comportement à la fois, on peut donc considérer la méthode action() comme étant atomique. Il est alors nécessaire de prendre certaines précautions lors de l'implémentation de cette dernière, à savoir éviter des boucles infinies ou des opérations trop longues. La façon la plus classique de programmer un comportement consiste à le décrire comme une machine à états finis. L'état courant de l'agent étant conservé dans des variables locales.
Enfin, il existe également quelques méthodes supplémentaires afin de gérer les objets Behaviour :
La plate-forme JADE fournit sous forme de classes un ensemble de comportements ainsi que des sous-comportements prêt à l'emploi. Elle peut les exécuter selon un schéma prédéfini, par exemple la classe SequentialBehaviour est supportée et exécute des sous-comportements de manière séquentielle. Toutes les classes prédéfinies dans JADE hérite de la classe Abstraite Behaviour. On peut les citer :
Pour supporter la tâche difficile du débogage des applications multi-agents, des outils ont été développés dans la plate-forme JADE. Chaque outil est empaqueté comme un agent, obéissant aux mêmes règles, aux mêmes possibilités de communication et aux mêmes cycles de vie d'un agent générique (agentification de service).
5.1 Agent RMA Remote Management Agent
Le RMA permet de contrôler le cycle de vie de la plate-forme et tous les agents la composant. L'architecture répartie de JADE permet le contrôle à distance d'une autre plate-forme. Plusieurs RMA peuvent être lancés sur la même plate-forme du moment qu'ils ont des noms distincts.
L'outil DummyAgent permet aux utilisateurs d'interagir avec les agents JADE d'une façon particulière. L'interface permet la composition et l'envoi de messages ACL et maintient une liste de messages ACL envoyés et reçus. Cette liste peut être examinée par l'utilisateur et chaque message peut être vu en détail ou même édité. Plus encore, le message peut être sauvegardé sur le disque et renvoyé plus tard.
L'interface du DF peut être lancée à partir du
menu du RMA .Cette action est en fait implantée par l'envoi
d'un message ACL au DF lui demandant de charger son interface
graphique. L'interface peut être juste vue sur
l'hôte où la plate-forme est
exécutée. En utilisant cette interface, l'utilisateur
peut interagir avec le DF.
Quand un utilisateur décide d'épier un agent ou un groupe d'agents, il utilise un agent sniffer. Chaque message partant ou allant vers ce groupe est capté et affiché sur l'interface du sniffer. L'utilisateur peut voir et enregistrer tous les messages, pour éventuellement les analyser plus tard. L'agent peut être lancé du menu du RMA ou de la ligne de commande suivante :
Java jade.Boot sniffer:jade.tools.sniffer.sniffer
Cet agent permet de gérer et de contrôler le cycle de vie d'un agent s'exécutant et la file de ses messages envoyés et reçus.
[BEL 00] Bellifemine F., Giovani C., Tiziana T. Rimassa G., "Jade Programmer's Guide" Jade version 2.6 (http://sharon.cselt.it/projects/jade/), 2000.
[BEL 99] Bellifemine F., Poggi A., Rimassa G., "JADE -- A FIPA-compliant agent framework", CSELT internal technical report. Part of this report has been also published in Proceedings of PAAM'99, London, pp.97-108, April 1999.
[JADE 02] JADE P.G., Bellifemine F., Caire G., Trucco T., Rimassa G., "JADE : Programmer's Guide", Février 2002.
[JADE 00] Java Agent DEvelopment framework. 2000. (http://sharon.cselt.it/projects/jade/)
[RIM 00] Rimassa G., Bellifemine F., Poggi A., "JADE - A FIPA Compliant Agent Framework", PMAA`99, p. 97-108, Londres, Avril 1999.
[SCD 92] Sassi M, Chaib-draa B., "Stratégie de négociation entre agents dans le domaine du transport". Internal raport, Département d'informatique, faculté des sciences et de Génie, Université de Laval, Canada, 1992.
[SMI 80] Smith R.G., Davis R., "Framework for cooperation in distributed problem solving". IEEE Transactions on System, Man and Cybernetics, SMC, Vol. 11 No.161-70. 1980.
http://www.telecomitalialab.com/
http://www.fipa.org/specs/fipa00001/
http://www.fipa.org/specs/fipa00023/
http://www.fipa.org/specs/fipa00037/
http://www.fipa.org/specs/fipa00008/
http://www.fipa.org/specs/fipa00067/
http://www.telecomitalialab.com/