6. Ingénierie logicielle orienté agent
6.5 La plate-forme JADE
6.5.4 Le modèle d'agents
On a vu qu'une propriété importante d'un agent est son
autonomie : un agent ne doit pas se limiter à réagir aux
événements externes, mais il doit être aussi capable
de prendre l'initiative de nouveaux actes communicatifs d'une façon
autonome. Ceci exige que chaque agent ait un thread interne de contrôle
; cependant, un agent peut engager des conversations simultanées
multiples, tout en poursuivant d' autres activités qui n'impliquent
pas d' échanges de messages.
JADE utilise l'abstraction Comportement pour modéliser
les tâches qu'un agent peut exécuter et les agents instancient
leurs comportements selon leurs besoins et leurs capacités. De
point de vue de la programmation concurrente, un agent est un objet
actif, ayant un thread de contrôle. 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. Ceci signifie que, pendant que les agents
différents s'exécutent dans un environnement multi- threads
de préemption, deux comportements d'un même agent sont planifiés
coopérativement.
En dehors de la préemption, les comportements travaillent tous
comme des threads d'exécution coopératifs, mais il n'y a
pas de pile qui ait besoin d'être sauvée. Un planificateur
(scheduler), exécuté par la classe de base Agent
et caché au programmeur, exécute une politique de "round-robin"
de non-préemption entre tous les comportements disponibles dans
la file des processus prêts. Ainsi, il permet l'exécution
d'une classe dérivée de la classe Comportement jusqu'à
ce qu'elle abandonne le contrôle d'exécution par elle-même.
Si la tâche qui a le contrôle n'est pas encore finie, elle
sera re-planifiée pendant le prochain tour du round-robin à
moins qu'elle ne soit pas bloquée ; en fait, un comportement peut
se bloquer lui-même, par exemple pendant qu'il attend des messages,
pour éviter le gaspillage de temps de CPU, réalisant ainsi
un comportement d'attente occupée.
Donc, le développeur d'agents doit étendre la classe Agent
et implémenter les tâches spécifiques de l'agent par
une ou plusieurs classes Comportement, les instancier et les ajouter à
l'agent. La classe Agent représente une super-classe commune pour
tous les agents définis par l'utilisateur. Du point de vue du programmeur,
la conséquence est qu'un agent JADE est simplement une classe Java
qui étend la classe de base Agent. Cela permet à l'agent
d'hériter un comportement fondamental caché (qui traite
toutes les tâches liées à la plate-forme, telles que
l'enregistrement, la configuration, la gestion à distance, etc.),
et un ensemble de méthodes qui peuvent être appelées
pour implémenter les tâches spécifiques à l'agent,
par exemple envoi des messages, utilisation des protocoles d'interaction
standard, enregistrement sur plusieurs domaines, etc. De plus, il y a
encore deux méthodes qui sont héritées pour gérer
la file de comportements d'agents : addBehaviour(Behaviour) et removeBehaviour(Behaviour).
JADE inclut aussi quelques comportements prêts à être
utilisés pour les tâches les plus communes dans la programmation
des agents, tels que l'envoi et la réception des messages et la
décomposition des tâches complexes en des agrégations
de tâches plus simples. Entre autres, JADE offre aussi une classe
JessBehaviour qui permet l'intégration avec le système expert
JESS (Java Expert System Shell), où JADE fournit le noyau de l'agent
et garantit (autant que possible) la conformité avec les normes
FIPA, alors que JESS est le moteur d'inférence de l'agent qui exécute
le raisonnement nécessaire pour la résolution du problème.
|