1ª Prova - 28 de Janeiro de 2000
Considere o caso de um Agente para representar um comprador por comérico electrónico. Que características deveria ter esse agente para que o utilizador pudesse confiar nele? Sugira as funcionalidades que desponibilazaria num agente que desenvolvesse para o efeito.
Um leilão caracteriza-se por:
Pretende-se desenvolver um sistema baseado em agentes inteligentes que modelize a actividade descrita com a condicionante do processo decorrer num ambiente distribuído e em que as transacções se realizam recorrendo à internet.
Diagrama:

Estrutura da informação (opcional):
Registos |
|
Nome |
Campos |
licitador |
licitador_nome % átomo endereço % átomo classificação % bom,mau,indefinido |
leilão |
produto_nome % átomo base_licitação % número valor_arremate % número licitacões % [licitação] |
licitação |
licitador_nome % átomo valor_licitação % número válida % válida/inválida |
conta |
cliente_nome % átomo
saldo % número
movimentos % [{átomo,valor,data}]
ocorrências % [átomo]
|
inf_banco |
banco_nome % átomo cliente_nome % átomo |
- envia_para_todos_licitadores(Mensagem) à ok
- valida_licitação(Licitação) à ok | erro
- insere_licitação(Leilão,Licitacao) à ok
- procura_melhor_licitação(Leilão) à Valor
implemente o processo descrito numa linguagem de programação à sua escolha.
| Entidades | Relações | Informação inicial |
| Leiloeiro | Licitador, de quem recebe licitações e lhe envia os valores das licitações aceites no leilão e a quem envia informação de actualização das licitações. | Produto, nomeadamente a base de licitação |
| Licitador | Leiloeiro, a quem envia licitações e de quem recebe a resposta da licitacao e a actualização dos valores das licitações aceites no leilão. | Valor máximo a licitar |


loop(Fase) ->
case Fase of
licitacao ->
receive
{msg_licitacao,Licitacao} ->
processa_licitacao(Licitacao),
loop(licitacao)
after ?TEMPO_ESPERA_LICITACAO ->
loop({arremate,1}
end;
{arremate,X} when X=<3 ->
Msg={msg_arremate,X},
envia_para_todos_licitadores(Msg),
receive
{msg_licitacao,Licitacao} ->
case processa_licitacao(Licitacao) of
ok ->
loop(licitacao);
error ->
loop({arremate,X})
end
after ?TEMPO_ESPERA_ARREMATE ->
loop({arremate,X+1}
end;
{arremate,4} ->
Valor_arremate=procura_melhor_licitacao(),
Msg={msg_arremate_final,Valor_arremate},
envia_para_todos_licitadores(Msg)
end.
processa_licitacao(Licitacao) ->
case valida_licitacao(Licitacao) of
erro ->
Msg={msg_inf,Licitacao,invalida},
envia_para_licitador(Licitacao#record_licitacao.licitador_nome,Msg),
erro;
ok ->
insere_licitacao(Licitacao),
Msg={msg_inf,Licitacao},
envia_para_todos_licitadores(Msg),
ok
end.
Nota: Como simplificação do problema, parte-se do princípio que não ocorrem continuamente mensagens inválidas (no que respeita ao valor de licitação). Se assim não fosse, o processamento de timeout's não deveria ser processada assim mas através de timer's, que disparam mensagens específicas pelo que o sistema não seria afectado por mensagens inválidas.
Última actualização: 19-01-2001