4.3.1. 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 (Behaviour) pour modéliser les tâches qu'un agent peut exécuter. Les agents instancient leurs comportements selon leurs besoins et leurs capacités. Du 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 plateforme d'agents. Ceci signifie que, pendant que les agents différents s'exécutent dans un environnement multi-thread 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. La figure 4.2 résume les étapes d’exécution d’un thread d’agent. 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 en utilisant la méthode addBehaviour(). JADE inclut 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. La figure 4.3 montre la hiérarchie de quelques classes de comportement JADE. Par exemple, la classe OneShotBehaviour permet d’instancier un comportement qui se termine juste après sa première exécution. Ainsi, sa méthode action() qui représente la tâche à effectuer est exécutée une seule fois. La méthode done() de cette classe est déclarée finale (i.e. ne pouvant pas être redéfinie) et retourne toujours vrai (true). La classe CyclicBehaviour permet d’instancier un comportement qui ne se termine pas. Par conséquent, sa méthode action() exécute les mêmes opérations chaque fois où est appelée jusqu’à ce que le thread interne de l’agent exécutant ledit comportement se termine. La méthode done() de cette classe est déclarée finale et retourne toujours false.

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 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. 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.

F
Fig. 4.2 - Etapes d’exécution d’un thread d’agent
F
Fig. 4.3 - Hiérarchie de quelques classes Behaviour de la plateforme JADE