Texto de apoio à
Comunicação entre Agentes
usando o LPA Prolog Agent Toolkit
Este texto serve de comentário ao exercício “Talker – Listener, um sistema multi-agente
rudimentar”.
Num ambiente multi-agente, cada um dos agentes deve possuir o seu próprio endereço ou, por
outras palavras, deve-lhe ser atribuída uma porta. Isto é declarado mediante a instanciação da
variável Params no predicado de inicialização do agente. Caso tal não aconteça, o Agent
Toolkit atribuirá ao agente uma porta.
Outro parâmetro que se poderá ter que especificar é o “host” em que o agente corre. Para que
tal se possa fazer de forma automática, o mecanismo mais usual passa pela chamada prévia do
predicado agent_id_det/9 que, entre outros dados referentes ao agente em causa, fornece a
identificação do “host”.
Para que um agente possa comunicar com outro há que estabelecer previamenteuma ligação
mediante o predicado agent _connect/3, definido no protocolo “default”. Este predicado
necessita como parâmetros a identificação do “host” e da porta em que o agente de destino
está instalado. O 3º parâmetro não deve estar instanciado quando o predicado é chamado mas
será instanciado pelo próprio predicado quando termine a sua execução com a identificação do
canal (socket) em que a ligação foi estabelecida, caso tenha tido sucesso.
Quando uma ligação é concretizada, o Agent Toolkit efectua as seguintes acções:
1. Faz o assert de factos agent_connected/3 nas bases de conhecimento dos agentes
envolvidos. Esses factos (um por cada ligação estabelecida) contêm informação sobre o tipo
e o protocolo da ligação e, ainda mais importante, sobre qual o canal pelo qual essa ligação
foi estabelecida.
2. Gera um evento connected do lado do agente que tomou a iniciativa de requerer o
estabelecimento da ligação.
3. Gera um evento connection_accepted do lado do agente de destino.
1000
2000
33
240
2
1
149
57
3000
18
3
106
É importante esclarecer que uma coisa são as portas em que os diversos agentes foram
criados, outra são os canais pelos quais eles comunicam. As portas correspondem aos
endereços dos agentes e são normalmente especificados pelo próprio programa. Os canais são
apenas os identificadores das ligações estabelecidas pelo ou com um dado agente.
É assim, por exemplo, que o agente 2, instalado na porta 2000, tem duas ligações abertas com
o agente 1 e 3 através dos canais 33 e 57 respectivamente.
Para uma mesma ligação entre dois agentes, os canais de cada lado da ligação são
obrigatoriamente diferentes e atribuídos automáticamente pelo sistema de forma dinâmica.
Outra questão a salientar é o facto de de que uma ligação entre agentes ser bidireccional.
Independentemente de quem tomou a iniciativa de a estabelecer, uma vez funcional, ela
permite o envio de mensagens nos dois sentidos.
Um agente pode terminar uma ligação mediante o predicado agent_disconnect/1, a quem
basta passar a informação de qual o canal utilizado pela ligação que se quer terminar.
Uma vez estabelecida uma ligação entre dois agentes, estes podem trocar mensagens. Para
enviar uma mensagem, é utilizado o predicado agent_send/2, cujos parâmetros são o canal
da ligação a utilizar e o conteúdo da mensagem propriamente dita.
Quando essa mensagem é recebida pelo agente de destino, o Agent Toolkit executa as acções
seguintes:
1. Faz o assert do facto agent_incoming/4 contendo os seguinte parâmetros: um inteiro
gerado sequencialmente, o conteúdo da mensagem, o canal por onde entrou, e um 4º
parâmetro não utilizado na presente versão do LPA.
2. Gera um evento incoming_msg para alertar o agente de destino da chegada da mensagem.
O handler do evento incoming_msg deve invocar o facto agent_incoming respectivo e fazer
passar o conteúdo da mensagem (uma string) pelo filtro do predicado agUtil_msg2term/3
para a converter para um termo que possa ser passado a um interpretador de mensagens
apropriado. Após ter invocado esse interpretador, é usual descartar o facto agent_incoming,
fazendo o seu retract.
António Silva.
Outubro de 2004
Download

Texto de apoio à Comunicação entre Agentes usando o LPA Prolog