{"id":946,"date":"2020-03-18T10:43:28","date_gmt":"2020-03-18T13:43:28","guid":{"rendered":"http:\/\/www.galirows.com.br\/meublog\/?p=946"},"modified":"2020-09-04T10:27:30","modified_gmt":"2020-09-04T13:27:30","slug":"implementacao-sma-python-spade1","status":"publish","type":"post","link":"http:\/\/www.galirows.com.br\/meublog\/blog\/implementacao-sma-python-spade1\/","title":{"rendered":"Implementa\u00e7\u00e3o de SMA no Python e utilizando SPADE"},"content":{"rendered":"\n<p><a rel=\"noreferrer noopener\" aria-label=\"SPADE  (abre numa nova aba)\" href=\"https:\/\/spade-mas.readthedocs.io\/en\/latest\/\" target=\"_blank\">SPADE <\/a>\u00e9 uma plataforma para o desenvolvimento de sistemas multiagentes (SMA) na linguagem Python e cuja mensagens trocadas s\u00e3o baseadas no protocolo de mensagens instant\u00e2neas XMPP. <\/p>\n\n\n\n<p>A nova vers\u00e3o do SPADE foi implementada para Python 3 e representa uma  significativa melhoria com rela\u00e7\u00e3o a sua vers\u00e3o para Python 2.7. Embora a ess\u00eancia de funcionamento seja a mesma, a plataforma foi reformulada e est\u00e1 mais f\u00e1cil de codificar, al\u00e9m de permitir o uso com qualquer servidor XMPP (antes precisa utilizar o servidor um servidor espec\u00edfico).  <\/p>\n\n\n\n<p>O trabalho aqui apresentado foi solicitado para uma turma da disciplina de Sistemas Inteligentes. A ideia desse projeto foi desenvolver 2 tipos de agentes: <\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Gerador: agente respons\u00e1vel por gerar uma fun\u00e7\u00e3o e retornar o valor calculado para a fun\u00e7\u00e3o a partir de um n\u00famero <em>x<\/em> recebido.<ul><li>Exemplo de fun\u00e7\u00f5es:<ul><li>1grau: a.x + b<\/li><li>2grau: a.x<sup>2<\/sup> &#8211; b<\/li><li>3grau: -0.2(x+a)(x-b)(x-c)<\/li><\/ul><\/li><\/ul><\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li>Resolvedor: agente respons\u00e1vel por acertar o n\u00famero para obter o zero da fun\u00e7\u00e3o.<\/li><\/ul>\n\n\n\n<p>O diagrama abaixo ilustra a intera\u00e7\u00e3o e suas performativas. Observe que n\u00e3o foi seguido o padr\u00e3o FIPA dos protocolos. <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"328\" height=\"224\" src=\"http:\/\/www.galirows.com.br\/meublog\/wp-content\/uploads\/2019\/12\/SMAfuncao.png\" alt=\"\" class=\"wp-image-947\" srcset=\"http:\/\/www.galirows.com.br\/meublog\/wp-content\/uploads\/2019\/12\/SMAfuncao.png 328w, http:\/\/www.galirows.com.br\/meublog\/wp-content\/uploads\/2019\/12\/SMAfuncao-300x205.png 300w, http:\/\/www.galirows.com.br\/meublog\/wp-content\/uploads\/2019\/12\/SMAfuncao-150x102.png 150w\" sizes=\"auto, (max-width: 328px) 100vw, 328px\" \/><\/figure><\/div>\n\n\n\n<p>O agente Gerador \u00e9 realmente simples, precisando de 2 comportamentos c\u00edclicos: (1) um para responder a solicita\u00e7\u00e3o do tipo da fun\u00e7\u00e3o; e (2) outro para calcular e retornar o resultado da fun\u00e7\u00e3o para um valor informado. Quando a agente Gerador \u00e9 criado, ele sortear\u00e1 um dos 3 tipos de fun\u00e7\u00e3o e gerar\u00e1 uma fun\u00e7\u00e3o apropriada para aquele tipo (uma vez que a fun\u00e7\u00e3o \u00e9 gerada ela n\u00e3o mudar\u00e1 at\u00e9 a pr\u00f3xima vez que o agente for executado).<\/p>\n\n\n\n<p>Um agente Gerador pode responder para v\u00e1rios agentes &#8220;Resolvedor&#8221;. Todos os resolvedores tentar\u00e3o acertar o zero da fun\u00e7\u00e3o e sendo assim, o Gerador n\u00e3o dever\u00e1 parar quando um resultado zero for encontrado.<\/p>\n\n\n\n<p>Para simplificar o problema, a fun\u00e7\u00e3o sempre ter\u00e1 um n\u00famero inteiro como solu\u00e7\u00e3o e o n\u00famero estar\u00e1 no intervalo entre -1000 e 1000. Isso quer dizer que, no pior dos casos, um agente que envia valores inteiros dentro desse intervalo, eventualmente ir\u00e1 acertar um valor que retorna o zero da fun\u00e7\u00e3o. O <em>valorCalculado <\/em>retornado pelo Gerador ser\u00e1 apenas a parte inteira do c\u00e1lculo da fun\u00e7\u00e3o, ou seja, n\u00e3o ser\u00e1 retornado o valor exato.<\/p>\n\n\n\n<p>Uma vez que se sabe o tipo da fun\u00e7\u00e3o, \u00e9 poss\u00edvel elaborar solu\u00e7\u00f5es para encontrar o zero da fun\u00e7\u00e3o mais facilmente. Por exemplo, para encontrar o zero para a equa\u00e7\u00e3o do primeiro grau, \u00e9 poss\u00edvel obter uma solu\u00e7\u00e3o que resolve em 3 tentativas.<\/p>\n\n\n\n<p>Uma sugest\u00e3o \u00e9 criar um agente resolvedor para cada tipo de fun\u00e7\u00e3o e instanciar o agente espec\u00edfico assim que souber qual o tipo de fun\u00e7\u00e3o. <\/p>\n\n\n\n<p>Na segunda parte (<a href=\"http:\/\/www.galirows.com.br\/meublog\/blog\/sma-com-spade-parte-da-solucao-do-agente-gerador\/\" data-type=\"post\" data-id=\"982\">SMA com SPADE \u2013 parte da solu\u00e7\u00e3o do agente \u201cGerador\u201d<\/a>) eu trago o script do Gerador e uma breve explica\u00e7\u00e3o sobre o funcionamento.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>SPADE \u00e9 uma plataforma para o desenvolvimento de sistemas multiagentes (SMA) na linguagem Python e cuja mensagens trocadas s\u00e3o baseadas no protocolo de mensagens instant\u00e2neas XMPP. A nova vers\u00e3o do SPADE foi implementada para Python 3 e representa uma significativa melhoria com rela\u00e7\u00e3o a sua vers\u00e3o para Python 2.7. Embora a ess\u00eancia de funcionamento seja [&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],"tags":[],"class_list":["post-946","post","type-post","status-publish","format-standard","hentry","category-agentes-e-sistemas-multiagentes"],"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/posts\/946","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=946"}],"version-history":[{"count":7,"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/posts\/946\/revisions"}],"predecessor-version":[{"id":993,"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/posts\/946\/revisions\/993"}],"wp:attachment":[{"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/media?parent=946"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/categories?post=946"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/wp-json\/wp\/v2\/tags?post=946"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}