• 1. EnvironnementAgentMIND+BODYSSMMAAInteraction OrganisationPar : Youssfi MohamedLaboratoire : Signaux Systèmes Distribués et Intelligence Artificielle (SSDIA)ENSET Mohammedia, Université Hassan II Casablanca,Email : med@youssfi.net
  • 2. PPllaann Concepts fondamentaux des SMA◦ Influence historique :◦ Agent et Systèmes multi agents◦ Interactions des les SMA◦ Architectures parallèles et SMA◦ Applications des SMA◦ Plateformes SMA Mise en oeuvre des SMA avec JADE◦ AArrcchhiitteeccttuurree ddee JJAADDEE ((AAMMSS,, AACCCC eett DDFF ))◦ Configuration et démarrage d’un conteneur de JADE◦ Premier Agent◦ Cycle de vie des agents◦ Comportements des agents Jade◦ Communication entre les agents avec ACL◦ Mobilité des agents◦ Publication et Recherche des services dans agents◦ Application : SMA pour l’automatisation des transactions de vente etd’achats de livres.
  • 3. IINNFFLLUUEENNCCEEHHHHIIIISSSSTTTTOOOORRRRIIIIQQQQUUUUEEEE
  • 4. Historique sur les méthodes ddee pprrooggrraammmmaattiioonnLangage MachineChaque famille de CPU possède sonporophore jeu d’instructionsAssembleur Langage bas niveauProgrammation ProcéduraleProgrammation OrientéeObjetSous programmes: Procédures, fonctions(Basic, Pascal, C, Fortran,..)Objet = Etat+ Comportement + IdentitéConcepts fondamentaux : Objet, classe, Héritage,polymorphisme, encapsulation (C++, JAVA, C#, ..)Programmation OrientéeObjets distribués sur plusieurs machinesObjet DistribuésMiddlewares : (RMI, CORBA, JMS, …)Programmation OrientéecomposantsObjets distribués, réutilisables, configurables,Interchangeables, évolutifs, mobiles, surveillable àchaud : Conteneur (EJB)Programmation OrientéeServicesProgrammation OrientéeAgentsComposant disponibles à d’autres applicationsdistantes hétérogènes via des protocoles (http)transportant des données: XML, JSON = SOAPet REST? Service + Intelligence + Apprentissage+ …
  • 5. Intelligence Artificielle DDiissttrriibbuuééee L'intelligence artificielle est la « recherche de moyenssusceptibles de doter les systèmes informatiques de capacitésintellectuelles comparables à celles des êtres humains » L’IA s’appuie sur les sciences de l’homme :◦ Psychologie linguistique, Sociologie, Neuro Biologie, Biosphère Intelligence Artificielle Distribuée =◦ IA : Modéliser le savoir des agents (compétence)◦ + Distribution : Modéliser leurs interactions (organisation sociale)Métaphore de l’IAPenseur IsoléMétaphore de l’IADCommunauté de penseurs 1985 :◦ = IAD◦ = Systèmes Multi Agents
  • 6. AAGGEENNTTEEEETTTTSSYYSSTTÈÈMMEESS MMUULLTTII AAGGEENNTTSS
  • 7. SSyyssttèèmmeess mmuullttii-aaggeennttss Un Agent est une entité◦ Qui agit d’une façon autonome◦ pour atteindre les objectifs pour lesquels il a été conçu.◦ Peut communiquer avec d’autres agents◦ Doté de capacités semblables aux être vivants Un agent peut être un processus, un robot, un êtrehumain, etc…Un système multi-agent (SMA) est un système distribué :◦ Composé d'un ensemble d'agents distribués,◦ Situés dans un certain environnement◦ et Interagissant selon certaines organisations. Un SMA permet de résoudre des problèmescomplexes en exploitant l’intelligence collectivedes agents qui le compose
  • 8. Caractéristiques dd’’uunn AAggeenntt Dans un SMA, on s'intéresse aux phénomènes : Apprentissage Raisonnement Perception Migration MMéémmoorriissaattiioonn Interaction Intention Commandes et coordination motrice Emotion Conscience Ethique
  • 9. Concepts fondamentaux ddeess aaggeennttss AGENT = BODY + MIND BODY : Dimension physicaliste«Un agent est une entité autonome située dans unenvironnement ouvert » Situation Persistance MMoobbiilliittéé + MIND : Dimension épistémique«Un agent est une entité en interaction avecd’autres agents dans un champ social» Population Interaction Intention Apprentissage Raisonnement
  • 10. Les trois dimensions dd’’uunn aaggeenntt Un agent vit dans un environnement en interagit, dans unchamp social, avec d’autres agents selon une organisationEnvironnementA3R1Espace de vieRessourcesCapteursAgentA1 A2R2communication CentraliséeInteraction OrganisationcoordinationDécentraliséeHirérchiqueACL, KIFACL : Agent Communication LanguageKIF : Knowlage Interchange Format
  • 11. OObbjjeett vveerrssuuss AAggeenntt Un objet est réactif Un objet est une entité passive (ouréactive). Si personne ne demande la valeur d’unattribut ou n’active une méthode del’objet, alors il ne se passe rien.:Objet- x=6- y=12f(x,y)=x2 + y2Calcul(n) =x logn yGet/SetCallAttributsMéthodes Un agent est Proactif Un agent possède, en plus des attributset méthodes, des processus internes quifonctionnent même en l’absence desollicitations externes. Un agent peut donc agir même sipersonne ne lui demande rien.:Agent- x=6- y=12f(x,y)=x2 + y2Calcul(n) =x logn yAttributsMéthodesProcessus1()Processus 2()ProcessusinternesACL
  • 12. OObbjjeett vveerrssuuss AAggeenntt Un agent est persistant : Si un agent est proactif c’est d’abord parce qu’il est munid’au moins un but qu’il cherche à satisfaire de manièrepersistante tant que : Il pense que c’est encore possible (pré condition logique) Il possède les ressources pour le faire (pré condition physique) UUnn aaggeenntt eesstt aaddaappttaattiiff :: Face à un environnement perpétuellement changeant, unagent doit constamment modifier le plan qu’il poursuitpour atteindre un but. Pour cela : Il doit, de manière continue, percevoir et évaluer la situation(contexte) de son action, Construire des représentations en cours même defonctionnement (c’est‐à‐dire être capable d’apprentissage). Élaborer des plans dynamiques qui lancent des processus internesou au contraire les stoppent.
  • 13. Agents réactifs eett ccooggnniittiiffss Agents Réactifs◦ Les agents réactifs sont issus de la modélisationphysicaliste du monde : ils sont assimilés à desfonctions de transition :◦ Pas d’anticipation.◦ Pas d’apprentissageTFonction detransitionStSituationT(St)=St+1
  • 14. Agents réactifs eett ccooggnniittiiffss Agents Cognitifs◦ Les agents cognitifs sont issus de la modélisation mentalistedu monde : ils sont assimilés à des systèmes experts .Représentation :- Du monde--De soit (buts)Actions sur lemondeRaisonnement surles représentationsRetours d’effortssur les actions
  • 15. Exemple d’agent rrééaaccttiiff eett ccooggnniittiiff Problème :« Rob le robot doit sortir de la pièce ». DP = Devant la PortePosition DC = Devant la Clé PO: Porte ouverte : PF: Porte Fermée PFC :PFPorte Fermée à cléRob cognitif: L’agent possède un plan P pour sortir qu’ilexécute de manière séquentielle et déterministeRob réactif : La fonction de transition T est un ensemble nonordonné de règles de type Si condition alors action qui sont exécutées dans une boucle infinieet non déterministe :Si DP and PO Alors SORTIRSi DP and PF Alors OUVRIRSi DP and PFC and C Alors DEVEROUILLERSi DP and PFC Alors RANDOM-WALKSi DC and C Alors RANDOM-WALKSi DC and C Alors PRENDRE-CLEquelle que soit sa position de départ et quel quesoit l’état initial du monde :ALLER-A DPSi PO Alors SORTIRSinon Si PF Alors OUVRIR;SORTIRSinon Si PFCAlors Si C Alors DEVEROUILLER;OUVRIR;SORTIRSinon ALLER-A DCPRENDRE CLEALLERA DPDEVEROUILLER;OUVRIR;SORTIR
  • 16. IINNTTEERRAACCTTIIOONNSS EENNTTRREEAAAAGGGGEEEENNNNTTTTSSSS
  • 17. PPooppuullaattiioonn dd’’aaggeennttss Variables globales et locales◦ Dans un SMA rien n’est complètement global L’environnement étant vaste et ouvert, il n’est pas possible en unlieu donné (par exemple, dans un agent) de stocker toute lareprésentation du monde. Par contre, un agent peut se déplacer ou encore interagir avecdd’’aauuttrreess aaggeennttss qquuii ssoonntt ddaannss ssoonn vvooiissiinnaaggee ppoouurr eexxpplloorreerrl’environnement.◦ Dans un SMA rien n’est complètement local Pour un agent donné, toutes ses entités (informations, processus,buts, …) sont locales mais elles restent accessibles àl’introspection par d’autres agents. Le moyen d’accéder à cette information passe par lesinteractions entre les agents.
  • 18. Modèles dd’’iinntteerraaccttiioonn 1. Interaction Agent ↔Agent◦ Niveau communication Transactions : Agent CommunicationLanguages (ACL)◦ Niveau connaissance (KnowledgeLevel) Echange de connaissances : KIF, XML Données sémantiques : RDF, OWL 2. Interaction Humain ↔AgentAgent HumainOne to OneOne to OneDialogue Homme-MachineACLManyTo Many ManyTo Many◦ Interactions langagières :Reconnaissance vocale 3. Interaction Multi‐agents◦ Résolution distribuée de problèmes(IAD) : coopération, conflits,négociation, … 4. Interaction Multi‐humains◦ Modalité langagière : chat, mail, forums,visio-conférence, …Coopération/Compétition Collectifs médiatisésACL : Agent Communication LanguageKIF : Knowlage Interchange FormatXML : eXtensible Markup LanguageOWL : OntologyWeb LanguageRDF Reource Description Framework
  • 19. Typologie ddeess iinntteerraaccttiioonnss ::IInntteerraaccttiioonn DDiirreeccttee Action directe (interdite) Un agent ne peut pas agir directement sur l’étatet le comportement d’un autre Agent. L’interaction des agents doit passer par l’envoi demessage ACL:Agent Y- x=6- y=12f(x,y)=x2 + y2Calcul(n) =x logn yProcessus1()Processus 2():Agent Y- a=6- b=12g(x,y)=a*x2 +b* y2Calcul(n) =a logn bProcessus1()Processus 2()Get/SetCall
  • 20. Typologie ddeess iinntteerraaccttiioonnss :: IInntteerraaccttiioonn DDiirreeccttee Requête (formelle ou langagière) L’agent envoie une requête à un interlocuteur quiest un autre agent ou à un humain de sonenvironnement L’interlocuteur interprète cette requête et lasatisfait ou non en fonction de sa propressuubbjjeeccttiivviittéé ((ééttaatt pphhyyssiiqquuee eett mmeennttaall))RequêteGould youchange yourlocation?Location?(x2*log(y3)=?)No i won’t,i ‘m fine hereAgent XAgent YNe touche pas mes affaires. Si tu veux quelqueschose, tu n’as qu’à me le demander.
  • 21. Typologie ddeess iinntteerraaccttiioonnss :: IInntteerraaccttiioonn IInnddiirreeccttee Blackboard (base de connaissances) Plusieurs agents déposent et recueillent desobjets ou des informations dans une partie del’environnement prévue à cet effet. Cette partie commune est appelée «BBllaacckkbbooaarrdd »BlackboardP[x] Q[y] R[x] R[u]
  • 22. Typologie ddeess iinntteerraaccttiioonnss :: IInntteerraaccttiioonn IInnDDiirreeccttee Partage de ressources (Stigmergie) Les modèles de population animales par exemple sont fondés surune compétition pour une quantité de ressources à partager quiest fixée : la ressource sert alors de médiateur entre lesagents. Les fourmis par exemple communiquent en déposant desphéromones derrière elles, pour que d'autres fourmis puissentssuuiivvrree llaa ppiissttee jjuussqquu''àà llaa nnoouurrrriittuurree oouu llaa ccoolloonniiee ssuuiivvaanntt lleess bbeessooiinnss,,ce qui constitue un système stigmergiqueAgent XZone de conflitDe ressourcesAgent Y
  • 23. Manifestation ddee ll’’IInntteennttiioonn L’Intention dans la Communication Les agents interagissent au moyen de Langages de Communication Agent(ACL) qui reflètent certaines des propriétés de la langue humaine : La notion de Speech Act : permet à un agent A de communiquer à un agentB non seulement une proposition P mais aussi l’Intention que A prend au sujetde P et de B :Soit P = « Il pleut »INFORM (A,B) [ BELA(P) ] = «Je crois sincèrement, et je t’informeqquu’’iill pplleeuutt» Conséquences :1. B sait que A croît sincèrement P (formellement INFORM imposela sincérité)2. B sait que A a voulu informer B au sujet de P (coopération ?menace ? …3. B choisit ou non d’adopter la croyance de P (il croît à son tour P)ou non4. B réagit à l’impact que 1‐3 peut avoir sur ses propres stratégies. L’intention est importante pour le raisonnement sur les tracesd’interactions
  • 24. Architectures ppaarraallllèèlleess eett SSMMAAArchitectures centraliséesSIMD ou SPMDArchitectures décentraliséesMIMD ou MPMD Les agents ont tous la même structure : étatet comportement. Emergence ou d'Intelligence Collective. Les agents ont des structures différentes Sociétés d'Experts
  • 25. AApppplliiccaattiioonnss ddeess SSMMAA Simulation de phénomènes complexes,◦ Sociologie, physique des particules,◦ Chimie, Robotique,◦ Biologie cellulaire, Ethologie, Ethnologie, … IAD pour la résolution de problèmes complexes Systèmes parallèles et distribués Robotique, Productique TTééllééccoommss Jeux vidéos, Cinéma (Animations 3D) E-commerce, E-learning Urbanisation Smart Grid Gestion du trafic routier Finance : Trading automatique Web Sémantique Internet des objets (Web 3.0) …
  • 26. Simulation ddee pphhéénnoommèènneessccoommpplleexxeess,, En sociologie, paramétrer les différents agents composant unecommunauté. En ajoutant des contraintes, on peut essayer decomprendre quelle sera la composante la plus efficace pourparvenir à un résultat attendu (construction d'un pont). Ilspermettent même d'expérimenter des scénarios qui neseraient pas réalisables sur des populations réelles, que ce soitpour des raisons techniques ou éthiques. DDeess aapppplliiccaattiioonnss eexxiisstteenntt eenn pphhyyssiiqquuee ddeess ppaarrttiiccuulleess ((aaggeenntt= particule élémentaire), en chimie (agent = molécule), en robotique (agent = robot, dans le cas d'une implémentationsur robot réel, on parlera de système multi-robots), en biologie cellulaire(agent = cellule), en éthologie (agent = animal), en sociologie et en ethnologie (agent = être humain).
  • 27. PPllaatteeffoorrmmeess SSMMAA AnyLogic : Logiciel de simulation multi-agents et multi-méthode CORMAS : (COmmon Resources Multi-Agent System)est un framework de développement de systèmes multi-agents,open-source et basé sur le langage depprrooggrraammmmaattiioonn oorriieennttééee oobbjjeett SSmmaallllTTaallkk. IIll eesstt cceennttrréésur des problématiques de recherche en sciences dudéveloppement et de négociation entre acteurs. DoMIS : est un outil permettant la conception deSystèmes Multi-agents (orientés pilotage opérationnel desystèmes complexes) . Utilisé Pour l’analyse décisionnelledes systèmes complexes.
  • 28. PPllaatteeffoorrmmeess SSMMAA JACK : est un langage de programmation et unenvironnement de développement pour agentscognitifs, développé par la société AgentOriented Software comme une extensionorientée agent du langage Java. JJAADDEE :: ((JJaavvaa AAggeenntt DDEEvveellooppmmeenntt)) eesstt uunnframework de développement de systèmesmulti-agents, open-source et basé sur le langageJava. Il offre en particulier un support avancé dela norme FIPA-ACL, ainsi que des outils devalidation syntaxique des messages entre agentsbasé sur les ontologies.
  • 29. PPllaatteeffoorrmmeess SSMMAA Jadex : est une plate-forme agent développée enJAVA par l'université de Hambourg qui se veutmodulaire, compatible avec de nombreuxstandards et capable de développer des agents. JJaaggeenntt :: eesstt uunn ffrraammeewwoorrkk ooppeenn ssoouurrccee rrééaalliissééen Java dont l'objectif est de faciliter ledéveloppement et le test de systèmes multi-agents.
  • 30. PPllaatteeffoorrmmeess SSMMAA Janus : est une plateforme multi-agents modulaire écriteen Java. Elle permet de créer des systèmes multi-agentsavec ou sans une approche organisationnelle basée surle modèle Capacité-Rôle-Interaction-Organisation(CRIO). JJaassoonn :: eesstt uunn eennvviirroonnnneemmeenntt ooppeenn ssoouurrccee ddeedéveloppement d'agents dans le formalisme AgentSpeak,et développé en Java
  • 31. PPllaatteeffoorrmmeess SSMMAA MadKit : est une plate-forme multi-agents modulaireécrite en Java et construite autour du modèleorganisationnel Agent/Groupe/Rôle. C'est une plate-formelibre basée sur la licence GPL/LGPL développéeau sein du LIRMM. MAGIQUE : est une plate-forme pour agentspphhyyssiiqquueemmeenntt ddiissttrriibbuuééss ééccrriittee eenn JJaavvaa eett ffoouurrnniissssaanntt uunnmodèle de communication original d'appel à lacantonade. Dans MAGIQUE, les compétences sontdissociées des agents. L'architecture des agents et lesdifférentes compétences sont développées séparément.Les compétences sont ensuite greffées comme plugindans les agents au gré du concepteur. Cette plate-formeest développée au sein du LIFL.
  • 32. PPllaatteeffoorrmmeess SSMMAA OMAS : Open Multi-Agent Asynchronous Systems est une plate-formede recherche développée par l'équipe d'intelligenceartificielle de l'Université de technologie de Compiègne, sous ladirection de Jean-Paul Barthès. SemanticAgent : est basé sur JADE et permet le développementd'agents dont le comportement est représenté en SWRL.SSeemmaannttiiccAAggeenntt eesstt ddéévveellooppppéé aauu sseeiinn dduu LLIIRRIISS,, iill eesstt ooppeenn--ssoouurrccee eettsous licence GPL V3. SPADE: est un environnement de développement d'organisationsmulti-agents basé sur le protocole XMPP et est écrit en Python. MASSIVE : est un logiciel pour la simulation de foule, basé multi-agents,qui a permis la création d'effets spéciaux dans un grandnombre de films, ayant été développé à l'origine pour les scènes decombat dans Le Seigneur des anneaux.
  • 33. PPllaatteeffoorrmmeess SSMMAA Golaem Crowd est un plug-in pour Maya (logiciel) basé multi-agentet permettant d'effectuer des simulations de foule pour les effetsspéciaux directement dans Maya.
  • 34. MMIISSEE EENN OEOEUUVVRREE DDEESSSSSSMMMMAAAA AAAAVVVVEEEECCCC JJJJAAAADDDDEEEE
  • 35. JJAADDEE?? JJaavvaa AAggeenntt DDEEvveellooppeemmeenntt JADE est une plate-forme multi-agent créé par le laboratoire TILAB. C’est un framework qui permet le développement de systèmes multi-agentset d'applications conformes aux normes FIPA (Foundation forIntelligent Physical Agents). La FIPA est une organisation en 1996 dont l'objectif est de produiredes standards pour l'interopération d'agents logiciels hétérogènes. JADE possède trois modules principaux (nécessaire aux normes FIPA).◦ DF « Directory Facilitator » fournit un service de « pages jaunes» à laplate-forme ;◦ ACC «Agent Communication Channel » gère la communication entre lesagents ;◦ AMS « Agent Management System » supervise l'enregistrement des agents,leur authentification, leur accès et l'utilisation du système. Ces trois modules sont activés à chaque démarrage de la plate-forme.
  • 36. Plateforme SSMMAA :: JJAADDEE JADE est un middleware qui facilite le développementdes systèmes multi agents (SMA). JADE contient :◦ Un Runtime Environment : l'environnement ou les agents peuventvivre.◦ Une librairie de classes : que les développeurs utilisent pour écrireleurs agents◦ Une suite d'outils graphiques : qui facilitent la gestion et lassuuppeerrvviissiioonn ddee llaa ppllaatteeffoorrmmee ddeess aaggeennttss Chaque instance du JADE est appelée conteneur« Container », et peut contenir plusieurs agents. Un ensemble de conteneurs constituent uneplateforme. Chaque plateforme doit contenir un conteneurspécial appelé main-container et tous les autresconteneurs s'enregistrent auprès de celui-là dés leurlancement
  • 37. Architecture LLooggiicciieellllee ddee JJAADDEEJADE PlatformJADE Main ContainerDFAMSMessage Transport SystemM1Corba IIOP Server ACCM2 M3Jade ContainerMessage Transport SystemJade ContainerMessage Transport System
  • 38. CCoonnffiigguurraattiioonn Pour manipuler JADE sur ligne de commande, vous aurez besoind’ajouter la variable d’environnement classpath je fchier jade.jar
  • 39. Lancer la plateforme jjaaddee ssuurr lliiggnneeddee ccoommmmaannddee pour lancer MainContainer sur ligne de commande:◦ Taper la commande : java jade.Boot -gui
  • 40. Lancer la plateforme jjaaddee ssuurr lliiggnneeddee ccoommmmaannddee pour lancer un autre container dans une autre machine :◦ Taper la commande : java jade.Boot –container –host Main_IP_Adress
  • 41. DDéémmaarrrreerr llee MMaaiinnCCoonnttaaiinneerr aavveecc uunneeaapppplliiccaattiioonn jjaavvaaimport jade.core.Profile; import jade.core.ProfileImpl;import jade.core.Runtime; import jade.util.ExtendedProperties;import jade.util.leap.Properties;import jade.wrapper.AgentContainer;public class MainContainner {public static void main(String[] args) {try{RRuunnttiimmee rruunnttiimmee==RRuunnttiimmee..iinnssttaannccee(());;Properties properties=new ExtendedProperties();properties.setProperty(Profile.GUI,true);ProfileImpl profileImpl=new ProfileImpl(properties);AgentContainer mainContainer=runtime.createMainContainer(profileImpl);mainContainer.start();}catch(Exception e){ e.printStackTrace(); }}}
  • 42. EExxééccuuttiioonn ddee MMaaiinnCCoonnttaaiinneerr
  • 43. DDéémmaarrrreerr uunn AAggeennttCCoonnttaaiinneerr aavveeccuunnee aapppplliiccaattiioonn jjaavvaaimport jade.core.ProfileImpl;import jade.core.Runtime;import jade.wrapper.AgentContainer;public class Container {public static void main(String[] args) {ttrryy {{Runtime runtime=Runtime.instance();ProfileImpl profileImpl=new ProfileImpl(false);profileImpl.setParameter(ProfileImpl.MAIN_HOST,localhost);AgentContainer agentContainer=runtime.createAgentContainer(profileImpl);agentContainer.start();} catch (Exception e) { e.printStackTrace(); }}}
  • 44. Lancement dd’’uunn ccoonntteenneeuurr JJAADDEELancement de 3 conteneurs JADE
  • 45. CCrrééeerr lleess aaggeennttss On souhaite créer une application multi-agents.Ce SMA est contient◦ Des agents qui demandent l’achat d’un livre◦ et d’autres agents qui vendent les livres.◦ ll’’aacchheetteeuurr ddeevvrraaiitt cchhooiissiirr ll’’aaggeenntt qquuii ooffffrree lleemeilleur prix à travers un processus decommunication entre les agents.
  • 46. DDiiaaggrraammmmee dd’’iinntteerraaccttiioonnssContainer1 MainContainer Container2 Container3: Acheteur :AMS :DF :Vendeur :VendeurS’enregistrer (A1)S’enregistrer (V1)publier (service)S’enregistrer (V2)publier (service)Chercher liste des vendeursContainer 0:ConsomREQUEST (livre)CFP CFP PROPOSEPROPOSEBEST PROPAP ACCEPT or REFUSEINFORM
  • 47. UUnn AAggeenntt JJAADDEE Un agent JADE est une classe qui hérite de la classe Agent etqui redéfinie des méthodes qui définissent le cycle de vie del’agent dans la plateforme. La méthode setup est la première méthode qui sera appeléeaprès instanciation de l’agent par le container. la méthode doDelete permet de demander au container deddééttrruuiirree ll’’aaggeenntt. Avant que l’agent soit détruit, la méthode takeDown est appelée. Un agent peut se déplacer d’un container à l’autre.◦ Avant chaque opération de migration, la méthode beforeMove estappelée◦ Après chaque opération de migration, la méthode afterMove estappelée D’autres méthodes seront présentés par la suite.
  • 48. MMyy FFiirrsstt AAggeennttpackage agents;import jade.core.Agent;public class BookBuyerAgent extends Agent {@Overrideprotected void setup() {System.out.println(Salut je suis l'acheteur!);System.out.println(My Name is +this.getAID().getName());System.out.println(Je me prépare .....);}@Overrideprotected void beforeMove() {SSyysstteemm..oouutt..pprriinnttllnn((AAvvaanntt ddee mmiiggrreerr vveerrss uunnee nnoouuvveellllee llooccaattiioonn ..........));;}@Overrideprotected void afterMove() {System.out.println(Je viens d'arriver à une nouvelle location .....);}@Overrideprotected void takeDown() {System.out.println(avant de mourir .....);}}
  • 49. AAggeenntt iiddeennttiiffiieerr Chaque agent est identifié par un identifiant unique dans la plateforme. L’identifiant d’un objet de type jade.code.AID La méthode getAID() de la classe Agent permet de récupérerl’agentIdentifier Un objet de type AID contient le nom de l’agent plus le nom de lapalteforme (nom de domaine ou adresse IP) ainsi que le numéro deport de l’annuaire. Exemple de nom complet : acheteur1@192.168.30.12:1099/JADE Pour créer un objet de type AID sachant le nom local, o peutécrire :◦ AID vendeur=new AID(Vendeur1, AID.ISLOCALNAME); Le paramètre ISLOCALNAME indique que le premierparamètre représente le nom local.
  • 50. Déployer l’agent ssuurr lliiggnnee ddee ccoommaannddee Pour déployer un agent dans un nouveau container sur ligne de commande on peut écrire lacommande suivante :◦ Java jade.Boot -container –host localhost –agents acheteur1:agents.BookBuyerAgent
  • 51. Déployer l’agent dans une aapppplliiccaattiioonn jjaavvaa ::import jade.core.ProfileImpl; import jade.core.Runtime;import jade.wrapper.AgentContainer; import jade.wrapper.AgentController;public class BookBuyerContainer {public static void main(String[] args) {try {Runtime runtime=Runtime.instance();ProfileImpl profileImpl=new ProfileImpl(false);profileImpl.setParameter(ProfileImpl.MAIN_HOST,localhost);AgentContainer agentContainer=runtime.createAgentContainer(profileImpl);AAggeennttCCoonnttrroolllleerr aaggeennttCCoonnttrroolllleerr==aaggeennttCCoonnttaaiinneerr..ccrreeaatteeNNeewwAAggeenntt((aacchheetteeuurr11,,agents.BookBuyerAgent, new Object[]{});agentController.start();} catch (Exception e) {e.printStackTrace();}}}Infos: --------------------------------------Agent container Container-4@192.168.1.26 is ready.--------------------------------------------Salut je suis l'acheteur!My Name is acheteur1@WIN-7PA448PU1OR:1099/JADEJe me prépare .....
  • 52. Tester la mmoobbiilliittéé ddee ll’’aaggeenntt L’interface graphique de JADE permet de demander d’un agent demigrer d’un container à l’autre.Agent container Container-4@192.168.1.26 is ready.--------------------------------------------Salut je suis l'acheteur!My Name is acheteur1@WIN-7PA448PU1OR:1099/JADEJe me prépare .....Avant de migrer vers une nouvelle location .....
  • 53. Passer des argument àà uunn aaggeenntt aauu mmoommeenntt dduuddééppllooiieemmeenntt Les agents peuvent récupérer les arguments passé au moment dedéploiement sur ligne de commande ou dans le programme sous formed’un tableau d’objets. La méthode getArguments() de la classe Agent permet de récupérer laliste des arguments. Supposant qu’au moment du déploiement de notre agents nous passonsccoommmmee aarrgguummeenntt llee nnoomm dduu lliivvrree àà aacchheetteerr:: Sur ligne de commande :Java jade.Boot -container –host localhost –agentsacheteur1:agents.BookBuyerAgent(XML) Avec le code java :AgentController agentController=agentContainer.createNewAgent(acheteur1,agents.BookBuyerAgent, new Object[]{XML});
  • 54. Passer des argument àà uunn aaggeenntt aauu mmoommeenntt dduuddééppllooiieemmeennttpackage agents; import jade.core.Agent;import jade.core.Location;public class BookBuyerAgent extends Agent {private String livre;@Overrideprotected void setup() {Object[]args=getArguments();if(args.length==1){ livre=(String) args[0];System.out.println(Salut l'acheteur :+this.getAID().getName()+ est prêt n je tente d'acheter lelivre :+livre);}else{System.out.println(il faut spécifier le livre comme argument);doDelete();} }@Overrideprotected void takeDown() {System.out.println(Destruction de l'agent +this.getAID().getName());}}
  • 55. Déployer l’agent aavveecc ddeess aarrgguummeennttss
  • 56. Affecter les comportements àà uunn aaggeenntt Pour qu'un agent JADE exécute une tâche, nous avons tout d'abord besoinde définir ces tâches. Les tâches dans JADE (appelées behaviours ou des comportements)sont des instances de la classe jade.core.Behaviours . pour qu'un agent exécute une tâche on doit lui l'attribuer par laméthode addBehaviour(Behaviour b) de la classe jade.core.Agent. Chaque Behaviour doit implémenter au moins les deux méthodes :◦ action() : qui désigne les opérations à exécuter par le Behaviour;◦ done() : qui exprime si le Behaviour a terminé son exécution ou pas. Il existe deux autres méthodes dont l'implémentation n'est pas obligatoiremais qui peuvent être très utiles :◦ onStart() : appelée juste avant l'exécution de la méthode action();◦ onEnd() : appelée juste après la retournement de true par la méthode done().
  • 57. Affecter les comportements àà uunn aaggeenntt Des fois on a besoin de savoir quel est lepropriétaire d'un Behaviour, et cela peut êtreconnu par le membre myAgent du Behaviouren question. JADE alloue un thread par agent, pour cela unaaggeenntt eexxééccuuttee uunn BBeehhaavviioouurr àà llaa ffooiiss. L'agent peut exécuter plusieurs Behaviourssimultanément en choisissant un bon mécanismede passation d'un Behaviour à un autre (c'est à lacharge du programmeur et non pas à la chargedu JADE).
  • 58. BBeehhaavviioouurrss : JADE offre trois types de Behaviours simple. Ces Behaviours sont :◦ One-shot Behaviour Un one-shot Behaviour est une instance de laclasse jade.core.behaviours.OneShotBehaviour. Il a la particularité d'exécuter sa tâche une et une seule fois puis il se termine. La classe OneShotBehaviour implémente la méthode done() et elle retourne toujours true.◦ Cyclic Behaviour Un cyclic Behaviour est une instance de laccllaassssee jjaaddee..ccoorree..bbeehhaavviioouurrss..CCyycclliiccBBeehhaavviioouurr. un cyclic Behaviour exécute sa tâche d'une manière répétitive. La classe CyclicBehaviour implémente la méthode done() qui retournetoujours false.◦ Generic Behaviour Un Generic Behaviour est une instance de la classe jade.core.behaviours.Behaviour. Le Generic Behaviour vient entre le One-shot Behaviour et le Cyclic Behaviour de faitequ'il n'implémente pas la méthode done() et laisse son implémentation au programmeur, doncil peut planifier la terminaison de son Behaviour selon ces besoin.
  • 59. LLeess BBeehhaavviioouurrss ppllaanniiffiiééss WakerBehaviour◦ Le WakerBehaviour est implémenté de façon à exécuter laméthode onWake() après une période passée comme argument auconstructeur.◦ Cette période est exprimée en millisecondes. Le Behaviour prend finjjuussttee aapprrèèss aavvooiirr eexxééccuuttéé llaa mméétthhooddee oonnWWaakkee(()). TickerBehaviour◦ Le TickerBehaviour est implémenté pour qu'il exécute sa tâchepériodiquement par la méthode onTick().◦ La durée de la période est passée comme argument au constructeur.
  • 60. PPaarraalllleellBBeehhaavviioouurr Pour qu’un agent puisse exécuter plusieurs comportements à la fois, il faut utiliserParallelBehaviourpackage fa; import …public class FirstAgent extends Agent {@Overrideprotected void setup() {ParallelBehaviour parallelBehaviour=new ParallelBehaviour();addBehaviour(parallelBehaviour);parallelBehaviour.addSubBehaviour(new CyclicBehaviour() {@Overrideppuubblliicc vvooiidd aaccttiioonn(()) {{ //// TT11}}});parallelBehaviour.addSubBehaviour(new TickerBehaviour(this,1000) {@Overrideprotected void onTick() { // T2 }});parallelBehaviour.addSubBehaviour(new Behaviour() {int compteur;@Overridepublic boolean done() { return (compteur==4);}@Override public void action() { ++compteur; // T3 }}); }}
  • 61. EExxeemmppllee 11 ::public class BookBuyerAgent extends Agent {private String livre; private int compteur;@Overrideprotected void setup() {System.out.println(Salut je suis l'acheteur!);System.out.println(My Name is +this.getAID().getName()); System.out.println(Je me prépare .....);Object[] args=getArguments();if(args.length==1){ livre=(String) args[0]; } else{System.out.println(J'ai besoin du nom du livre à acheter ...);doDelete();}addBehaviour(new OneShotBehaviour() {@Overridepublic void action() {System.out.println(Cette action est exécutée une seule fois);} });addBehaviour(new TickerBehaviour(this,1000) {@Overrideprotected void onTick() {++compteur;System.out.println(Tentative Num +compteur+ pour acheter le livre +livre);}});}
  • 62. RReeddééppllooyyeerr ll’’aaggeennttAgentController agentController=agentContainer.createNewAgent(acheteur1,agents.BookBuyerAgent, new Object[]{XML});Salut je suis l'acheteur!My Name is acheteur1@WIN-7PA448PU1OR:1099/JADEJJee mmee pprrééppaarree .....Cette action est exécutée une seule foisTentative Num 1 pour acheter le livre XMLTentative Num 2 pour acheter le livre XMLTentative Num 3 pour acheter le livre XMLTentative Num 4 pour acheter le livre XML…
  • 63. Communication eennttrree aaggeennttss Pour que plusieurs agents JADE arrivent àcollaborer, ils doivent s'échanger desmessages. Chaque agent JADE possède une sorte debbooiittee aauuxx lleettttrreess qquuii ccoonnttiieenntt lleessmessages qui lui sont envoyés par lesautres agents. Ces boites aux lettres sont sous formed'une liste qui contient les messages selonl'ordre chronologique de leur arrivée.
  • 64. Format dd''uunn mmeessssaaggee JJAADDEE Les agents JADE utilisent des messages conformes auxspécifications de la FIPA (FIPA-ACL ) . les messages JADE sont des instances de la classeACLMessage du package jade.lang.acl. Ces messages sont composés en général de : L'émetteur du message : un champ rempli automatiquement lorsddee ll''eennvvooii dd''uunn mmeessssaaggee. L'ensemble des récepteurs du message : un message peut êtreenvoyé à plusieurs agents simultanément. L'acte de communication : qui représente le but de l'envoi dumessage en cours (informer l'agent récepteur, appel d'offre, réponse àune requête,…) Le contenu du message. Un ensemble de champs facultatifs, comme la langue utilisée,l'ontologie, le timeOut, l'adresse de réponse…
  • 65. LL''eennvvooii dd''uunn mmeessssaaggee Pour envoyer un message, il suffit de remplir les champs nécessaires(l'ensemble des récepteur et le contenu du message et l'acte decommunication) d'un message JADE, puis d'appeler la méthode send()de la classe Agent. Voici un exemple d'envoi d'un message JADE. ACLMessage message = new ACLMessage(ACLMessage.INFORM); message.addReceiver(new AID(vendeu1, AID.ISLOCALNAME)); message.setContent(Livre XML); send(message);
  • 66. RReecceeppttiioonn dd''uunn mmeessssaaggee La réception d'un message est aussi simple que l'envoi. Il suffit d'appeler la méthode reveive() de la classe Agent pourrécupérer le premier message non encore lu de l'agent. Exemple : ACLMessage msg = receive(); // Pour envoyer la réponse : ACLMessage message = new ACLMessage(ACLMessage.INFORM); message.addReceiver(msg.getSender()); message.setContent(400); send(message);
  • 67. L'attente dd''uunn mmeessssaaggee Il se peut qu'un agent doive effectuer un certain traitement oulancer quelques tâches après avoir reçu un message d'un autreagent. Il est possible de faire une attente active jusqu'à l'arrivé dumessage en utilisant la méthode block() : Exemple :addBehaviour(new CyclicBehaviour() {@@OOvveerrrriiddeepublic void action() {System.out.println(Cyclic behavior);ACLMessage msg=receive();if(msg!=null){System.out.println(Réception du message :+msg.getContent());}else{block();}} });
  • 68. EExxeemmppllee ddee mmeessssaaggeess Envoyer un message à tous les vendeurspour leur demander de proposer une offreconcernant un livre. Ici nous utilisons un message dont l’attributppeerrffoorrmmaattiivvee eesstt CCFFPP ((CCaallll FFoorr PPrrooppoossaall))// Message carrying a request for offerACLMessage cfp = new ACLMessage(ACLMessage.CFP);for (int i = 0; isellerAgents.lenght; ++i) {cfp.addReceiver(sellerAgents[i]);}cfp.setContent(targetBookTitle);myAgent.send(cfp);
  • 69. Filtrer lleess mmeessssaaggee ::MMeessssaaggeeTTeemmppaallttee Plusieurs messages peuvent arriver dansla file d’attente. Plusieurs agents tentent d’accéder auxmessages qui arrivent, iill eesstt iimmppoorrttaanntt ddee ddiissppoosseerr dd’’uunn mmooyyeennqui permet à un agent de filtrer lesmessages qui le concernent dans le uncontexte quelconque. Les Templates de messages permettent derésoudre ce problème.
  • 70. MMeessssaaggeeTTeemmppllaattee La classe MessageTemplate dispose d’un ensemble de méthodesstatiques de fabrique de d’objet MessageTemplate selondifférents critères. Exemples :◦ Ignorer tous les messages sauf ceux qui ont l’optionperformative est CFPaddBehaviour(new CyclicBehaviour() {@Overridepublic void action() {MessageTemplate mt =MessageTemplate.MatchPerformative(ACLMessage.CFP);ACLMessage msg = myAgent.receive(mt);if (msg != null) {// CFP Message received. Process it}else {block();}}}
  • 71. DDFF AAggeenntt Le service des pages jaunes permet aux agents de la plateforme depublier leurs services. D’autres agents de la plateforme peuvent découvrir ces services à partirde ce service de pages jaunes. Dans JADE, Le service des pages jaunes est assurée par un agent DF(Directory Facilitator) en respectant les spécification de la FIPA.
  • 72. Interactions aavveecc DDFF aaggeenntt Les agents peuvent communiquer avecDFAgent en envoyant des message ACL Le contenu de ces messages doiventrespecter la norme (SL0 language) et uneontologie propre à ce service ( FIPA-Agent-MMaannaaggeemmeenntt OOnnttoollooggyy)) Pour simplifier ces interactions, JADE a définila classe jade.domain.DFService aveclaquelle, il est possible de publier et dechercher des services simplifiant ainsi lesinteractions avec DFAgent.
  • 73. Publication ddeess sseerrvviicceess Un agent qui souhaite publier un service, doit fournir unedescription qui incluse :◦ Son identifiant AID◦ Liste des langages et des ontologies que les autres agent doiventutiliser pour communiquer avec lui◦ Liste des services publiés◦ Pour chaque service publié, on doit indiquer : LLee ttyyppee dduu sseerrvviiccee Le nom du service Les langages et les ontologies à utiliser pour exploiter ce service Et d’autres propriétés spécifiques. Les classe◦ DFAgentDescription,◦ ServiceDescription◦ et Property du package jade.domain.FIPAAgentManagement représentent lestrois abstraction mentionnées.
  • 74. Publication ddeess sseerrvviicceess@Overrideprotected void setup() {// Register the book-selling service in the yellow pagesDFAgentDescription dfd = new DFAgentDescription();dfd.setName(getAID());ServiceDescription sd = new ServiceDescription();sd.setType(book-selling);ssdd..sseettNNaammee((JJAADDEE--bbooookk--ttrraaddiinngg));;dfd.addServices(sd);try {DFService.register(this, dfd);}catch (FIPAException fe) {fe.printStackTrace();}}
  • 75. Suppression dd’’uunn sseerrvviiccee ppuubblliiéé Quand un agent termine son travail, il est important desupprimer ses services des pages jaunes. Généralement cette opération est effectuée dans laméthode takeDown()@Overrideprotected void takeDown() {// Deregister from the yellow pagestry {DFService.deregister(this);}catch (FIPAException fe) {fe.printStackTrace();}}
  • 76. Chercher ddeess sseerrvviicceess Un agent qui souhaite chercher des services doit fournir au DF,une template de description qui décrit les services souhaités. Le résultat de la recherche est une liste de descriptions deservices. La méthode statique search() de la classe DFService peut êtreutilisée pour ce fait.addBehaviour(new TickerBehaviour(this, 60000) {pprrootteecctteedd vvooiidd oonnTTiicckk(()) {{// Update the list of seller agentsDFAgentDescription template = new DFAgentDescription();ServiceDescription sd = new ServiceDescription();sd.setType(book-selling); template.addServices(sd);try {DFAgentDescription[] result = DFService.search(myAgent, template);AID[] sellerAgents = new AID[result.length];for (int i = 0; iresult.length; ++i) {sellerAgents[i] = result[i].getName();}}catch (FIPAException fe) { fe.printStackTrace(); }
  • 77. PPrreemmiièèrree AApppplliiccaattiioonn Un agent consommateur demande à l’agent Acheteurd’acheter un livre L’agent acheteur demande à l’agent vendeur de luidonner son offre L’agent acheteur accepte l’offre Et la transaction est conclue::CCoonnssoommmmaatteeuurr ::AAcchheetteeuurr ::VVeennddeeuurrREQUEST CFP PROPOSEACCEPT_PROPOSALCONFIRMRESPONSE
  • 78. BBooookkBBuuyyeerrAAggeennttpackage agents; import jade.core.AID; import jade.core.Agent;import jade.core.behaviours.CyclicBehaviour; import jade.lang.acl.ACLMessage;import jade.lang.acl.MessageTemplate;public class BookBuyerAgent extends Agent {private int compteur;@Overrideprotected void setup() {System.out.println(Salut je suis l'agent Acheteur mon nomest:+this.getAID().getName());addBehaviour(new CyclicBehaviour() {private AID requester; private String livre; private double prix;@Overridepublic void action() {try {MessageTemplate template=MessageTemplate.or(MessageTemplate.MatchPerformative(ACLMessage.PROPOSE),MessageTemplate.or(MessageTemplate.MatchPerformative(ACLMessage.CONFIRM),MessageTemplate.MatchPerformative(ACLMessage.REQUEST)));
  • 79. BBooookkBBuuyyeerrAAggeennttACLMessage aclMessage=receive(template);if(aclMessage!=null){switch(aclMessage.getPerformative()){case ACLMessage.REQUEST :++compteur;System.out.println(#########################################);System.out.println(Requête d'achat de livre:);System.out.println(From :+aclMessage.getSender().getName());livre=aclMessage.getContent();rreeqquueesstteerr==aaccllMMeessssaaggee..ggeettSSeennddeerr(());;System.out.println(Livre : +livre);System.out.println(............................);System.out.println(Envoi de la requête....);ACLMessage msg=new ACLMessage(ACLMessage.CFP);msg.setContent(livre);msg.setConversationId(livre+-+compteur);msg.addUserDefinedParameter(compteur, String.valueOf(compteur));msg.addReceiver(new AID(Vendeur1,AID.ISLOCALNAME));System.out.println(....... En cours);Thread.sleep(5000); send(msg);break;
  • 80. BBooookkBBuuyyeerrAAggeennttcase ACLMessage.PROPOSE :prix=Double.parseDouble(aclMessage.getContent());System.out.println(***********************************);System.out.println(Conversation ID:+aclMessage.getConversationId());System.out.println(Réception de l'offre :);System.out.println(From :+aclMessage.getSender().getName());System.out.println(Prix=+prix);System.out.println(-----------------------------------);SSyysstteemm..oouutt..pprriinnttllnn((CCoonncclluussiioonn ddee llaa ttrraannssaaccttiioonn..............));;ACLMessage aclMessage2=aclMessage.createReply();aclMessage2.setPerformative(ACLMessage.ACCEPT_PROPOSAL);System.out.println(...... En cours);Thread.sleep(5000);send(aclMessage2);break;
  • 81. BBooookkBBuuyyeerrAAggeennttcase ACLMessage.CONFIRM:System.out.println(.........................);System.out.println(Reçu de la confirmation ...);System.out.println(Conversation ID:+aclMessage.getConversationId());ACLMessage msg3=new ACLMessage(ACLMessage.INFORM);msg3.addReceiver(requester);msg3.setConversationId(aclMessage.getConversationId());msg3.setContent(transaction+ livre+livre+/livre++ pprriixx++lliivvrree++//pprriixx+ fournisseur+aclMessage.getSender().getName()+/fournisseur+ /transaction);send(msg3);break;}}else{block();}} catch (Exception e) {e.printStackTrace();}
  • 82. BBooookkSSeelllleerrAAggeennttpackage agents;import java.util.HashMap; import java.util.Map; import jade.core.Agent;import jade.core.behaviours.CyclicBehaviour; import jade.lang.acl.ACLMessage;import jade.lang.acl.MessageTemplate;public class BookSellerAgent extends Agent {private MapString, Double data=new HashMap();@Overrideprotected void setup() {data.put(XML, new Double(230)); data.put(JAVA, new Double(460));ddaattaa..ppuutt((IIOOTT,, nneeww DDoouubbllee((554400))));;System.out.println(....... Vendeur +this.getAID().getName());addBehaviour(new CyclicBehaviour() {@Overridepublic void action() {try {MessageTemplate messageTemplate= MessageTemplate.or(MessageTemplate.MatchPerformative(ACLMessage.CFP),MessageTemplate.MatchPerformative(ACLMessage.ACCEPT_PROPOSAL));ACLMessage aclMessage=receive(messageTemplate);
  • 83. BBooookkSSeelllleerrAAggeennttif(aclMessage!=null){switch(aclMessage.getPerformative()){case ACLMessage.CFP :System.out.println(--------------------------------);System.out.println(Conversation ID:+aclMessage.getConversationId());String livre=aclMessage.getContent();String compteur=aclMessage.getUserDefinedParameter(compteur);System.out.println(Réception d'un message :+compteur);System.out.println(Expéditeur :+aclMessage.getSender().getName());SSyysstteemm..oouutt..pprriinnttllnn((CCoonntteennuu::++lliivvrree));;System.out.println(--------------------------------);Double prix=data.get(livre);ACLMessage reply=aclMessage.createReply();reply.setPerformative(ACLMessage.PROPOSE);reply.setContent(prix.toString());System.out.println(...... En cours);Thread.sleep(5000);send(reply);break;
  • 84. BBooookkSSeelllleerrAAggeennttcase ACLMessage.ACCEPT_PROPOSAL:System.out.println(--------------------------------);System.out.println(Conversation ID:+aclMessage.getConversationId());System.out.println(Validation de la transaction .....);ACLMessage reply2=aclMessage.createReply();reply2.setPerformative(ACLMessage.CONFIRM);System.out.println(...... En cours);Thread.sleep(5000);send(reply2);bbrreeaakk;;} }else{System.out.println(Block);block();}} catch (Exception e) {e.printStackTrace(); }}});}@Overrideprotected void takeDown() {}}
  • 85. MMaaiinnCCoonnttaaiinneerrimport jade.core.Profile; import jade.core.ProfileImpl;import jade.core.Runtime; import jade.util.ExtendedProperties;import jade.util.leap.Properties; import jade.wrapper.AgentContainer;public class MainContainner {public static void main(String[] args) {try{Runtime runtime=Runtime.instance();Properties properties=new ExtendedProperties();properties.setProperty(Profile.GUI,true);PPrrooffiilleeIImmppll pprrooffiilleeIImmppll==nneeww PPrrooffiilleeIImmppll((pprrooppeerrttiieess));;AgentContainer mainContainer=runtime.createMainContainer(profileImpl);mainContainer.start();}catch(Exception e){e.printStackTrace();}}}
  • 86. BBooookkBBuuyyeerrCCoonnttaaiinneerrimport jade.core.ProfileImpl;import jade.core.Runtime;import jade.wrapper.AgentContainer;import jade.wrapper.AgentController;public class BookBuyerContainer {public static void main(String[] args) {try {Runtime runtime=Runtime.instance();ProfileImpl profileImpl=new ProfileImpl(false);profileImpl.setParameter(ProfileImpl.MAIN_HOST,localhost);AAggeennttCCoonnttaaiinneerr aaggeennttCCoonnttaaiinneerr==rruunnttiimmee..ccrreeaatteeAAggeennttCCoonnttaaiinneerr((pprrooffiilleeIImmppll));;AgentController agentController=agentContainer.createNewAgent(acheteur1,agents.BookBuyerAgent, new Object[]{});agentController.start();} catch (Exception e) {e.printStackTrace();}}}
  • 87. BBooookkSSeelllleerrCCoonnttaaiinneerrimport jade.core.ProfileImpl;import jade.core.Runtime;import jade.wrapper.AgentContainer;import jade.wrapper.AgentController;public class BookSellerContainer {public static void main(String[] args) {try {Runtime runtime=Runtime.instance();ProfileImpl profileImpl=new ProfileImpl(false);pprrooffiilleeIImmppll..sseettPPaarraammeetteerr((PPrrooffiilleeIImmppll..MMAAIINN__HHOOSSTT,,llooccaallhhoosstt));;AgentContainer agentContainer=runtime.createAgentContainer(profileImpl);AgentControlleragentController=agentContainer.createNewAgent(Vendeur1,agents.BookSellerAgent, new Object[]{});agentController.start();} catch (Exception e) {e.printStackTrace();}}}
  • 88. DDééppllooiieemmeenntt
  • 89. Image ddee llaa ccoonnvveerrssaattiioonn
  • 90. AApppplliiccaattiioonn 22 Créer un SMA composés des agents suivants :◦ Des agents de type BookSellerAgent qui ont pour objectif de vendredes livres aux agents qui souhaitent achéter.◦ Un agent de type BookBuyerAgent qui a pour objectif d’acheter unlivre avec le meilleur prix du marché. Le SMA fonctionne de la manière suivante : BookSeller :◦ ÀÀ ssaa ccrrééaattiioonn uunn aaggeenntt BBooookkSSeelllleerr ddooiitt ppuubblliieerr uunn sseerrvviiccee ddaannss lleesspages jaunes. Ce service concerne la vente des livres.◦ Chaque agent BookSeller possèle une collection de type HashMapdont la clé reprsente le titre du livre et dont la valeur représente leprix du livre. Les prix seront choisi aléatoirement
  • 91. aapppplliiccaattiioonn BookBuyer :◦ À la demande d’un agent consommateur, l’agent de typeBookBuyer commence par récupérer le titre du livre àacheter, passé comment argument au moment dudéploiement◦ Ensuite, chaque minute, iill tteennttee ddee cchheerrcchheerr ddaannss llee sseerrvviiccee ddeess ppaaggeess jjaauunneess DDFF,, lleessagents qui offrent le service de vente de livres.◦ Ensuite, il envoie un message de type CFP (Create ForProposal ) à tous ces agents sellers, pour leurs demanderde lui fournir la proposition du prix du livre souhaité.◦ Si les propositions arrivent, il doit déterminer l’agent quioffre le meilleur prix.◦ Ensuite il envoi un message à cet agent pour finaliser lavente.
  • 92. Diagramme dd’’iinntteerraaccttiioonnss
  • 93. 3 demandes simultanée dd’’aacchhaatt ddee lliivvrreess
  • 94. Diagramme ddee ccllaasssseess :: AAcchheetteeuurr
  • 95. Diagramme ddee ccllaasssseess :: VVeennddeeuurr
  • 96. BBooookkSSeelllleerrAAggeennttpackage agents; import java.util.HashMap;import java.util.Map;import jade.core.*;import jade.core.behaviours.*; import jade.domain.*;import jade.domain.FIPAAgentManagement.*;import jade.lang.acl.*;public class BookSellerAgent extends Agent {private MapString, Double data=new HashMap();private ParallelBehaviour parallelBehaviour;@@OOvveerrrriiddeeprotected void setup() {data.put(XML, new Double(230+Math.random()*200));data.put(JAVA, new Double(460+Math.random()*200));data.put(IOT, new Double(540+Math.random()*200));System.out.println(....... Vendeur +this.getAID().getName());System.out.println(--------------);
  • 97. BBooookkSSeelllleerrAAggeennttSystem.out.println(Publication du service dans Directory Facilitator...);DFAgentDescription agentDescription=new DFAgentDescription();agentDescription.setName(this.getAID());ServiceDescription serviceDescription=new ServiceDescription();serviceDescription.setType(book-selling);serviceDescription.setName(book-trading);agentDescription.addServices(serviceDescription);try {DFService.register(this, agentDescription);} catch (FIPAException e1) {e1.printStackTrace();}
  • 98. BBooookkSSeelllleerrAAggeennttparallelBehaviour=new ParallelBehaviour();addBehaviour(parallelBehaviour);parallelBehaviour.addSubBehaviour(new CyclicBehaviour() {@Overridepublic void action() {try {MessageTemplate messageTemplate=MessageTemplate.MatchPerformative(ACLMessage.CFP);AACCLLMMeessssaaggee aaccllMMeessssaaggee==rreecceeiivvee((mmeessssaaggeeTTeemmppllaattee));;if(aclMessage!=null){System.out.println(Conversation ID:+aclMessage.getConversationId());String livre=aclMessage.getContent();Double prix=data.get(livre);ACLMessage reply=aclMessage.createReply();reply.setPerformative(ACLMessage.PROPOSE);reply.setContent(prix.toString());System.out.println(...... En cours);Thread.sleep(5000);send(reply);
  • 99. BBooookkSSeelllleerrAAggeennttparallelBehaviour.addSubBehaviour(newSellerBehaviour(myAgent,aclMessage.getConversationId()));} else{ block(); }} catch (Exception e) { e.printStackTrace(); }}}); }@Overridepprrootteecctteedd vvooiidd ttaakkeeDDoowwnn(()) {{try {DFService.deregister(this);} catch (FIPAException e) {e.printStackTrace();}}}
  • 100. SSeelllleerrBBeehhaavviioouurrpackage agents;import jade.core.Agent;import jade.core.behaviours.CyclicBehaviour;import jade.lang.acl.ACLMessage;import jade.lang.acl.MessageTemplate;public class SellerBehaviour extends CyclicBehaviour {private String conversationID;public SellerBehaviour(Agent agent,String conversationID) {super(agent);this.conversationID=conversationID;}@Overridepublic void action() {try {MessageTemplate messageTemplate= MessageTemplate.and(MessageTemplate.MatchConversationId(conversationID),MessageTemplate.MatchPerformative(ACLMessage.ACCEPT_PROPOSAL));ACLMessage aclMessage=myAgent.receive(messageTemplate);
  • 101. SSeelllleerrBBeehhaavviioouurrif(aclMessage!=null){System.out.println(--------------------------------);System.out.println(Conversation ID:+aclMessage.getConversationId());System.out.println(Validation de la transaction .....);ACLMessage reply2=aclMessage.createReply();reply2.setPerformative(ACLMessage.CONFIRM);System.out.println(...... En cours);TThhrreeaadd..sslleeeepp((55000000));;myAgent.send(reply2);}else{block();}} catch (Exception e) {e.printStackTrace();}}}
  • 102. BBooookkBBuuyyeerrAAggeennttpackage agents; import jade.core.AID; import jade.core.Agent;import jade.core.behaviours.CyclicBehaviour; importjade.core.behaviours.ParallelBehaviour;import jade.lang.acl.ACLMessage; import jade.lang.acl.MessageTemplate;public class BookBuyerAgent extends Agent {ParallelBehaviour parallelBehaviour;int requesterCount;@Overrideprotected void setup() {System.out.println(Salut je suis l'agent Acheteur mon nomest:+this.getAID().getName());parallelBehaviour=new ParallelBehaviour();addBehaviour(parallelBehaviour);
  • 103. BBooookkBBuuyyeerrAAggeennttparallelBehaviour.addSubBehaviour(new CyclicBehaviour() {@Overridepublic void action() {MessageTemplatetemplate=MessageTemplate.MatchPerformative(ACLMessage.REQUEST);ACLMessage aclMessage=receive(template);if(aclMessage!=null){String livre=aclMessage.getContent();AID requester=aclMessage.getSender();++requesterCount;String conversationID=transaction_+livre+_+requesterCount;parallelBehaviour.addSubBehaviour(new RequestBehaviour(myAgent,livre,requester,conversationID));}else block();}});}
  • 104. BBooookkBBuuyyeerrAAggeenntt@Overrideprotected void beforeMove() {System.out.println(Avant de migrer vers une nouvelle location.....);}@Overrideprotected void afterMove() {SSyysstteemm..oouutt..pprriinnttllnn((JJee vviieennss dd''aarrrriivveerr àà uunnee nnoouuvveellllee llooccaattiioonn.....);}@Overrideprotected void takeDown() {System.out.println(avant de mourir .....);}}
  • 105. RReeqquueessttBBeehhaavviioouurrpackage agents; import jade.core.AID; import jade.core.Agent;import jade.core.behaviours.CyclicBehaviour; import jade.domain.DFService;import jade.domain.FIPAException; import jade.domain.FIPAAgentManagement.DFAgentDescription;import jade.domain.FIPAAgentManagement.ServiceDescription; import jade.lang.acl.ACLMessage;import jade.lang.acl.MessageTemplate; import java.util.ArrayList; import java.util.List;class RequestBehaviour extends CyclicBehaviour{private String conversationID;private AID requester; private String livre;pprriivvaattee ddoouubbllee pprriixx;; pprriivvaattee iinntt ccoommpptteeuurr;;private ListAID vendeurs=new ArrayList();private AID meilleureOffre;private double meilleurPrix;private int index;
  • 106. RReeqquueessttBBeehhaavviioouurrpublic RequestBehaviour(Agent agent,String livre,AID requester,StringconversationID) {super(agent);this.livre=livre; this.requester=requester;this.conversationID=conversationID;System.out.println(Recherche des services...);vendeurs=chercherServices(myAgent, book-selling);System.out.println(Liste des vendeurs trouvés :);try {for(AID aid:vendeurs){System.out.println(====+aid.getName());}++compteur;System.out.println(#########################################);System.out.println(Requête d'achat de livre:);System.out.println(From :+requester.getName());System.out.println(Livre : +livre);System.out.println(............................);
  • 107. RReeqquueessttBBeehhaavviioouurrSystem.out.println(Envoi de la requête....);ACLMessage msg=new ACLMessage(ACLMessage.CFP);msg.setContent(livre);msg.setConversationId(conversationID);msg.addUserDefinedParameter(compteur, String.valueOf(compteur));for(AID aid:vendeurs){msg.addReceiver(aid);}System.out.println(....... En cours);Thread.sleep(5000);index=0;myAgent.send(msg);} catch (Exception e) {e.printStackTrace();}}
  • 108. RReeqquueessttBBeehhaavviioouurr@Overridepublic void action() {try {MessageTemplate template=MessageTemplate.and(MessageTemplate.MatchConversationId(conversationID),MessageTemplate.or(MessageTemplate.MatchPerformative(ACLMessage.PROPOSE),MessageTemplate.MatchPerformative(ACLMessage.CONFIRM)));AACCLLMMeessssaaggee aaccllMMeessssaaggee==mmyyAAggeenntt..rreecceeiivvee((tteemmppllaattee));;if(aclMessage!=null){switch(aclMessage.getPerformative()){case ACLMessage.PROPOSE :prix=Double.parseDouble(aclMessage.getContent());System.out.println(***********************************);System.out.println(Conversation ID:+aclMessage.getConversationId());System.out.println(Réception de l'offre :);System.out.println(From :+aclMessage.getSender().getName());System.out.println(Prix=+prix);
  • 109. RReeqquueessttBBeehhaavviioouurrif(index==0){meilleurPrix=prix; meilleureOffre=aclMessage.getSender();}else{if(prixmeilleurPrix){meilleurPrix=prix;meilleureOffre=aclMessage.getSender();} }++++iinnddeexx;;if(index==vendeurs.size()){index=0; System.out.println(-----------------------------------);System.out.println(Conclusion de la transaction.......);ACLMessage aclMessage2=new ACLMessage(ACLMessage.ACCEPT_PROPOSAL);aclMessage2.addReceiver(meilleureOffre);aclMessage2.setConversationId(conversationID);System.out.println(...... En cours); Thread.sleep(5000);myAgent.send(aclMessage2);}break;
  • 110. RReeqquueessttBBeehhaavviioouurrcase ACLMessage.CONFIRM:System.out.println(.........................);System.out.println(Reçu de la confirmation ...);System.out.println(Conversation ID:+aclMessage.getConversationId());ACLMessage msg3=new ACLMessage(ACLMessage.INFORM);msg3.addReceiver(requester);msg3.setConversationId(conversationID);msg3.setContent(transaction++ lliivvrree++lliivvrree++//lliivvrree+ prix+meilleurPrix+/prix+ fournisseur+aclMessage.getSender().getName()+/fournisseur+ /transaction);myAgent.send(msg3);break;} }else{ block(); }} catch (Exception e) { e.printStackTrace(); }}
  • 111. RReeqquueessttBBeehhaavviioouurrpublic ListAID chercherServices(Agent agent,String type){ListAID vendeurs=new ArrayList();DFAgentDescription agentDescription=new DFAgentDescription();ServiceDescription serviceDescription=new ServiceDescription();serviceDescription.setType(type);agentDescription.addServices(serviceDescription);try {DFAgentDescription[] descriptions=DFService.search(agent, agentDescription);ffoorr((DDFFAAggeennttDDeessccrriippttiioonn ddffaadd::ddeessccrriippttiioonnss)){{vendeurs.add(dfad.getName());}} catch (FIPAException e) {e.printStackTrace();}return vendeurs;}}
  • 112. BBooookkSSeelllleerrCCoonnttaaiinneerrimport java.util.Scanner;import jade.core.ProfileImpl;import jade.core.Runtime;import jade.wrapper.AgentContainer; import jade.wrapper.AgentController;public class BookSellerContainer {public static void main(String[] args) {try {Scanner clavier=new Scanner(System.in);System.out.print(Nom du vendeur:);String name=clavier.next();Runtime runtime=Runtime.instance();ProfileImpl profileImpl=new ProfileImpl(false);profileImpl.setParameter(ProfileImpl.MAIN_HOST,localhost);AgentContainer agentContainer=runtime.createAgentContainer(profileImpl);AgentController agentController=agentContainer.createNewAgent(name,agents.BookSellerAgent, new Object[]{});agentController.start();} catch (Exception e) { e.printStackTrace(); }}}
    Please download to view
  • All materials on our website are shared by users. If you have any questions about copyright issues, please report us to resolve them. We are always happy to assist you.
    ...

    Systèmes multi agents concepts et mise en oeuvre avec le middleware jade

    by mohamed-youssfi

    on

    Report

    Category:

    Software

    Download: 2

    Comment: 0

    3,726

    views

    Comments

    Description

    Systèmes Multi agents : Concepts et Mise en oeuvre avec JADE
    Download Systèmes multi agents concepts et mise en oeuvre avec le middleware jade

    Transcript

    • 1. EnvironnementAgentMIND+BODYSSMMAAInteraction OrganisationPar : Youssfi MohamedLaboratoire : Signaux Systèmes Distribués et Intelligence Artificielle (SSDIA)ENSET Mohammedia, Université Hassan II Casablanca,Email : med@youssfi.net
  • 2. PPllaann Concepts fondamentaux des SMA◦ Influence historique :◦ Agent et Systèmes multi agents◦ Interactions des les SMA◦ Architectures parallèles et SMA◦ Applications des SMA◦ Plateformes SMA Mise en oeuvre des SMA avec JADE◦ AArrcchhiitteeccttuurree ddee JJAADDEE ((AAMMSS,, AACCCC eett DDFF ))◦ Configuration et démarrage d’un conteneur de JADE◦ Premier Agent◦ Cycle de vie des agents◦ Comportements des agents Jade◦ Communication entre les agents avec ACL◦ Mobilité des agents◦ Publication et Recherche des services dans agents◦ Application : SMA pour l’automatisation des transactions de vente etd’achats de livres.
  • 3. IINNFFLLUUEENNCCEEHHHHIIIISSSSTTTTOOOORRRRIIIIQQQQUUUUEEEE
  • 4. Historique sur les méthodes ddee pprrooggrraammmmaattiioonnLangage MachineChaque famille de CPU possède sonporophore jeu d’instructionsAssembleur Langage bas niveauProgrammation ProcéduraleProgrammation OrientéeObjetSous programmes: Procédures, fonctions(Basic, Pascal, C, Fortran,..)Objet = Etat+ Comportement + IdentitéConcepts fondamentaux : Objet, classe, Héritage,polymorphisme, encapsulation (C++, JAVA, C#, ..)Programmation OrientéeObjets distribués sur plusieurs machinesObjet DistribuésMiddlewares : (RMI, CORBA, JMS, …)Programmation OrientéecomposantsObjets distribués, réutilisables, configurables,Interchangeables, évolutifs, mobiles, surveillable àchaud : Conteneur (EJB)Programmation OrientéeServicesProgrammation OrientéeAgentsComposant disponibles à d’autres applicationsdistantes hétérogènes via des protocoles (http)transportant des données: XML, JSON = SOAPet REST? Service + Intelligence + Apprentissage+ …
  • 5. Intelligence Artificielle DDiissttrriibbuuééee L'intelligence artificielle est la « recherche de moyenssusceptibles de doter les systèmes informatiques de capacitésintellectuelles comparables à celles des êtres humains » L’IA s’appuie sur les sciences de l’homme :◦ Psychologie linguistique, Sociologie, Neuro Biologie, Biosphère Intelligence Artificielle Distribuée =◦ IA : Modéliser le savoir des agents (compétence)◦ + Distribution : Modéliser leurs interactions (organisation sociale)Métaphore de l’IAPenseur IsoléMétaphore de l’IADCommunauté de penseurs 1985 :◦ = IAD◦ = Systèmes Multi Agents
  • 6. AAGGEENNTTEEEETTTTSSYYSSTTÈÈMMEESS MMUULLTTII AAGGEENNTTSS
  • 7. SSyyssttèèmmeess mmuullttii-aaggeennttss Un Agent est une entité◦ Qui agit d’une façon autonome◦ pour atteindre les objectifs pour lesquels il a été conçu.◦ Peut communiquer avec d’autres agents◦ Doté de capacités semblables aux être vivants Un agent peut être un processus, un robot, un êtrehumain, etc…Un système multi-agent (SMA) est un système distribué :◦ Composé d'un ensemble d'agents distribués,◦ Situés dans un certain environnement◦ et Interagissant selon certaines organisations. Un SMA permet de résoudre des problèmescomplexes en exploitant l’intelligence collectivedes agents qui le compose
  • 8. Caractéristiques dd’’uunn AAggeenntt Dans un SMA, on s'intéresse aux phénomènes : Apprentissage Raisonnement Perception Migration MMéémmoorriissaattiioonn Interaction Intention Commandes et coordination motrice Emotion Conscience Ethique
  • 9. Concepts fondamentaux ddeess aaggeennttss AGENT = BODY + MIND BODY : Dimension physicaliste«Un agent est une entité autonome située dans unenvironnement ouvert » Situation Persistance MMoobbiilliittéé + MIND : Dimension épistémique«Un agent est une entité en interaction avecd’autres agents dans un champ social» Population Interaction Intention Apprentissage Raisonnement
  • 10. Les trois dimensions dd’’uunn aaggeenntt Un agent vit dans un environnement en interagit, dans unchamp social, avec d’autres agents selon une organisationEnvironnementA3R1Espace de vieRessourcesCapteursAgentA1 A2R2communication CentraliséeInteraction OrganisationcoordinationDécentraliséeHirérchiqueACL, KIFACL : Agent Communication LanguageKIF : Knowlage Interchange Format
  • 11. OObbjjeett vveerrssuuss AAggeenntt Un objet est réactif Un objet est une entité passive (ouréactive). Si personne ne demande la valeur d’unattribut ou n’active une méthode del’objet, alors il ne se passe rien.:Objet- x=6- y=12f(x,y)=x2 + y2Calcul(n) =x logn yGet/SetCallAttributsMéthodes Un agent est Proactif Un agent possède, en plus des attributset méthodes, des processus internes quifonctionnent même en l’absence desollicitations externes. Un agent peut donc agir même sipersonne ne lui demande rien.:Agent- x=6- y=12f(x,y)=x2 + y2Calcul(n) =x logn yAttributsMéthodesProcessus1()Processus 2()ProcessusinternesACL
  • 12. OObbjjeett vveerrssuuss AAggeenntt Un agent est persistant : Si un agent est proactif c’est d’abord parce qu’il est munid’au moins un but qu’il cherche à satisfaire de manièrepersistante tant que : Il pense que c’est encore possible (pré condition logique) Il possède les ressources pour le faire (pré condition physique) UUnn aaggeenntt eesstt aaddaappttaattiiff :: Face à un environnement perpétuellement changeant, unagent doit constamment modifier le plan qu’il poursuitpour atteindre un but. Pour cela : Il doit, de manière continue, percevoir et évaluer la situation(contexte) de son action, Construire des représentations en cours même defonctionnement (c’est‐à‐dire être capable d’apprentissage). Élaborer des plans dynamiques qui lancent des processus internesou au contraire les stoppent.
  • 13. Agents réactifs eett ccooggnniittiiffss Agents Réactifs◦ Les agents réactifs sont issus de la modélisationphysicaliste du monde : ils sont assimilés à desfonctions de transition :◦ Pas d’anticipation.◦ Pas d’apprentissageTFonction detransitionStSituationT(St)=St+1
  • 14. Agents réactifs eett ccooggnniittiiffss Agents Cognitifs◦ Les agents cognitifs sont issus de la modélisation mentalistedu monde : ils sont assimilés à des systèmes experts .Représentation :- Du monde--De soit (buts)Actions sur lemondeRaisonnement surles représentationsRetours d’effortssur les actions
  • 15. Exemple d’agent rrééaaccttiiff eett ccooggnniittiiff Problème :« Rob le robot doit sortir de la pièce ». DP = Devant la PortePosition DC = Devant la Clé PO: Porte ouverte : PF: Porte Fermée PFC :PFPorte Fermée à cléRob cognitif: L’agent possède un plan P pour sortir qu’ilexécute de manière séquentielle et déterministeRob réactif : La fonction de transition T est un ensemble nonordonné de règles de type Si condition alors action qui sont exécutées dans une boucle infinieet non déterministe :Si DP and PO Alors SORTIRSi DP and PF Alors OUVRIRSi DP and PFC and C Alors DEVEROUILLERSi DP and PFC Alors RANDOM-WALKSi DC and C Alors RANDOM-WALKSi DC and C Alors PRENDRE-CLEquelle que soit sa position de départ et quel quesoit l’état initial du monde :ALLER-A DPSi PO Alors SORTIRSinon Si PF Alors OUVRIR;SORTIRSinon Si PFCAlors Si C Alors DEVEROUILLER;OUVRIR;SORTIRSinon ALLER-A DCPRENDRE CLEALLERA DPDEVEROUILLER;OUVRIR;SORTIR
  • 16. IINNTTEERRAACCTTIIOONNSS EENNTTRREEAAAAGGGGEEEENNNNTTTTSSSS
  • 17. PPooppuullaattiioonn dd’’aaggeennttss Variables globales et locales◦ Dans un SMA rien n’est complètement global L’environnement étant vaste et ouvert, il n’est pas possible en unlieu donné (par exemple, dans un agent) de stocker toute lareprésentation du monde. Par contre, un agent peut se déplacer ou encore interagir avecdd’’aauuttrreess aaggeennttss qquuii ssoonntt ddaannss ssoonn vvooiissiinnaaggee ppoouurr eexxpplloorreerrl’environnement.◦ Dans un SMA rien n’est complètement local Pour un agent donné, toutes ses entités (informations, processus,buts, …) sont locales mais elles restent accessibles àl’introspection par d’autres agents. Le moyen d’accéder à cette information passe par lesinteractions entre les agents.
  • 18. Modèles dd’’iinntteerraaccttiioonn 1. Interaction Agent ↔Agent◦ Niveau communication Transactions : Agent CommunicationLanguages (ACL)◦ Niveau connaissance (KnowledgeLevel) Echange de connaissances : KIF, XML Données sémantiques : RDF, OWL 2. Interaction Humain ↔AgentAgent HumainOne to OneOne to OneDialogue Homme-MachineACLManyTo Many ManyTo Many◦ Interactions langagières :Reconnaissance vocale 3. Interaction Multi‐agents◦ Résolution distribuée de problèmes(IAD) : coopération, conflits,négociation, … 4. Interaction Multi‐humains◦ Modalité langagière : chat, mail, forums,visio-conférence, …Coopération/Compétition Collectifs médiatisésACL : Agent Communication LanguageKIF : Knowlage Interchange FormatXML : eXtensible Markup LanguageOWL : OntologyWeb LanguageRDF Reource Description Framework
  • 19. Typologie ddeess iinntteerraaccttiioonnss ::IInntteerraaccttiioonn DDiirreeccttee Action directe (interdite) Un agent ne peut pas agir directement sur l’étatet le comportement d’un autre Agent. L’interaction des agents doit passer par l’envoi demessage ACL:Agent Y- x=6- y=12f(x,y)=x2 + y2Calcul(n) =x logn yProcessus1()Processus 2():Agent Y- a=6- b=12g(x,y)=a*x2 +b* y2Calcul(n) =a logn bProcessus1()Processus 2()Get/SetCall
  • 20. Typologie ddeess iinntteerraaccttiioonnss :: IInntteerraaccttiioonn DDiirreeccttee Requête (formelle ou langagière) L’agent envoie une requête à un interlocuteur quiest un autre agent ou à un humain de sonenvironnement L’interlocuteur interprète cette requête et lasatisfait ou non en fonction de sa propressuubbjjeeccttiivviittéé ((ééttaatt pphhyyssiiqquuee eett mmeennttaall))RequêteGould youchange yourlocation?Location?(x2*log(y3)=?)No i won’t,i ‘m fine hereAgent XAgent YNe touche pas mes affaires. Si tu veux quelqueschose, tu n’as qu’à me le demander.
  • 21. Typologie ddeess iinntteerraaccttiioonnss :: IInntteerraaccttiioonn IInnddiirreeccttee Blackboard (base de connaissances) Plusieurs agents déposent et recueillent desobjets ou des informations dans une partie del’environnement prévue à cet effet. Cette partie commune est appelée «BBllaacckkbbooaarrdd »BlackboardP[x] Q[y] R[x] R[u]
  • 22. Typologie ddeess iinntteerraaccttiioonnss :: IInntteerraaccttiioonn IInnDDiirreeccttee Partage de ressources (Stigmergie) Les modèles de population animales par exemple sont fondés surune compétition pour une quantité de ressources à partager quiest fixée : la ressource sert alors de médiateur entre lesagents. Les fourmis par exemple communiquent en déposant desphéromones derrière elles, pour que d'autres fourmis puissentssuuiivvrree llaa ppiissttee jjuussqquu''àà llaa nnoouurrrriittuurree oouu llaa ccoolloonniiee ssuuiivvaanntt lleess bbeessooiinnss,,ce qui constitue un système stigmergiqueAgent XZone de conflitDe ressourcesAgent Y
  • 23. Manifestation ddee ll’’IInntteennttiioonn L’Intention dans la Communication Les agents interagissent au moyen de Langages de Communication Agent(ACL) qui reflètent certaines des propriétés de la langue humaine : La notion de Speech Act : permet à un agent A de communiquer à un agentB non seulement une proposition P mais aussi l’Intention que A prend au sujetde P et de B :Soit P = « Il pleut »INFORM (A,B) [ BELA(P) ] = «Je crois sincèrement, et je t’informeqquu’’iill pplleeuutt» Conséquences :1. B sait que A croît sincèrement P (formellement INFORM imposela sincérité)2. B sait que A a voulu informer B au sujet de P (coopération ?menace ? …3. B choisit ou non d’adopter la croyance de P (il croît à son tour P)ou non4. B réagit à l’impact que 1‐3 peut avoir sur ses propres stratégies. L’intention est importante pour le raisonnement sur les tracesd’interactions
  • 24. Architectures ppaarraallllèèlleess eett SSMMAAArchitectures centraliséesSIMD ou SPMDArchitectures décentraliséesMIMD ou MPMD Les agents ont tous la même structure : étatet comportement. Emergence ou d'Intelligence Collective. Les agents ont des structures différentes Sociétés d'Experts
  • 25. AApppplliiccaattiioonnss ddeess SSMMAA Simulation de phénomènes complexes,◦ Sociologie, physique des particules,◦ Chimie, Robotique,◦ Biologie cellulaire, Ethologie, Ethnologie, … IAD pour la résolution de problèmes complexes Systèmes parallèles et distribués Robotique, Productique TTééllééccoommss Jeux vidéos, Cinéma (Animations 3D) E-commerce, E-learning Urbanisation Smart Grid Gestion du trafic routier Finance : Trading automatique Web Sémantique Internet des objets (Web 3.0) …
  • 26. Simulation ddee pphhéénnoommèènneessccoommpplleexxeess,, En sociologie, paramétrer les différents agents composant unecommunauté. En ajoutant des contraintes, on peut essayer decomprendre quelle sera la composante la plus efficace pourparvenir à un résultat attendu (construction d'un pont). Ilspermettent même d'expérimenter des scénarios qui neseraient pas réalisables sur des populations réelles, que ce soitpour des raisons techniques ou éthiques. DDeess aapppplliiccaattiioonnss eexxiisstteenntt eenn pphhyyssiiqquuee ddeess ppaarrttiiccuulleess ((aaggeenntt= particule élémentaire), en chimie (agent = molécule), en robotique (agent = robot, dans le cas d'une implémentationsur robot réel, on parlera de système multi-robots), en biologie cellulaire(agent = cellule), en éthologie (agent = animal), en sociologie et en ethnologie (agent = être humain).
  • 27. PPllaatteeffoorrmmeess SSMMAA AnyLogic : Logiciel de simulation multi-agents et multi-méthode CORMAS : (COmmon Resources Multi-Agent System)est un framework de développement de systèmes multi-agents,open-source et basé sur le langage depprrooggrraammmmaattiioonn oorriieennttééee oobbjjeett SSmmaallllTTaallkk. IIll eesstt cceennttrréésur des problématiques de recherche en sciences dudéveloppement et de négociation entre acteurs. DoMIS : est un outil permettant la conception deSystèmes Multi-agents (orientés pilotage opérationnel desystèmes complexes) . Utilisé Pour l’analyse décisionnelledes systèmes complexes.
  • 28. PPllaatteeffoorrmmeess SSMMAA JACK : est un langage de programmation et unenvironnement de développement pour agentscognitifs, développé par la société AgentOriented Software comme une extensionorientée agent du langage Java. JJAADDEE :: ((JJaavvaa AAggeenntt DDEEvveellooppmmeenntt)) eesstt uunnframework de développement de systèmesmulti-agents, open-source et basé sur le langageJava. Il offre en particulier un support avancé dela norme FIPA-ACL, ainsi que des outils devalidation syntaxique des messages entre agentsbasé sur les ontologies.
  • 29. PPllaatteeffoorrmmeess SSMMAA Jadex : est une plate-forme agent développée enJAVA par l'université de Hambourg qui se veutmodulaire, compatible avec de nombreuxstandards et capable de développer des agents. JJaaggeenntt :: eesstt uunn ffrraammeewwoorrkk ooppeenn ssoouurrccee rrééaalliissééen Java dont l'objectif est de faciliter ledéveloppement et le test de systèmes multi-agents.
  • 30. PPllaatteeffoorrmmeess SSMMAA Janus : est une plateforme multi-agents modulaire écriteen Java. Elle permet de créer des systèmes multi-agentsavec ou sans une approche organisationnelle basée surle modèle Capacité-Rôle-Interaction-Organisation(CRIO). JJaassoonn :: eesstt uunn eennvviirroonnnneemmeenntt ooppeenn ssoouurrccee ddeedéveloppement d'agents dans le formalisme AgentSpeak,et développé en Java
  • 31. PPllaatteeffoorrmmeess SSMMAA MadKit : est une plate-forme multi-agents modulaireécrite en Java et construite autour du modèleorganisationnel Agent/Groupe/Rôle. C'est une plate-formelibre basée sur la licence GPL/LGPL développéeau sein du LIRMM. MAGIQUE : est une plate-forme pour agentspphhyyssiiqquueemmeenntt ddiissttrriibbuuééss ééccrriittee eenn JJaavvaa eett ffoouurrnniissssaanntt uunnmodèle de communication original d'appel à lacantonade. Dans MAGIQUE, les compétences sontdissociées des agents. L'architecture des agents et lesdifférentes compétences sont développées séparément.Les compétences sont ensuite greffées comme plugindans les agents au gré du concepteur. Cette plate-formeest développée au sein du LIFL.
  • 32. PPllaatteeffoorrmmeess SSMMAA OMAS : Open Multi-Agent Asynchronous Systems est une plate-formede recherche développée par l'équipe d'intelligenceartificielle de l'Université de technologie de Compiègne, sous ladirection de Jean-Paul Barthès. SemanticAgent : est basé sur JADE et permet le développementd'agents dont le comportement est représenté en SWRL.SSeemmaannttiiccAAggeenntt eesstt ddéévveellooppppéé aauu sseeiinn dduu LLIIRRIISS,, iill eesstt ooppeenn--ssoouurrccee eettsous licence GPL V3. SPADE: est un environnement de développement d'organisationsmulti-agents basé sur le protocole XMPP et est écrit en Python. MASSIVE : est un logiciel pour la simulation de foule, basé multi-agents,qui a permis la création d'effets spéciaux dans un grandnombre de films, ayant été développé à l'origine pour les scènes decombat dans Le Seigneur des anneaux.
  • 33. PPllaatteeffoorrmmeess SSMMAA Golaem Crowd est un plug-in pour Maya (logiciel) basé multi-agentet permettant d'effectuer des simulations de foule pour les effetsspéciaux directement dans Maya.
  • 34. MMIISSEE EENN OEOEUUVVRREE DDEESSSSSSMMMMAAAA AAAAVVVVEEEECCCC JJJJAAAADDDDEEEE
  • 35. JJAADDEE?? JJaavvaa AAggeenntt DDEEvveellooppeemmeenntt JADE est une plate-forme multi-agent créé par le laboratoire TILAB. C’est un framework qui permet le développement de systèmes multi-agentset d'applications conformes aux normes FIPA (Foundation forIntelligent Physical Agents). La FIPA est une organisation en 1996 dont l'objectif est de produiredes standards pour l'interopération d'agents logiciels hétérogènes. JADE possède trois modules principaux (nécessaire aux normes FIPA).◦ DF « Directory Facilitator » fournit un service de « pages jaunes» à laplate-forme ;◦ ACC «Agent Communication Channel » gère la communication entre lesagents ;◦ AMS « Agent Management System » supervise l'enregistrement des agents,leur authentification, leur accès et l'utilisation du système. Ces trois modules sont activés à chaque démarrage de la plate-forme.
  • 36. Plateforme SSMMAA :: JJAADDEE JADE est un middleware qui facilite le développementdes systèmes multi agents (SMA). JADE contient :◦ Un Runtime Environment : l'environnement ou les agents peuventvivre.◦ Une librairie de classes : que les développeurs utilisent pour écrireleurs agents◦ Une suite d'outils graphiques : qui facilitent la gestion et lassuuppeerrvviissiioonn ddee llaa ppllaatteeffoorrmmee ddeess aaggeennttss Chaque instance du JADE est appelée conteneur« Container », et peut contenir plusieurs agents. Un ensemble de conteneurs constituent uneplateforme. Chaque plateforme doit contenir un conteneurspécial appelé main-container et tous les autresconteneurs s'enregistrent auprès de celui-là dés leurlancement
  • 37. Architecture LLooggiicciieellllee ddee JJAADDEEJADE PlatformJADE Main ContainerDFAMSMessage Transport SystemM1Corba IIOP Server ACCM2 M3Jade ContainerMessage Transport SystemJade ContainerMessage Transport System
  • 38. CCoonnffiigguurraattiioonn Pour manipuler JADE sur ligne de commande, vous aurez besoind’ajouter la variable d’environnement classpath je fchier jade.jar
  • 39. Lancer la plateforme jjaaddee ssuurr lliiggnneeddee ccoommmmaannddee pour lancer MainContainer sur ligne de commande:◦ Taper la commande : java jade.Boot -gui
  • 40. Lancer la plateforme jjaaddee ssuurr lliiggnneeddee ccoommmmaannddee pour lancer un autre container dans une autre machine :◦ Taper la commande : java jade.Boot –container –host Main_IP_Adress
  • 41. DDéémmaarrrreerr llee MMaaiinnCCoonnttaaiinneerr aavveecc uunneeaapppplliiccaattiioonn jjaavvaaimport jade.core.Profile; import jade.core.ProfileImpl;import jade.core.Runtime; import jade.util.ExtendedProperties;import jade.util.leap.Properties;import jade.wrapper.AgentContainer;public class MainContainner {public static void main(String[] args) {try{RRuunnttiimmee rruunnttiimmee==RRuunnttiimmee..iinnssttaannccee(());;Properties properties=new ExtendedProperties();properties.setProperty(Profile.GUI,true);ProfileImpl profileImpl=new ProfileImpl(properties);AgentContainer mainContainer=runtime.createMainContainer(profileImpl);mainContainer.start();}catch(Exception e){ e.printStackTrace(); }}}
  • 42. EExxééccuuttiioonn ddee MMaaiinnCCoonnttaaiinneerr
  • 43. DDéémmaarrrreerr uunn AAggeennttCCoonnttaaiinneerr aavveeccuunnee aapppplliiccaattiioonn jjaavvaaimport jade.core.ProfileImpl;import jade.core.Runtime;import jade.wrapper.AgentContainer;public class Container {public static void main(String[] args) {ttrryy {{Runtime runtime=Runtime.instance();ProfileImpl profileImpl=new ProfileImpl(false);profileImpl.setParameter(ProfileImpl.MAIN_HOST,localhost);AgentContainer agentContainer=runtime.createAgentContainer(profileImpl);agentContainer.start();} catch (Exception e) { e.printStackTrace(); }}}
  • 44. Lancement dd’’uunn ccoonntteenneeuurr JJAADDEELancement de 3 conteneurs JADE
  • 45. CCrrééeerr lleess aaggeennttss On souhaite créer une application multi-agents.Ce SMA est contient◦ Des agents qui demandent l’achat d’un livre◦ et d’autres agents qui vendent les livres.◦ ll’’aacchheetteeuurr ddeevvrraaiitt cchhooiissiirr ll’’aaggeenntt qquuii ooffffrree lleemeilleur prix à travers un processus decommunication entre les agents.
  • 46. DDiiaaggrraammmmee dd’’iinntteerraaccttiioonnssContainer1 MainContainer Container2 Container3: Acheteur :AMS :DF :Vendeur :VendeurS’enregistrer (A1)S’enregistrer (V1)publier (service)S’enregistrer (V2)publier (service)Chercher liste des vendeursContainer 0:ConsomREQUEST (livre)CFP CFP PROPOSEPROPOSEBEST PROPAP ACCEPT or REFUSEINFORM
  • 47. UUnn AAggeenntt JJAADDEE Un agent JADE est une classe qui hérite de la classe Agent etqui redéfinie des méthodes qui définissent le cycle de vie del’agent dans la plateforme. La méthode setup est la première méthode qui sera appeléeaprès instanciation de l’agent par le container. la méthode doDelete permet de demander au container deddééttrruuiirree ll’’aaggeenntt. Avant que l’agent soit détruit, la méthode takeDown est appelée. Un agent peut se déplacer d’un container à l’autre.◦ Avant chaque opération de migration, la méthode beforeMove estappelée◦ Après chaque opération de migration, la méthode afterMove estappelée D’autres méthodes seront présentés par la suite.
  • 48. MMyy FFiirrsstt AAggeennttpackage agents;import jade.core.Agent;public class BookBuyerAgent extends Agent {@Overrideprotected void setup() {System.out.println(Salut je suis l'acheteur!);System.out.println(My Name is +this.getAID().getName());System.out.println(Je me prépare .....);}@Overrideprotected void beforeMove() {SSyysstteemm..oouutt..pprriinnttllnn((AAvvaanntt ddee mmiiggrreerr vveerrss uunnee nnoouuvveellllee llooccaattiioonn ..........));;}@Overrideprotected void afterMove() {System.out.println(Je viens d'arriver à une nouvelle location .....);}@Overrideprotected void takeDown() {System.out.println(avant de mourir .....);}}
  • 49. AAggeenntt iiddeennttiiffiieerr Chaque agent est identifié par un identifiant unique dans la plateforme. L’identifiant d’un objet de type jade.code.AID La méthode getAID() de la classe Agent permet de récupérerl’agentIdentifier Un objet de type AID contient le nom de l’agent plus le nom de lapalteforme (nom de domaine ou adresse IP) ainsi que le numéro deport de l’annuaire. Exemple de nom complet : acheteur1@192.168.30.12:1099/JADE Pour créer un objet de type AID sachant le nom local, o peutécrire :◦ AID vendeur=new AID(Vendeur1, AID.ISLOCALNAME); Le paramètre ISLOCALNAME indique que le premierparamètre représente le nom local.
  • 50. Déployer l’agent ssuurr lliiggnnee ddee ccoommaannddee Pour déployer un agent dans un nouveau container sur ligne de commande on peut écrire lacommande suivante :◦ Java jade.Boot -container –host localhost –agents acheteur1:agents.BookBuyerAgent
  • 51. Déployer l’agent dans une aapppplliiccaattiioonn jjaavvaa ::import jade.core.ProfileImpl; import jade.core.Runtime;import jade.wrapper.AgentContainer; import jade.wrapper.AgentController;public class BookBuyerContainer {public static void main(String[] args) {try {Runtime runtime=Runtime.instance();ProfileImpl profileImpl=new ProfileImpl(false);profileImpl.setParameter(ProfileImpl.MAIN_HOST,localhost);AgentContainer agentContainer=runtime.createAgentContainer(profileImpl);AAggeennttCCoonnttrroolllleerr aaggeennttCCoonnttrroolllleerr==aaggeennttCCoonnttaaiinneerr..ccrreeaatteeNNeewwAAggeenntt((aacchheetteeuurr11,,agents.BookBuyerAgent, new Object[]{});agentController.start();} catch (Exception e) {e.printStackTrace();}}}Infos: --------------------------------------Agent container Container-4@192.168.1.26 is ready.--------------------------------------------Salut je suis l'acheteur!My Name is acheteur1@WIN-7PA448PU1OR:1099/JADEJe me prépare .....
  • 52. Tester la mmoobbiilliittéé ddee ll’’aaggeenntt L’interface graphique de JADE permet de demander d’un agent demigrer d’un container à l’autre.Agent container Container-4@192.168.1.26 is ready.--------------------------------------------Salut je suis l'acheteur!My Name is acheteur1@WIN-7PA448PU1OR:1099/JADEJe me prépare .....Avant de migrer vers une nouvelle location .....
  • 53. Passer des argument àà uunn aaggeenntt aauu mmoommeenntt dduuddééppllooiieemmeenntt Les agents peuvent récupérer les arguments passé au moment dedéploiement sur ligne de commande ou dans le programme sous formed’un tableau d’objets. La méthode getArguments() de la classe Agent permet de récupérer laliste des arguments. Supposant qu’au moment du déploiement de notre agents nous passonsccoommmmee aarrgguummeenntt llee nnoomm dduu lliivvrree àà aacchheetteerr:: Sur ligne de commande :Java jade.Boot -container –host localhost –agentsacheteur1:agents.BookBuyerAgent(XML) Avec le code java :AgentController agentController=agentContainer.createNewAgent(acheteur1,agents.BookBuyerAgent, new Object[]{XML});
  • 54. Passer des argument àà uunn aaggeenntt aauu mmoommeenntt dduuddééppllooiieemmeennttpackage agents; import jade.core.Agent;import jade.core.Location;public class BookBuyerAgent extends Agent {private String livre;@Overrideprotected void setup() {Object[]args=getArguments();if(args.length==1){ livre=(String) args[0];System.out.println(Salut l'acheteur :+this.getAID().getName()+ est prêt n je tente d'acheter lelivre :+livre);}else{System.out.println(il faut spécifier le livre comme argument);doDelete();} }@Overrideprotected void takeDown() {System.out.println(Destruction de l'agent +this.getAID().getName());}}
  • 55. Déployer l’agent aavveecc ddeess aarrgguummeennttss
  • 56. Affecter les comportements àà uunn aaggeenntt Pour qu'un agent JADE exécute une tâche, nous avons tout d'abord besoinde définir ces tâches. Les tâches dans JADE (appelées behaviours ou des comportements)sont des instances de la classe jade.core.Behaviours . pour qu'un agent exécute une tâche on doit lui l'attribuer par laméthode addBehaviour(Behaviour b) de la classe jade.core.Agent. Chaque Behaviour doit implémenter au moins les deux méthodes :◦ action() : qui désigne les opérations à exécuter par le Behaviour;◦ done() : qui exprime si le Behaviour a terminé son exécution ou pas. Il existe deux autres méthodes dont l'implémentation n'est pas obligatoiremais qui peuvent être très utiles :◦ onStart() : appelée juste avant l'exécution de la méthode action();◦ onEnd() : appelée juste après la retournement de true par la méthode done().
  • 57. Affecter les comportements àà uunn aaggeenntt Des fois on a besoin de savoir quel est lepropriétaire d'un Behaviour, et cela peut êtreconnu par le membre myAgent du Behaviouren question. JADE alloue un thread par agent, pour cela unaaggeenntt eexxééccuuttee uunn BBeehhaavviioouurr àà llaa ffooiiss. L'agent peut exécuter plusieurs Behaviourssimultanément en choisissant un bon mécanismede passation d'un Behaviour à un autre (c'est à lacharge du programmeur et non pas à la chargedu JADE).
  • 58. BBeehhaavviioouurrss : JADE offre trois types de Behaviours simple. Ces Behaviours sont :◦ One-shot Behaviour Un one-shot Behaviour est une instance de laclasse jade.core.behaviours.OneShotBehaviour. Il a la particularité d'exécuter sa tâche une et une seule fois puis il se termine. La classe OneShotBehaviour implémente la méthode done() et elle retourne toujours true.◦ Cyclic Behaviour Un cyclic Behaviour est une instance de laccllaassssee jjaaddee..ccoorree..bbeehhaavviioouurrss..CCyycclliiccBBeehhaavviioouurr. un cyclic Behaviour exécute sa tâche d'une manière répétitive. La classe CyclicBehaviour implémente la méthode done() qui retournetoujours false.◦ Generic Behaviour Un Generic Behaviour est une instance de la classe jade.core.behaviours.Behaviour. Le Generic Behaviour vient entre le One-shot Behaviour et le Cyclic Behaviour de faitequ'il n'implémente pas la méthode done() et laisse son implémentation au programmeur, doncil peut planifier la terminaison de son Behaviour selon ces besoin.
  • 59. LLeess BBeehhaavviioouurrss ppllaanniiffiiééss WakerBehaviour◦ Le WakerBehaviour est implémenté de façon à exécuter laméthode onWake() après une période passée comme argument auconstructeur.◦ Cette période est exprimée en millisecondes. Le Behaviour prend finjjuussttee aapprrèèss aavvooiirr eexxééccuuttéé llaa mméétthhooddee oonnWWaakkee(()). TickerBehaviour◦ Le TickerBehaviour est implémenté pour qu'il exécute sa tâchepériodiquement par la méthode onTick().◦ La durée de la période est passée comme argument au constructeur.
  • 60. PPaarraalllleellBBeehhaavviioouurr Pour qu’un agent puisse exécuter plusieurs comportements à la fois, il faut utiliserParallelBehaviourpackage fa; import …public class FirstAgent extends Agent {@Overrideprotected void setup() {ParallelBehaviour parallelBehaviour=new ParallelBehaviour();addBehaviour(parallelBehaviour);parallelBehaviour.addSubBehaviour(new CyclicBehaviour() {@Overrideppuubblliicc vvooiidd aaccttiioonn(()) {{ //// TT11}}});parallelBehaviour.addSubBehaviour(new TickerBehaviour(this,1000) {@Overrideprotected void onTick() { // T2 }});parallelBehaviour.addSubBehaviour(new Behaviour() {int compteur;@Overridepublic boolean done() { return (compteur==4);}@Override public void action() { ++compteur; // T3 }}); }}
  • 61. EExxeemmppllee 11 ::public class BookBuyerAgent extends Agent {private String livre; private int compteur;@Overrideprotected void setup() {System.out.println(Salut je suis l'acheteur!);System.out.println(My Name is +this.getAID().getName()); System.out.println(Je me prépare .....);Object[] args=getArguments();if(args.length==1){ livre=(String) args[0]; } else{System.out.println(J'ai besoin du nom du livre à acheter ...);doDelete();}addBehaviour(new OneShotBehaviour() {@Overridepublic void action() {System.out.println(Cette action est exécutée une seule fois);} });addBehaviour(new TickerBehaviour(this,1000) {@Overrideprotected void onTick() {++compteur;System.out.println(Tentative Num +compteur+ pour acheter le livre +livre);}});}
  • 62. RReeddééppllooyyeerr ll’’aaggeennttAgentController agentController=agentContainer.createNewAgent(acheteur1,agents.BookBuyerAgent, new Object[]{XML});Salut je suis l'acheteur!My Name is acheteur1@WIN-7PA448PU1OR:1099/JADEJJee mmee pprrééppaarree .....Cette action est exécutée une seule foisTentative Num 1 pour acheter le livre XMLTentative Num 2 pour acheter le livre XMLTentative Num 3 pour acheter le livre XMLTentative Num 4 pour acheter le livre XML…
  • 63. Communication eennttrree aaggeennttss Pour que plusieurs agents JADE arrivent àcollaborer, ils doivent s'échanger desmessages. Chaque agent JADE possède une sorte debbooiittee aauuxx lleettttrreess qquuii ccoonnttiieenntt lleessmessages qui lui sont envoyés par lesautres agents. Ces boites aux lettres sont sous formed'une liste qui contient les messages selonl'ordre chronologique de leur arrivée.
  • 64. Format dd''uunn mmeessssaaggee JJAADDEE Les agents JADE utilisent des messages conformes auxspécifications de la FIPA (FIPA-ACL ) . les messages JADE sont des instances de la classeACLMessage du package jade.lang.acl. Ces messages sont composés en général de : L'émetteur du message : un champ rempli automatiquement lorsddee ll''eennvvooii dd''uunn mmeessssaaggee. L'ensemble des récepteurs du message : un message peut êtreenvoyé à plusieurs agents simultanément. L'acte de communication : qui représente le but de l'envoi dumessage en cours (informer l'agent récepteur, appel d'offre, réponse àune requête,…) Le contenu du message. Un ensemble de champs facultatifs, comme la langue utilisée,l'ontologie, le timeOut, l'adresse de réponse…
  • 65. LL''eennvvooii dd''uunn mmeessssaaggee Pour envoyer un message, il suffit de remplir les champs nécessaires(l'ensemble des récepteur et le contenu du message et l'acte decommunication) d'un message JADE, puis d'appeler la méthode send()de la classe Agent. Voici un exemple d'envoi d'un message JADE. ACLMessage message = new ACLMessage(ACLMessage.INFORM); message.addReceiver(new AID(vendeu1, AID.ISLOCALNAME)); message.setContent(Livre XML); send(message);
  • 66. RReecceeppttiioonn dd''uunn mmeessssaaggee La réception d'un message est aussi simple que l'envoi. Il suffit d'appeler la méthode reveive() de la classe Agent pourrécupérer le premier message non encore lu de l'agent. Exemple : ACLMessage msg = receive(); // Pour envoyer la réponse : ACLMessage message = new ACLMessage(ACLMessage.INFORM); message.addReceiver(msg.getSender()); message.setContent(400); send(message);
  • 67. L'attente dd''uunn mmeessssaaggee Il se peut qu'un agent doive effectuer un certain traitement oulancer quelques tâches après avoir reçu un message d'un autreagent. Il est possible de faire une attente active jusqu'à l'arrivé dumessage en utilisant la méthode block() : Exemple :addBehaviour(new CyclicBehaviour() {@@OOvveerrrriiddeepublic void action() {System.out.println(Cyclic behavior);ACLMessage msg=receive();if(msg!=null){System.out.println(Réception du message :+msg.getContent());}else{block();}} });
  • 68. EExxeemmppllee ddee mmeessssaaggeess Envoyer un message à tous les vendeurspour leur demander de proposer une offreconcernant un livre. Ici nous utilisons un message dont l’attributppeerrffoorrmmaattiivvee eesstt CCFFPP ((CCaallll FFoorr PPrrooppoossaall))// Message carrying a request for offerACLMessage cfp = new ACLMessage(ACLMessage.CFP);for (int i = 0; isellerAgents.lenght; ++i) {cfp.addReceiver(sellerAgents[i]);}cfp.setContent(targetBookTitle);myAgent.send(cfp);
  • 69. Filtrer lleess mmeessssaaggee ::MMeessssaaggeeTTeemmppaallttee Plusieurs messages peuvent arriver dansla file d’attente. Plusieurs agents tentent d’accéder auxmessages qui arrivent, iill eesstt iimmppoorrttaanntt ddee ddiissppoosseerr dd’’uunn mmooyyeennqui permet à un agent de filtrer lesmessages qui le concernent dans le uncontexte quelconque. Les Templates de messages permettent derésoudre ce problème.
  • 70. MMeessssaaggeeTTeemmppllaattee La classe MessageTemplate dispose d’un ensemble de méthodesstatiques de fabrique de d’objet MessageTemplate selondifférents critères. Exemples :◦ Ignorer tous les messages sauf ceux qui ont l’optionperformative est CFPaddBehaviour(new CyclicBehaviour() {@Overridepublic void action() {MessageTemplate mt =MessageTemplate.MatchPerformative(ACLMessage.CFP);ACLMessage msg = myAgent.receive(mt);if (msg != null) {// CFP Message received. Process it}else {block();}}}
  • 71. DDFF AAggeenntt Le service des pages jaunes permet aux agents de la plateforme depublier leurs services. D’autres agents de la plateforme peuvent découvrir ces services à partirde ce service de pages jaunes. Dans JADE, Le service des pages jaunes est assurée par un agent DF(Directory Facilitator) en respectant les spécification de la FIPA.
  • 72. Interactions aavveecc DDFF aaggeenntt Les agents peuvent communiquer avecDFAgent en envoyant des message ACL Le contenu de ces messages doiventrespecter la norme (SL0 language) et uneontologie propre à ce service ( FIPA-Agent-MMaannaaggeemmeenntt OOnnttoollooggyy)) Pour simplifier ces interactions, JADE a définila classe jade.domain.DFService aveclaquelle, il est possible de publier et dechercher des services simplifiant ainsi lesinteractions avec DFAgent.
  • 73. Publication ddeess sseerrvviicceess Un agent qui souhaite publier un service, doit fournir unedescription qui incluse :◦ Son identifiant AID◦ Liste des langages et des ontologies que les autres agent doiventutiliser pour communiquer avec lui◦ Liste des services publiés◦ Pour chaque service publié, on doit indiquer : LLee ttyyppee dduu sseerrvviiccee Le nom du service Les langages et les ontologies à utiliser pour exploiter ce service Et d’autres propriétés spécifiques. Les classe◦ DFAgentDescription,◦ ServiceDescription◦ et Property du package jade.domain.FIPAAgentManagement représentent lestrois abstraction mentionnées.
  • 74. Publication ddeess sseerrvviicceess@Overrideprotected void setup() {// Register the book-selling service in the yellow pagesDFAgentDescription dfd = new DFAgentDescription();dfd.setName(getAID());ServiceDescription sd = new ServiceDescription();sd.setType(book-selling);ssdd..sseettNNaammee((JJAADDEE--bbooookk--ttrraaddiinngg));;dfd.addServices(sd);try {DFService.register(this, dfd);}catch (FIPAException fe) {fe.printStackTrace();}}
  • 75. Suppression dd’’uunn sseerrvviiccee ppuubblliiéé Quand un agent termine son travail, il est important desupprimer ses services des pages jaunes. Généralement cette opération est effectuée dans laméthode takeDown()@Overrideprotected void takeDown() {// Deregister from the yellow pagestry {DFService.deregister(this);}catch (FIPAException fe) {fe.printStackTrace();}}
  • 76. Chercher ddeess sseerrvviicceess Un agent qui souhaite chercher des services doit fournir au DF,une template de description qui décrit les services souhaités. Le résultat de la recherche est une liste de descriptions deservices. La méthode statique search() de la classe DFService peut êtreutilisée pour ce fait.addBehaviour(new TickerBehaviour(this, 60000) {pprrootteecctteedd vvooiidd oonnTTiicckk(()) {{// Update the list of seller agentsDFAgentDescription template = new DFAgentDescription();ServiceDescription sd = new ServiceDescription();sd.setType(book-selling); template.addServices(sd);try {DFAgentDescription[] result = DFService.search(myAgent, template);AID[] sellerAgents = new AID[result.length];for (int i = 0; iresult.length; ++i) {sellerAgents[i] = result[i].getName();}}catch (FIPAException fe) { fe.printStackTrace(); }
  • 77. PPrreemmiièèrree AApppplliiccaattiioonn Un agent consommateur demande à l’agent Acheteurd’acheter un livre L’agent acheteur demande à l’agent vendeur de luidonner son offre L’agent acheteur accepte l’offre Et la transaction est conclue::CCoonnssoommmmaatteeuurr ::AAcchheetteeuurr ::VVeennddeeuurrREQUEST CFP PROPOSEACCEPT_PROPOSALCONFIRMRESPONSE
  • 78. BBooookkBBuuyyeerrAAggeennttpackage agents; import jade.core.AID; import jade.core.Agent;import jade.core.behaviours.CyclicBehaviour; import jade.lang.acl.ACLMessage;import jade.lang.acl.MessageTemplate;public class BookBuyerAgent extends Agent {private int compteur;@Overrideprotected void setup() {System.out.println(Salut je suis l'agent Acheteur mon nomest:+this.getAID().getName());addBehaviour(new CyclicBehaviour() {private AID requester; private String livre; private double prix;@Overridepublic void action() {try {MessageTemplate template=MessageTemplate.or(MessageTemplate.MatchPerformative(ACLMessage.PROPOSE),MessageTemplate.or(MessageTemplate.MatchPerformative(ACLMessage.CONFIRM),MessageTemplate.MatchPerformative(ACLMessage.REQUEST)));
  • 79. BBooookkBBuuyyeerrAAggeennttACLMessage aclMessage=receive(template);if(aclMessage!=null){switch(aclMessage.getPerformative()){case ACLMessage.REQUEST :++compteur;System.out.println(#########################################);System.out.println(Requête d'achat de livre:);System.out.println(From :+aclMessage.getSender().getName());livre=aclMessage.getContent();rreeqquueesstteerr==aaccllMMeessssaaggee..ggeettSSeennddeerr(());;System.out.println(Livre : +livre);System.out.println(............................);System.out.println(Envoi de la requête....);ACLMessage msg=new ACLMessage(ACLMessage.CFP);msg.setContent(livre);msg.setConversationId(livre+-+compteur);msg.addUserDefinedParameter(compteur, String.valueOf(compteur));msg.addReceiver(new AID(Vendeur1,AID.ISLOCALNAME));System.out.println(....... En cours);Thread.sleep(5000); send(msg);break;
  • 80. BBooookkBBuuyyeerrAAggeennttcase ACLMessage.PROPOSE :prix=Double.parseDouble(aclMessage.getContent());System.out.println(***********************************);System.out.println(Conversation ID:+aclMessage.getConversationId());System.out.println(Réception de l'offre :);System.out.println(From :+aclMessage.getSender().getName());System.out.println(Prix=+prix);System.out.println(-----------------------------------);SSyysstteemm..oouutt..pprriinnttllnn((CCoonncclluussiioonn ddee llaa ttrraannssaaccttiioonn..............));;ACLMessage aclMessage2=aclMessage.createReply();aclMessage2.setPerformative(ACLMessage.ACCEPT_PROPOSAL);System.out.println(...... En cours);Thread.sleep(5000);send(aclMessage2);break;
  • 81. BBooookkBBuuyyeerrAAggeennttcase ACLMessage.CONFIRM:System.out.println(.........................);System.out.println(Reçu de la confirmation ...);System.out.println(Conversation ID:+aclMessage.getConversationId());ACLMessage msg3=new ACLMessage(ACLMessage.INFORM);msg3.addReceiver(requester);msg3.setConversationId(aclMessage.getConversationId());msg3.setContent(transaction+ livre+livre+/livre++ pprriixx++lliivvrree++//pprriixx+ fournisseur+aclMessage.getSender().getName()+/fournisseur+ /transaction);send(msg3);break;}}else{block();}} catch (Exception e) {e.printStackTrace();}
  • 82. BBooookkSSeelllleerrAAggeennttpackage agents;import java.util.HashMap; import java.util.Map; import jade.core.Agent;import jade.core.behaviours.CyclicBehaviour; import jade.lang.acl.ACLMessage;import jade.lang.acl.MessageTemplate;public class BookSellerAgent extends Agent {private MapString, Double data=new HashMap();@Overrideprotected void setup() {data.put(XML, new Double(230)); data.put(JAVA, new Double(460));ddaattaa..ppuutt((IIOOTT,, nneeww DDoouubbllee((554400))));;System.out.println(....... Vendeur +this.getAID().getName());addBehaviour(new CyclicBehaviour() {@Overridepublic void action() {try {MessageTemplate messageTemplate= MessageTemplate.or(MessageTemplate.MatchPerformative(ACLMessage.CFP),MessageTemplate.MatchPerformative(ACLMessage.ACCEPT_PROPOSAL));ACLMessage aclMessage=receive(messageTemplate);
  • 83. BBooookkSSeelllleerrAAggeennttif(aclMessage!=null){switch(aclMessage.getPerformative()){case ACLMessage.CFP :System.out.println(--------------------------------);System.out.println(Conversation ID:+aclMessage.getConversationId());String livre=aclMessage.getContent();String compteur=aclMessage.getUserDefinedParameter(compteur);System.out.println(Réception d'un message :+compteur);System.out.println(Expéditeur :+aclMessage.getSender().getName());SSyysstteemm..oouutt..pprriinnttllnn((CCoonntteennuu::++lliivvrree));;System.out.println(--------------------------------);Double prix=data.get(livre);ACLMessage reply=aclMessage.createReply();reply.setPerformative(ACLMessage.PROPOSE);reply.setContent(prix.toString());System.out.println(...... En cours);Thread.sleep(5000);send(reply);break;
  • 84. BBooookkSSeelllleerrAAggeennttcase ACLMessage.ACCEPT_PROPOSAL:System.out.println(--------------------------------);System.out.println(Conversation ID:+aclMessage.getConversationId());System.out.println(Validation de la transaction .....);ACLMessage reply2=aclMessage.createReply();reply2.setPerformative(ACLMessage.CONFIRM);System.out.println(...... En cours);Thread.sleep(5000);send(reply2);bbrreeaakk;;} }else{System.out.println(Block);block();}} catch (Exception e) {e.printStackTrace(); }}});}@Overrideprotected void takeDown() {}}
  • 85. MMaaiinnCCoonnttaaiinneerrimport jade.core.Profile; import jade.core.ProfileImpl;import jade.core.Runtime; import jade.util.ExtendedProperties;import jade.util.leap.Properties; import jade.wrapper.AgentContainer;public class MainContainner {public static void main(String[] args) {try{Runtime runtime=Runtime.instance();Properties properties=new ExtendedProperties();properties.setProperty(Profile.GUI,true);PPrrooffiilleeIImmppll pprrooffiilleeIImmppll==nneeww PPrrooffiilleeIImmppll((pprrooppeerrttiieess));;AgentContainer mainContainer=runtime.createMainContainer(profileImpl);mainContainer.start();}catch(Exception e){e.printStackTrace();}}}
  • 86. BBooookkBBuuyyeerrCCoonnttaaiinneerrimport jade.core.ProfileImpl;import jade.core.Runtime;import jade.wrapper.AgentContainer;import jade.wrapper.AgentController;public class BookBuyerContainer {public static void main(String[] args) {try {Runtime runtime=Runtime.instance();ProfileImpl profileImpl=new ProfileImpl(false);profileImpl.setParameter(ProfileImpl.MAIN_HOST,localhost);AAggeennttCCoonnttaaiinneerr aaggeennttCCoonnttaaiinneerr==rruunnttiimmee..ccrreeaatteeAAggeennttCCoonnttaaiinneerr((pprrooffiilleeIImmppll));;AgentController agentController=agentContainer.createNewAgent(acheteur1,agents.BookBuyerAgent, new Object[]{});agentController.start();} catch (Exception e) {e.printStackTrace();}}}
  • 87. BBooookkSSeelllleerrCCoonnttaaiinneerrimport jade.core.ProfileImpl;import jade.core.Runtime;import jade.wrapper.AgentContainer;import jade.wrapper.AgentController;public class BookSellerContainer {public static void main(String[] args) {try {Runtime runtime=Runtime.instance();ProfileImpl profileImpl=new ProfileImpl(false);pprrooffiilleeIImmppll..sseettPPaarraammeetteerr((PPrrooffiilleeIImmppll..MMAAIINN__HHOOSSTT,,llooccaallhhoosstt));;AgentContainer agentContainer=runtime.createAgentContainer(profileImpl);AgentControlleragentController=agentContainer.createNewAgent(Vendeur1,agents.BookSellerAgent, new Object[]{});agentController.start();} catch (Exception e) {e.printStackTrace();}}}
  • 88. DDééppllooiieemmeenntt
  • 89. Image ddee llaa ccoonnvveerrssaattiioonn
  • 90. AApppplliiccaattiioonn 22 Créer un SMA composés des agents suivants :◦ Des agents de type BookSellerAgent qui ont pour objectif de vendredes livres aux agents qui souhaitent achéter.◦ Un agent de type BookBuyerAgent qui a pour objectif d’acheter unlivre avec le meilleur prix du marché. Le SMA fonctionne de la manière suivante : BookSeller :◦ ÀÀ ssaa ccrrééaattiioonn uunn aaggeenntt BBooookkSSeelllleerr ddooiitt ppuubblliieerr uunn sseerrvviiccee ddaannss lleesspages jaunes. Ce service concerne la vente des livres.◦ Chaque agent BookSeller possèle une collection de type HashMapdont la clé reprsente le titre du livre et dont la valeur représente leprix du livre. Les prix seront choisi aléatoirement
  • 91. aapppplliiccaattiioonn BookBuyer :◦ À la demande d’un agent consommateur, l’agent de typeBookBuyer commence par récupérer le titre du livre àacheter, passé comment argument au moment dudéploiement◦ Ensuite, chaque minute, iill tteennttee ddee cchheerrcchheerr ddaannss llee sseerrvviiccee ddeess ppaaggeess jjaauunneess DDFF,, lleessagents qui offrent le service de vente de livres.◦ Ensuite, il envoie un message de type CFP (Create ForProposal ) à tous ces agents sellers, pour leurs demanderde lui fournir la proposition du prix du livre souhaité.◦ Si les propositions arrivent, il doit déterminer l’agent quioffre le meilleur prix.◦ Ensuite il envoi un message à cet agent pour finaliser lavente.
  • 92. Diagramme dd’’iinntteerraaccttiioonnss
  • 93. 3 demandes simultanée dd’’aacchhaatt ddee lliivvrreess
  • 94. Diagramme ddee ccllaasssseess :: AAcchheetteeuurr
  • 95. Diagramme ddee ccllaasssseess :: VVeennddeeuurr
  • 96. BBooookkSSeelllleerrAAggeennttpackage agents; import java.util.HashMap;import java.util.Map;import jade.core.*;import jade.core.behaviours.*; import jade.domain.*;import jade.domain.FIPAAgentManagement.*;import jade.lang.acl.*;public class BookSellerAgent extends Agent {private MapString, Double data=new HashMap();private ParallelBehaviour parallelBehaviour;@@OOvveerrrriiddeeprotected void setup() {data.put(XML, new Double(230+Math.random()*200));data.put(JAVA, new Double(460+Math.random()*200));data.put(IOT, new Double(540+Math.random()*200));System.out.println(....... Vendeur +this.getAID().getName());System.out.println(--------------);
  • 97. BBooookkSSeelllleerrAAggeennttSystem.out.println(Publication du service dans Directory Facilitator...);DFAgentDescription agentDescription=new DFAgentDescription();agentDescription.setName(this.getAID());ServiceDescription serviceDescription=new ServiceDescription();serviceDescription.setType(book-selling);serviceDescription.setName(book-trading);agentDescription.addServices(serviceDescription);try {DFService.register(this, agentDescription);} catch (FIPAException e1) {e1.printStackTrace();}
  • 98. BBooookkSSeelllleerrAAggeennttparallelBehaviour=new ParallelBehaviour();addBehaviour(parallelBehaviour);parallelBehaviour.addSubBehaviour(new CyclicBehaviour() {@Overridepublic void action() {try {MessageTemplate messageTemplate=MessageTemplate.MatchPerformative(ACLMessage.CFP);AACCLLMMeessssaaggee aaccllMMeessssaaggee==rreecceeiivvee((mmeessssaaggeeTTeemmppllaattee));;if(aclMessage!=null){System.out.println(Conversation ID:+aclMessage.getConversationId());String livre=aclMessage.getContent();Double prix=data.get(livre);ACLMessage reply=aclMessage.createReply();reply.setPerformative(ACLMessage.PROPOSE);reply.setContent(prix.toString());System.out.println(...... En cours);Thread.sleep(5000);send(reply);
  • 99. BBooookkSSeelllleerrAAggeennttparallelBehaviour.addSubBehaviour(newSellerBehaviour(myAgent,aclMessage.getConversationId()));} else{ block(); }} catch (Exception e) { e.printStackTrace(); }}}); }@Overridepprrootteecctteedd vvooiidd ttaakkeeDDoowwnn(()) {{try {DFService.deregister(this);} catch (FIPAException e) {e.printStackTrace();}}}
  • 100. SSeelllleerrBBeehhaavviioouurrpackage agents;import jade.core.Agent;import jade.core.behaviours.CyclicBehaviour;import jade.lang.acl.ACLMessage;import jade.lang.acl.MessageTemplate;public class SellerBehaviour extends CyclicBehaviour {private String conversationID;public SellerBehaviour(Agent agent,String conversationID) {super(agent);this.conversationID=conversationID;}@Overridepublic void action() {try {MessageTemplate messageTemplate= MessageTemplate.and(MessageTemplate.MatchConversationId(conversationID),MessageTemplate.MatchPerformative(ACLMessage.ACCEPT_PROPOSAL));ACLMessage aclMessage=myAgent.receive(messageTemplate);
  • 101. SSeelllleerrBBeehhaavviioouurrif(aclMessage!=null){System.out.println(--------------------------------);System.out.println(Conversation ID:+aclMessage.getConversationId());System.out.println(Validation de la transaction .....);ACLMessage reply2=aclMessage.createReply();reply2.setPerformative(ACLMessage.CONFIRM);System.out.println(...... En cours);TThhrreeaadd..sslleeeepp((55000000));;myAgent.send(reply2);}else{block();}} catch (Exception e) {e.printStackTrace();}}}
  • 102. BBooookkBBuuyyeerrAAggeennttpackage agents; import jade.core.AID; import jade.core.Agent;import jade.core.behaviours.CyclicBehaviour; importjade.core.behaviours.ParallelBehaviour;import jade.lang.acl.ACLMessage; import jade.lang.acl.MessageTemplate;public class BookBuyerAgent extends Agent {ParallelBehaviour parallelBehaviour;int requesterCount;@Overrideprotected void setup() {System.out.println(Salut je suis l'agent Acheteur mon nomest:+this.getAID().getName());parallelBehaviour=new ParallelBehaviour();addBehaviour(parallelBehaviour);
  • 103. BBooookkBBuuyyeerrAAggeennttparallelBehaviour.addSubBehaviour(new CyclicBehaviour() {@Overridepublic void action() {MessageTemplatetemplate=MessageTemplate.MatchPerformative(ACLMessage.REQUEST);ACLMessage aclMessage=receive(template);if(aclMessage!=null){String livre=aclMessage.getContent();AID requester=aclMessage.getSender();++requesterCount;String conversationID=transaction_+livre+_+requesterCount;parallelBehaviour.addSubBehaviour(new RequestBehaviour(myAgent,livre,requester,conversationID));}else block();}});}
  • 104. BBooookkBBuuyyeerrAAggeenntt@Overrideprotected void beforeMove() {System.out.println(Avant de migrer vers une nouvelle location.....);}@Overrideprotected void afterMove() {SSyysstteemm..oouutt..pprriinnttllnn((JJee vviieennss dd''aarrrriivveerr àà uunnee nnoouuvveellllee llooccaattiioonn.....);}@Overrideprotected void takeDown() {System.out.println(avant de mourir .....);}}
  • 105. RReeqquueessttBBeehhaavviioouurrpackage agents; import jade.core.AID; import jade.core.Agent;import jade.core.behaviours.CyclicBehaviour; import jade.domain.DFService;import jade.domain.FIPAException; import jade.domain.FIPAAgentManagement.DFAgentDescription;import jade.domain.FIPAAgentManagement.ServiceDescription; import jade.lang.acl.ACLMessage;import jade.lang.acl.MessageTemplate; import java.util.ArrayList; import java.util.List;class RequestBehaviour extends CyclicBehaviour{private String conversationID;private AID requester; private String livre;pprriivvaattee ddoouubbllee pprriixx;; pprriivvaattee iinntt ccoommpptteeuurr;;private ListAID vendeurs=new ArrayList();private AID meilleureOffre;private double meilleurPrix;private int index;
  • 106. RReeqquueessttBBeehhaavviioouurrpublic RequestBehaviour(Agent agent,String livre,AID requester,StringconversationID) {super(agent);this.livre=livre; this.requester=requester;this.conversationID=conversationID;System.out.println(Recherche des services...);vendeurs=chercherServices(myAgent, book-selling);System.out.println(Liste des vendeurs trouvés :);try {for(AID aid:vendeurs){System.out.println(====+aid.getName());}++compteur;System.out.println(#########################################);System.out.println(Requête d'achat de livre:);System.out.println(From :+requester.getName());System.out.println(Livre : +livre);System.out.println(............................);
  • 107. RReeqquueessttBBeehhaavviioouurrSystem.out.println(Envoi de la requête....);ACLMessage msg=new ACLMessage(ACLMessage.CFP);msg.setContent(livre);msg.setConversationId(conversationID);msg.addUserDefinedParameter(compteur, String.valueOf(compteur));for(AID aid:vendeurs){msg.addReceiver(aid);}System.out.println(....... En cours);Thread.sleep(5000);index=0;myAgent.send(msg);} catch (Exception e) {e.printStackTrace();}}
  • 108. RReeqquueessttBBeehhaavviioouurr@Overridepublic void action() {try {MessageTemplate template=MessageTemplate.and(MessageTemplate.MatchConversationId(conversationID),MessageTemplate.or(MessageTemplate.MatchPerformative(ACLMessage.PROPOSE),MessageTemplate.MatchPerformative(ACLMessage.CONFIRM)));AACCLLMMeessssaaggee aaccllMMeessssaaggee==mmyyAAggeenntt..rreecceeiivvee((tteemmppllaattee));;if(aclMessage!=null){switch(aclMessage.getPerformative()){case ACLMessage.PROPOSE :prix=Double.parseDouble(aclMessage.getContent());System.out.println(***********************************);System.out.println(Conversation ID:+aclMessage.getConversationId());System.out.println(Réception de l'offre :);System.out.println(From :+aclMessage.getSender().getName());System.out.println(Prix=+prix);
  • 109. RReeqquueessttBBeehhaavviioouurrif(index==0){meilleurPrix=prix; meilleureOffre=aclMessage.getSender();}else{if(prixmeilleurPrix){meilleurPrix=prix;meilleureOffre=aclMessage.getSender();} }++++iinnddeexx;;if(index==vendeurs.size()){index=0; System.out.println(-----------------------------------);System.out.println(Conclusion de la transaction.......);ACLMessage aclMessage2=new ACLMessage(ACLMessage.ACCEPT_PROPOSAL);aclMessage2.addReceiver(meilleureOffre);aclMessage2.setConversationId(conversationID);System.out.println(...... En cours); Thread.sleep(5000);myAgent.send(aclMessage2);}break;
  • 110. RReeqquueessttBBeehhaavviioouurrcase ACLMessage.CONFIRM:System.out.println(.........................);System.out.println(Reçu de la confirmation ...);System.out.println(Conversation ID:+aclMessage.getConversationId());ACLMessage msg3=new ACLMessage(ACLMessage.INFORM);msg3.addReceiver(requester);msg3.setConversationId(conversationID);msg3.setContent(transaction++ lliivvrree++lliivvrree++//lliivvrree+ prix+meilleurPrix+/prix+ fournisseur+aclMessage.getSender().getName()+/fournisseur+ /transaction);myAgent.send(msg3);break;} }else{ block(); }} catch (Exception e) { e.printStackTrace(); }}
  • 111. RReeqquueessttBBeehhaavviioouurrpublic ListAID chercherServices(Agent agent,String type){ListAID vendeurs=new ArrayList();DFAgentDescription agentDescription=new DFAgentDescription();ServiceDescription serviceDescription=new ServiceDescription();serviceDescription.setType(type);agentDescription.addServices(serviceDescription);try {DFAgentDescription[] descriptions=DFService.search(agent, agentDescription);ffoorr((DDFFAAggeennttDDeessccrriippttiioonn ddffaadd::ddeessccrriippttiioonnss)){{vendeurs.add(dfad.getName());}} catch (FIPAException e) {e.printStackTrace();}return vendeurs;}}
  • 112. BBooookkSSeelllleerrCCoonnttaaiinneerrimport java.util.Scanner;import jade.core.ProfileImpl;import jade.core.Runtime;import jade.wrapper.AgentContainer; import jade.wrapper.AgentController;public class BookSellerContainer {public static void main(String[] args) {try {Scanner clavier=new Scanner(System.in);System.out.print(Nom du vendeur:);String name=clavier.next();Runtime runtime=Runtime.instance();ProfileImpl profileImpl=new ProfileImpl(false);profileImpl.setParameter(ProfileImpl.MAIN_HOST,localhost);AgentContainer agentContainer=runtime.createAgentContainer(profileImpl);AgentController agentController=agentContainer.createNewAgent(name,agents.BookSellerAgent, new Object[]{});agentController.start();} catch (Exception e) { e.printStackTrace(); }}}
  • Fly UP