{"id":802,"date":"2017-09-20T17:36:47","date_gmt":"2017-09-20T20:36:47","guid":{"rendered":"http:\/\/www.galirows.com.br\/meublog\/?p=802"},"modified":"2021-06-15T10:23:31","modified_gmt":"2021-06-15T13:23:31","slug":"filtrando-mensagens-spade","status":"publish","type":"post","link":"http:\/\/www.galirows.com.br\/meublog\/blog\/filtrando-mensagens-spade\/","title":{"rendered":"Filtrando mensagens no SPADE"},"content":{"rendered":"\n<figure class=\"wp-block-pullquote\"><blockquote><p>Esse tutorial \u00e9 de uma vers\u00e3o antiga do SPADE (Python 2.7)<\/p><\/blockquote><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">No c\u00f3digo a seguir demonstro como filtrar as mensagens que s\u00e3o recebidas por um comportamento. O comportamento em si \u00e9 bastante simples, consistindo de um comportamento c\u00edclico chamado M1 e que fica aguardando receber uma mensagem. Quando a mensagem \u00e9 recebida ele simplesmente imprime M1.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Observe que a adi\u00e7\u00e3o do comportamento (linha 13) est\u00e1 associada a um template de mensagem (especificado nas linhas 10, 11 e 12). Nesse template eu filtrei que o comportamento somente deveria reagir a performativa &#8220;inform&#8221; (linha 11). Com essa filtragem, se o agente receber mensagens de qualquer tipo que n\u00e3o seja um inform, o comportamento n\u00e3o tratar\u00e1 o recebimento dessa mensagem.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:python decode:true\"><code lang=\"python\" class=\"language-python line-numbers\">import spade\n\nclass Teste(spade.Agent.Agent):\n    class M1(spade.Behaviour.Behaviour):         \n        def _process(self):\n            msg = self._receive(True)\n            print \"M1\"\n                   \n    def _setup(self):\n        template1 = spade.Behaviour.ACLTemplate()\n        template1.setPerformative(\"inform\")\n        t1 = spade.Behaviour.MessageTemplate(template1)            \n        self.addBehaviour(self.M1(),t1)\n            \nteste = Teste(\"teste@127.0.0.1\", \"secret\") \nteste.start()\ntime.sleep(30)\nteste.stop()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Estendo a seguir o exemplo anterior adicionando dois comportamentos (M1 e M2). Ambos escrevem seu nome quando recebem uma mensagem. Observe agora que a adi\u00e7\u00e3o desses comportamentos (linhas 19 e 25) utilizam dois templates diferentes. Ambos exigem uma performativa &#8220;inform&#8221;, mas tamb\u00e9m restringem a mensagem pelo conte\u00fado (linhas 17 e 23). Quando um &#8220;inform&#8221; tendo com conte\u00fado a letra &#8220;T&#8221; for enviado para o agente, somente o comportamento M1 ser\u00e1 executado.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:python decode:true\"><code lang=\"python\" class=\"language-python line-numbers\">import spade\n\nclass Teste(spade.Agent.Agent):\n    class M1(spade.Behaviour.Behaviour):         \n        def _process(self):\n            msg = self._receive(True)\n            print \"M1\"\n            \n    class M2(spade.Behaviour.Behaviour):     \n        def _process(self):\n            msg = self._receive(True)\n            print \"M2\"\n                   \n    def _setup(self):\n        template1 = spade.Behaviour.ACLTemplate()\n        template1.setPerformative(\"inform\")\n        template1.setContent(\"T\")\n        t1 = spade.Behaviour.MessageTemplate(template1)            \n        self.addBehaviour(self.M1(),t1)\n\n        template2 = spade.Behaviour.ACLTemplate()\n        template2.setPerformative(\"inform\")\n        template2.setContent(\"A\")\n        t2 = spade.Behaviour.MessageTemplate(template2)    \n        self.addBehaviour(self.M2(),t2)\n            \nteste = Teste(\"teste@127.0.0.1\", \"secret\") \nteste.start()\ntime.sleep(30)\nteste.stop()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O c\u00f3digo a seguir adiciona outros dois comportamentos c\u00edclicos ao c\u00f3digo anterior. Veja que o comportamento M3 \u00e9 adicionado com um template que apenas filtra pela performativa &#8220;inform&#8221;, enquanto o comportamento M4 \u00e9 adicionado sem nenhum template para filtrar. Isso significa que qualquer mensagem do tipo &#8220;inform&#8221; ser\u00e1 executado no comportamento M3, enquanto qualquer mensagem recebida pelo agente tamb\u00e9m ir\u00e1 executar o comportamento de M4. Em outras palavras, M4 ser\u00e1 executado para qualquer mensagem recebida pelo agente, se a mensagem for um &#8220;inform&#8221; e o conte\u00fado for a letra &#8220;T&#8221; ent\u00e3o os comportamentos M1 e M3 tamb\u00e9m ser\u00e3o executados (M1 por ter seus dois crit\u00e9rios atendidos e o M3 pela mensagem ser um&#8221;inform&#8221;, \u00fanica filtragem aplicada ao comportamento).<\/p>\n\n\n\n<pre class=\"wp-block-code lang:default decode:true\"><code lang=\"python\" class=\"language-python line-numbers\">import spade\n\nclass Teste(spade.Agent.Agent):\n    class M1(spade.Behaviour.Behaviour):         \n        def _process(self):\n            msg = self._receive(True)\n            print \"M1\"\n            \n    class M2(spade.Behaviour.Behaviour):     \n        def _process(self):\n            msg = self._receive(True)\n            print \"M2\"\n\n    class M3(spade.Behaviour.Behaviour):         \n        def _process(self):\n            msg = self._receive(True)\n            print \"M3\"\n\n    class M4(spade.Behaviour.Behaviour):         \n        def _process(self):\n            msg = self._receive(True)\n            print \"M4\"\n\n    def _setup(self):\n        template1 = spade.Behaviour.ACLTemplate()\n        template1.setPerformative(\"inform\")\n        template1.setContent(\"T\")\n        t1 = spade.Behaviour.MessageTemplate(template1)            \n        self.addBehaviour(self.M1(),t1)\n\n        template2 = spade.Behaviour.ACLTemplate()\n        template2.setPerformative(\"inform\")\n        template2.setContent(\"A\")\n        t2 = spade.Behaviour.MessageTemplate(template2)    \n        self.addBehaviour(self.M2(),t2)\n\n        template3 = spade.Behaviour.ACLTemplate()\n        template3.setPerformative(\"inform\")\n        t3 = spade.Behaviour.MessageTemplate(template3)    \n        self.addBehaviour(self.M3(),t3)\n\n        self.addBehaviour(self.M4())\n            \nteste = Teste(\"teste@127.0.0.1\", \"secret\") \nteste.start()\ntime.sleep(30)\nteste.stop()<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Esse tutorial \u00e9 de uma vers\u00e3o antiga do SPADE (Python 2.7) No c\u00f3digo a seguir demonstro como filtrar as mensagens que s\u00e3o recebidas por um comportamento. O comportamento em si \u00e9 bastante simples, consistindo de um comportamento c\u00edclico chamado M1 e que fica aguardando receber uma mensagem. Quando a mensagem \u00e9 recebida ele simplesmente imprime [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[15,6],"tags":[20,33],"class_list":["post-802","post","type-post","status-publish","format-standard","hentry","category-agentes-e-sistemas-multiagentes","category-ia","tag-python","tag-spade"],"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/posts\/802","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/comments?post=802"}],"version-history":[{"count":3,"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/posts\/802\/revisions"}],"predecessor-version":[{"id":1061,"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/posts\/802\/revisions\/1061"}],"wp:attachment":[{"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/media?parent=802"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/categories?post=802"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/tags?post=802"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}