Janeiro de 2000
- Um agente individual que age por conta de alguém (por exemplo, para pesquisar informação na Internet ou para comprar um produto para um dado utilizador;
- Agentes que integram um Sistema Multi-Agente desenvolvido para uma dada finalidade (controlo de tráfego aéreo, planeamento da produção).
Que diferenças se colocam ao nível dos requisitos de desenvolvimento dos agentes de cada um desses tipos?
Considere-se uma bolsa de valores mobiliários tradicional e as
actividades de transacção de títulos mobiliários que aí decorrem.
A bolsa de valores mobiliários (vulgo bolsa) é responsável pela identificação dos
títulos bem como pela autorização de transacção dos títulos. Os títulos são
transaccionados por profissionais específicos, denominados corretores, que dispõem de
carteira profissional emitida e identificável pela bolsa.
Estes servem de intermediários entre a bolsa e os potenciais clientes que por sua vez
emitem intenções de compra e venda de títulos. Um cliente pode ser comprador e vendedor
e na sua ordem de transacção especifica para além da intenção, o título, quantidade
a transaccionar e o valor a que deseja efectuar a transacção. A intenção de
transacção diz sempre respeito à sessão que decorre, ou à próxima se não decorre
nenhuma. O corretor emite a intenção de transacção à bolsa, sendo esta efectuada se o
título atingir o valor especificado e se existir oferta em quantidade suficiente em
bolsa. As intenções de compra vão sendo satisfeitas considerando a hora de registo em
que foi realizada.
É comum o corretor ser ou estar directamente relacionado com um banco, que é
responsável pela guarda de títulos e através do qual a transacção financeira é
executada (transacção do valor de compra ou venda de títulos que será creditado ou
debitado ao cliente).
Deseja-se implementar um sistema baseado em agentes inteligentes e cooperativos que modelize as actividades descritas.
Símbolos e Regras usados na estrutura:
- [Valor]: lista (variável) de valores. É considerado um único argumento;
- {Valor}: conjunto (fixo) de valores. É considerado um único argumento;
- , (vírgula): separador de valores nas listas e conjuntos;
- BD: Base de Dados contendo registos de vários tipos (ver a seguir);
- --conteudo--> : mensagem entre entidades com conteúdo;
- O receptor da mensagem sabe quem a enviou, pelo que não é necessário especificar no conteúdo da mensagem;
- Booleano: verdadeiro/falso; correto/incorreto; sucesso/insucesso.
Base de dados |
||
Registos |
Comandos |
|
Nome |
Campos |
insere(Registo,Valor_registo) -> ok,já_existe altera(Registo,Valor_registo) -> ok,indefinido apaga(Registo,Valor_chave) -> ok,indefinido pergunta(Registo,Valor_chave) -> (ver p/ cada registo) |
entidade |
Entidade_nome % átomo Endereço % átomo [Actividade] % [átomo] |
pergunta(entidade,Actividade) -> [Entidade] |
corretor |
Corretor_nome % átomo Nº Carteira Profissional(NCP) % átomo |
pergunta(corretor,Denominação) -> NCP |
intenção |
Compra/Venda % compra,venda Título_nome % átomo Corretor_nome % átomo Cliente_nome % átomo Quantidade % número Valor % número Hora_registo % hh:mm:ss |
pergunta(intenção,Título) -> [Intenção] |
título |
Título_nome % átomo Quantidade % número |
pergunta(título,Denominação) -> Quantidade |
conta |
Cliente_nome % átomo Saldo % número |
pergunta(titular,Titular) -> Saldo |
conta_banco |
Banco_nome % átomo Cliente_nome % átomo |
(não disponível) |
Mensagens transaccionadas entre entidades:
- {quem_faz,Actividade}
- {quem_faz_resp,[Entidade]}
- {onde_está,Entidade_nome}
- {onde_está_resp,Endereço}
- {contacto,Cliente_nome}
- {contacto_resp,NCP}
- {autorizado,{Corretor,NCP}}
- {autorizado_resp,{Corretor,NCP},Booleano}
- {intenção_1,Compra/Venda,{Título_nome,Quantidade,Valor,Conta_banco}}
- {intenção_1_resp,Compra/Venda,{Título_nome,Quantidade,Valor,Conta_banco},Booleano}
- {intenção_2,Compra/Venda,{Cliente_nome,Título_nome,Quantidade,Valor}}
- {intenção_2_resp,Compra/Venda,{Cliente_nome,Título_nome,Quantidade,Valor},Booleano}
- {conta_banco,Conta_Banco}
- {conta_banco_resp,Conta_Banco,Booleano}
bolsa_titulo_liquidez(Titulo_nome) à Liquidez (número) bolsa_titulo_valor(Titulo_nome) à Preço (valor actual de Titulo) bolsa_titulo_valores(Título_nome) à {Valor_mínimo,Valor_máximo} bolsa_titulos() à [Titulo] cliente_titulo_saldo(Titulo_nome) à Saldo (saldo entre ganhos e perdas com Titulo_nome) cliente_intencoes(Cliente_nome) -> [Intenção] titulo_variacao({Min,Max},Valor) -> Variação (número)
Entidades | Relações |
Bolsa | Corretor: as transacções em bolsa são efectuadas por corretores, que
devem ser devidadmente identificados e autorizados pela entidade "bolsa"; Cliente: a bolsa identifica e autoriza os corretores perante o cliente; Banco: as transacções mobiliárias implicam transacções financeiras, pelo que a bolsa deve dispor de conta bancária através da qual serão efectuadas. |
Corretor | Bolsa: (já descrito); Banco: as transacções financeiras em bolsa devem realizadas através duma conta em banco; Cliente: o corretor é contratado pelo cliente para efectuar transacções em bolsa. |
Cliente | Corretor: (já descrito); Bolsa: (já descrito); Banco: O cliente tem uma conta num banco através da qual será efectuada a transacção financeira com a bolsa (via corretor). |
Banco | Bolsa: (já descrito); Cliente: (já descrito); Corretor: (já descrito). |
sugestoes(Cliente_nome) -> Intencoes=cliente_intencoes(Cliente_nome), Titulos=[X#record_intencao.titulo_nome||X<-Intencoes], % pode ter repetidos Escolhas=escolhe(Titulos,[]).escolhe([],Escolhas) -> Escolhas; escolhe([Titulo|Titulos],Escolhas) -> Titulo_saldo=cliente_titulo_saldo(Titulo), Mais_escolhas=if Titulo_saldo > 0 -> testa_semelhancas(Titulo) true -> [] end, Titulos_sem_repetidos=[X||X<-Titulos,lists:member(Titulo,Titulos)==false],Escolhas_novas=lists:append(Escolhas,Mais_escolhas), escolhe(Titulos_sem_repetidos,Escolhas_novas).testa_semelhancas(Titulo) -> Liquidez=bolsa_titulo_liquidez(Titulo), {Min,Max}=bolsa_titulo_valores(Titulo), Valor=bolsa_titulo_valor(Titulo), Variação=titulo_variacao({Min,Max},Valor),Titulos=bolsa_titulos(), compara_com_titulos(Liquidez,Variação,Titulos,[]).compara_com_titulos(Liquidez,Variação,[],Semelhantes) -> Semelhantes; compara_com_titulos(Liquidez,Variação,[Titulo|Titulos],Semelhantes) -> Liquidez_outro=bolsa_titulo_liquidez(Titulo), {Min_outro,Max_outro}=bolsa_titulo_valores(Titulo), Valor_outro=bolsa_titulo_valor(Titulo), Variação_outro=titulo_variação({Min_outro,Max_outro},Valor_outro),case compara_caracteristicas(Liquidez,Liquidez_outro,Variação,Variação_outro) of semelhante -> compara_com_titulos(Liquidez,Variação,Titulos,[Titulo|Semelhantes]); distinto -> compara_com_titulos(Liquidez,Variação,Titulos,Semelhantes) end.compara_caracteristicas(Lq1,Lq2,Var1,Var2) -> Percent_Lq=Lq1*0.1, Percent_Var=Var1*0.1, Dif_Lq=abs(Lq1-Lq2), Dif_Var=abs(Var1-Var2) if Dif_Lq=<Percent_Lq, Dif_Var=<Percent_Var -> semelhante; true -> distinto end.
Última actualização: 19-01-2001