l'agent qui a fait la meilleure proposition. Ensuite, le
gestionnaire et les contractants échangent les informations
nécessaires durant l'accomplissement des tâches.
L'avantage de ce protocole est que les rôles des agents
ne sont pas spécifiés d'avance. Donc n'importe quel agent peut
agir comme un gestionnaire ou bien comme un contractant. Cette
flexibilité permet de nouvelles décompositions des tâches:
un contractant pour une tâche spécifique peut agir comme un
gestionnaire en décomposant sa tâche et en annonçant les
sous-tâches à d'autres agents. Cependant, Un problème qui
peut survenir avec le réseau contractuel est qu'une tâche puisse
être attribuée à un contractant moins qualifié pour
la résoudre si un contractant plus qualifié est occupé au
moment de l'annonce des tâches.
ü Rechercher un service (search)
[Fer05].
Donc les deux agents DF et AMS permettent de maintenir une
liste des services et des adresses de tous les autres agents de la
plate-forme.
3. MTS: MTS est un service permet la
communication entre plusieurs plates-formes mais MTS sera chargé
à la demande pour ne conserver par défaut que les
fonctionnalités utiles à tout type d'utilisation
[Fer05].
La plate-forme multi agent JADE peut être
distribué sur plusieurs machine « les machines pas
nécessairement possèdent le même système
d'exploitation » et les configurations peuvent être modifié
au démarrage des agents en les déplaçant d'une machine
à une autre, ce qui permet une très grande portabilité des
agents [9].
5. Les agents JADE
De point de vue de la programmation concurrente, un agent est
un objet actif, ayant un thread de contrôle. Ainsi que JADE
utilise un modèle de programmation concurrente "un thread-par-agent" au
lieu d'un modèle "un thread-par-comportement" pour éviter une
augmentation du nombre de threads d'exécution exigés sur la
plate-forme d'agents.
L'agent Jade est conforme au standard FIPA 2002 et il
possède toujours un état (APACTIVE, AP-DELETED...).
Dans JADE : Tout est objet : un agent est constitué de
plusieurs classes, dont certaines
clefs :
ü Tout agent hérite de la classe :
jade.core.Agent. « La classe Agent représente une
super-classe commune pour tous les agents définis par l'utilisateur
».
ü L'identifiant d'un agent est une instance de la classe :
jade.core.AID.
Les agents JADE sont actifs (ils peuvent dire Non et ils sont
faiblement couplés), communiquent et interagissent avec les autres
agents grâce à des messages et rend des services.
D'un point de vue plus technique, Jade est orienté
vers une programmation concurrente où chaque agent est en «
compétition ». Les concepteurs de Jade ont ainsi fait le choix de
créer un thread (code parallelisable) par agent plutôt qu'un
thread par comportement. Néanmoins, via le planificateur de
tâches, un comportement peut se bloquer lui même pour éviter
de gaspiller du CPU (Ex : pendant qu'il attend des messages).
Un agent se défini en étendant la classe
jade.core.Agent :
Generation des diagrammes AlliviL d _partir de
_programmes JADE
Cha_pitre i : La _plate forme multi agents
JADE
import jade.core.agent;
public class monAgent extends Agent;
Chaque agent est identifié par un AID qui est
récupérable via la méthode getAID(). Enfin pour
personnaliser l'agent, il est obligatoire dans la méthode
setup():
ü Enregistrer les langages de contenu.
ü Enregistrer les Ontologies.
ü Enregistrer les Services auprès du DF.
ü Démarrer les Comportements (behaviors).
Le nom d'un agent est défini sous la forme :
<nom-agent>@<nom-plate-forme> et il doit être globalement
unique (sur toutes les plateformes).
Les principales méthodes de la classe agent sont
les suivantes :
ü getArguments() : pour obtenir les arguments d'un
agent.
ü doDelete() : pour tuer un agent.
ü takeDown() : appelée quand un agent meurt
.
Exemple d'agent JADE:
package firstAgent; import jade.core.Agent;
/** This example shows a minimal agent that just prints
"Hello World!" and then terminates. */
public class HelloWorldAgent extends Agent {
protected void setup()
{
System.out.println("Hello World! My name is
"+getLocalName()); // Make this agent terminate
doDelete();
}
}
5. 1. Le cycle de vie d'un agent JADE
Un agent JADE peut être dans l'une des
différents états de son cycle de vie définis par les
spécifications FIPA. Ces états sont représentés par
des constantes dans la classe Agent qui figure dans les packages
fournis avec la plateforme JADE :
Generation des diagrammes AllitiL d _partir de
_programmes JADE
Cha_pitre i : La _plate forme multi agents
JADE
Figure 1.5: Le cycle de vie d'un agent JADE
[4]
ü AP INITIATED : l'objet Agent est construit, mais
il n'est pas encore enregistré dans _
l'AMS, il ne possède ni un identificateur ni une adresse
et ne peut pas communiquer avec d'autres agents.
ü AP_ACTIVE : l'objet Agent est enregistré
avec l'AMS, il possède un nom correct et peut accéder à
toutes les caractéristiques du JADE.
ü AP_SUSPENDED : l'objet Agent est actuellement
stoppé. Son thread interne est suspendu et aucun comportement ne peut
s'exécuter.
ü AP WAITING : l'objet Agent est bloqué.
Son thread interne est en sommeil. Il peut se _
réveiller quand une condition est vérifiée
(typiquement quand un message arrive).
ü AP_DELETED : l'exécution du thread
interne de l'agent est terminée. L'agent n'est plus enregistré
avec l'AMS.
ü AP_TRANSIT : un agent mobile entre dans cet
état quand il migre à un nouvel emplacement. Le système
continue à mémoriser les messages afin de les lui envoyer au
nouvel emplacement.
ü AP COPY : cet état est utilisé
intérieurement par le JADE pour cloner un agent. _
ü AP_GONE : cet état est utilisé
intérieurement par le JADE quand un agent mobile a migré vers un
nouvel emplacement et a pris un état stable.
La classe Agent fournit avec JADE possède des
méthodes publiques qui permettent de changer l'état d'un objet
Agent. Par exemple, la méthode doWait () permet de
passer un agent de l'état AP_ACTIVE à l'état
AP_WAITING.
Generation des diagrammes A11.7v1L d _partir de
_programmes JADE
Cha_pitre 1 : La _plate forme multi agents
JADE
5. 2. La communication entre les agents JADE
Pour parler d'un véritable système multi-agents
et non pas d'un ensemble d'agents agissant d'une manière individuelle,
il est nécessaire de voir comment les agents communiquent et
s'échangent les messages.
Chaque agent JADE possède une sorte de boite aux
lettres sous forme d'une liste qui contient les messages « conformes aux
spécifications de la FIPA (FIPA-ACL)» qui lui sont envoyés
par les autres agents selon l'ordre chronologique de leur arrivée.
La classe ACLMessage du package
jade.lang.acl de JADE représente les messages qui peuvent
être échangés par les agents. Cependant, les informations
nécessaires pour envoyer un message JADE sont: l'ensemble des
récepteurs du message, le contenu du message et l'acte de communication.
Cependant, 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()
et lorsqu'un agent souhaite recevoir un message « La réception d'un
message JADE est aussi simple que l'envoi » il suffit d'appeler la
méthode reveive() ou la méthode
blockingReceive() de la classe Agent pour récupérer le
première message non encore lu de l'agent. Cependant, Tous les attributs
de la classe ACLMessage peuvent être obtenus et modifiés par les
méthodes set/get (). Le contenu des messages peut être aussi bien
du texte que des objets car la sérialisation Java est supportée
[Fer05].
Les messages JADE sont composés en général
de :
ü L'émetteur du message : un champ rempli
automatiquement lors de l'envoi d'un message.
ü L'ensemble des récepteurs du message : un
message peut être envoyé à plusieurs agents
simultanément.
ü L'acte de communication : qui représente
le but de l'envoi du message en cours (informer l'agent récepteur, appel
d'offre, réponse à une requête,...)
ü Le contenu du message.
ü Un ensemble de champs facultatifs : la langue
utilisée, l'ontologie, le timeOut,
l'adresse de réponse...
Exemple d'envoi de message dans JADE
[Ben09] ACLMessage message = new ACLMessage
(ACLMessage.«
nom_de_acte_de_communication »);
message.addReceiver(«nom_du_recepteur
» );
Generation des diagrammes AlliviL d partir de
programmes JADE