implementación de un sma de negociación basado en...

106
Implementación de un SMA de negociación basado en subastas electrónicas Estudiante: Rodolfo de Benito Arango Ingeniería en Informática Consultor: David Isern Alarcón Junio 2009

Upload: lamcong

Post on 09-Oct-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

Implementación de un SMA de negociación basado en subastas electrónicas Estudiante: Rodolfo de Benito Arango Ingeniería en Informática Consultor: David Isern Alarcón Junio 2009

-2/106-

Agradecimientos A mi hijo Carlos por aceptar que su padre siempre estuviera estudiando. A mi mujer Ana por ayudarme a seguir, a pesar de las dificultades. A ambos por sacrificar tantos fines de semana. A mis padres por su apoyo y ánimos. Al resto de mi familia por su comprensión. A mi consultor David Isern Alarcón, por sus consejos, orientaciones y aliento. A la Universitat Oberta de Catalunya por darme la oportunidad de completar mis estudios y por su estupendo modelo de enseñanza-aprendizaje.

-3/106-

Índice de contenidos Capítulo1.­Introducción......................................................................................................... 61.1.JustificacióndelPFCycontextoenelquesedesarrolla...................................................61.2.ObjetivosdelPFC ...........................................................................................................................81.2.1.Objetivosgeneralesyalcance.............................................................................................................. 81.2.2.Objetivosespecíficos .............................................................................................................................11

1.3.Planificacióndetrabajo............................................................................................................ 121.3.1.Divisióndeltrabajoentareasyestimacióndetiempos ........................................................121.3.2.Identificacióndehitos ..........................................................................................................................141.3.3.Planificacióntemporal..........................................................................................................................15

Capítulo2.­Especificaciónderequisitos ........................................................................ 172.1.Conceptosprincipalesdelsistema ....................................................................................... 172.1.1.Tiposdesubastas....................................................................................................................................172.1.2.Agentes........................................................................................................................................................172.1.3.Estrategiasdenegociación .................................................................................................................192.1.4.Historialdetransacciones ..................................................................................................................202.1.5.Problemasasolventarenelsistema ..............................................................................................20

2.2.Diagramadecasosdeuso........................................................................................................ 212.3.Descripcióntextualdecasosdeuso..................................................................................... 212.3.1.Registrarsubasta ....................................................................................................................................222.3.2.Determinarganador ..............................................................................................................................222.3.3.Bajarprecio ...............................................................................................................................................222.3.4.Crearcompra ............................................................................................................................................232.3.5.Pujar .............................................................................................................................................................232.3.6.Localizarsubasta ....................................................................................................................................23

Capítulo3.­EspecificacióndelSMA .................................................................................. 243.1.Modeloderoles ........................................................................................................................... 243.2.Modelodeentorno ..................................................................................................................... 263.3.Modelodetareas......................................................................................................................... 283.4.Modelodeontologías ................................................................................................................ 293.5.Modelodecoordinación........................................................................................................... 303.5.1.NegociaciónsubastadoringlesayComprador...........................................................................303.5.2.NegociaciónsubastadorholandesayComprador ....................................................................303.5.3.Suscripcióncompradorysubastador ............................................................................................313.5.4.Búsquedadesubastas.Comprador‐Buscador‐Casadesubastas...................................32

Capítulo4.­Implementación............................................................................................... 344.1.Diagramadeclases .................................................................................................................... 344.2.Implementacióndelosagentes ............................................................................................. 354.3.Comunicaciónentreagentes................................................................................................... 354.4.Implementacióndeloscomportamientos(behaviours) .............................................. 364.4.1.Comportamientosdesubastadores ................................................................................................364.4.2.Comportamientosdecompradores ................................................................................................374.4.3.Comportamientosqueinicianunapetición ................................................................................374.4.4.Comportamientosquerespondenaunapetición ....................................................................38

4.5.Implementacióndelasestrategias....................................................................................... 384.5.1.Interfacesutilizadosenlasestrategias .........................................................................................384.5.2.ClasesqueimplementanelinterfaceICfgApuesta ...................................................................38

-4/106-

4.5.3.ClasesqueimplementanelinterfaceICfgSubasta ....................................................................384.6.Clasesdeinformaciónmanejadaenlasubasta................................................................ 384.7.Estructuradepaquetes............................................................................................................. 394.8.Libreríasutilizadas .................................................................................................................... 404.9.Distribuciónfinal........................................................................................................................ 40

Capítulo5.­Ejecución ............................................................................................................ 415.1.EjecucióndelSMA....................................................................................................................... 415.2.Testdeejecución ........................................................................................................................ 415.2.1.Muestradeflujodemensajeseneltestdelasubastainglesa.............................................445.2.2.Muestradeintercambiodemensajesdenegociaciónentresubastadorycompradoreseneltestdelasubastainglesa .........................................................................................455.2.3.Muestradeflujodemensajeseneltestdelasubastaholandesa ......................................465.2.4.Muestradeintercambiodemensajesdenegociaciónentresubastadorycompradoreseneltestdelasubastaholandesa...................................................................................475.2.5.MuestrademensajesentreelagenteSubastador,elagenteDFyelagenteCasaSubastas.........................................................................................................................................................485.2.6.Rondasypujasobtenidaseneltestdelasubastainglesa ....................................................495.2.7.Rondasypujasobtenidaseneltestdelasubastaholandesa .............................................49

5.3.Sistemadelogging...................................................................................................................... 50Capítulo6.­Conclusionesypropuestasdemejora...................................................... 51

AnexoA.ClasesJavaimplementadas ................................................................................ 55ClaseAgenteBase ................................................................................................................................................55ClaseAgenteCasaSubastas ..............................................................................................................................57ClaseAgenteSubastador...................................................................................................................................64ClaseAgenteBuscador.......................................................................................................................................67ClaseAgenteComprador ..................................................................................................................................68ClaseSubastadorBehaviour............................................................................................................................72ClaseSubastadorHolandesaBehaviour......................................................................................................73ClaseSubastadorInglesaBehaviour.............................................................................................................76ClaseCompradorInglesaIncrementalBehaviour ...................................................................................79ClaseCompradorHolandesaNRondasBehaviour...................................................................................82ClaseCompradorHolandesaIncrementoDinamicoBehaviour .........................................................84ClaseBuscadorBehaviourInitiator ..............................................................................................................87ClaseCompradorSuscribirBehaviourInitiator .......................................................................................90ClaseSubastadorTransaccionesBehaviourInitiator ............................................................................91ClaseBuscadorBehaviourResponder.........................................................................................................92ClaseCasaSubastasBusquedasBehaviourResponder..........................................................................93ClaseSubastadorSuscribirBehaviourResponder ..................................................................................94ClaseCasaSubastasTransaccionesBehaviourResponder...................................................................96ClaseICfgApuesta ..............................................................................................................................................97ClaseICfgSubasta ................................................................................................................................................98ClaseIncrementalCfgImpl ...............................................................................................................................98ClaseApuestaUnicaNRondasCfgImpl.........................................................................................................99ClaseApuestaUnicaIncrementoDinamicoCfgImpl.............................................................................101ClaseSubastaHolandesaImpl......................................................................................................................103ClaseSubastaInglesaImpl.............................................................................................................................103ClaseSubasta .....................................................................................................................................................104ClaseTransacción ............................................................................................................................................106

-5/106-

Índice de figuras

Figura 1. Remote Agent Management de JADE.................................................................... 9Figura 2. Sniffer de JADE mostrando el flujo de mensajes entre 3 agentes.......................... 9Figura 3. Instrospector de JADE mostrando los mensajes recibidos por un agente y el

comportamiento que está ejecutando ........................................................................... 10Figura 4. Log Manager de JADE ........................................................................................ 10Figura 5. Diagrama de Gantt de las tareas del proyecto...................................................... 16Figura 6. Diagrama de casos de uso .................................................................................... 21Figura 7. Diagrama de modelo de roles ............................... ¡Error!Marcador no definido.Figura 8. Diagrama de actividad subasta inglesa ................................................................ 28Figura 9. Diagrama de actividad subasta holandesa............................................................ 28Figura 10. Diagrama de conceptos ...................................................................................... 29Figura 11. Diagrama de secuencia del protocolo de interacción de la subasta inglesa ...... 30Figura 12. Diagrama de secuencia del protocolo de interacción de la subasta holandesa .. 31Figura 13. Diagrama de secuencia del protocolo de suscripción mantenido entre Comprador

y Subastador ................................................................................................................. 31Figura 14. Diagrama de secuencia del protocolo FIPA-Brokering ..................................... 32Figura 15. Diagrama de secuencia del protocolo FIPA-Query que actúa como subprotocolo

en el proceso de búsqueda de una subasta.................................................................... 33Figura 16. Diagrama de clases del SMA............................................................................. 34Figura 17. FIPA Contract Net Interaction Protocol ............................................................ 37Figura 18. Estructura de paquetes utilizada en el desarrollo del SMA ............................... 39Figura 19. Intercambio de mensajes en subasta inglesa...................................................... 44Figura 20. Intercambio de mensajes en subasta holandesa ................................................. 46

-6/106-

Capítulo 1. - Introducción 1.1. Justificación del PFC y contexto en el que se desarrolla El proyecto pertenece al ámbito de la Inteligencia Artificial y, más concretamente, al ámbito de los Sistemas Multiagente o SMA. Entendiendo como SMA [1]: "Un conjunto de agentes autónomos inteligentes que se comunican para resolver un problema de manera conjunta. Cuando los componentes de este tipo de sistemas quieren cooperar en la resolución del problema, se habla de un conjunto de agentes colaborativos.". En cuanto a los agentes que integran un SMA, hay muchas definiciones al respecto. La FIPA [2] (Foundation for Intelligent Physical Agents) los define de la siguiente manera: "Un agente es una entidad de software encapsulado con su propio estado, conducta, hilo de control y la habilidad para interactuar y comunicarse con otras entidades (gente, otros agentes o sistemas legados)”. Los agentes se definen como [3]: “...hardware o (más usualmente) sistema de computación que posea las siguientes propiedades: - autonomía: opera sin intervención directa de los humanos u otros programas, y tiene algún tipo de control sobre sus acciones o estado interno; - habilidad social: interactúan con otros agentes a través de un lenguaje de comunicación; - reactividad: perciben su entorno (mundo físico, usuario a través de interfaz gráfica, agentes, Internet) y responden a cambios que ocurren en él; - pro-actividad: exhiben comportamiento dirigido por objetivos, tomando la iniciativa.” El campo de actuación de los SMA comprende, entre otros [4]:

• Flujos de trabajo y gestión de procesos de negocio. Como por ejemplo el SMA utilizado por SCA Packaging para explorar diferentes estrategias encaminadas a reducir los niveles de stocks sin comprometer los tiempos de reparto, que consigue reducir los niveles de stock en almacén un 35%.

• Reputación y confianza. Aportan nuevas técnicas para expresar el razonamiento sobre la reputación y la confianza a nivel individual y social para posibilitar la interacción en entornos abiertos y dinámicos.

• Creación y gestión de Organizaciones Virtuales en Grid computing. En lo que se refiere la gestión y desarrollo de procedimientos y métodos para la automatización de creación de Organizaciones Virtuales (VOs), gestión y disolución.

-7/106-

• Coordinación y reubicación de recursos. En la gestión autónoma y coordinada de recursos distribuidos.

• Negociación. Aportando estrategias y protocolos que establecen reglas de negociación así como los propios mecanismos de negociación. Determinando qué algoritmo de negociación es el más adecuado bajo determinadas circunstancias.

• Aprendizaje y optimización. Aplicado por ejemplo al campo de la logística en sistemas de optimización de transporte basados en coste, como es el caso de Adaptive Transportation Networks cuyos agentes negocian utilizando un protocolo similar al utilizado en las subastas.

• Trazabilidad. Aportando mecanismos para la conocer la traza de cómo se ha logrado alcanzar determinado resultado identificando los servicios que lo han producido.

El presente proyecto se centra en el ámbito del comercio electrónico en la modalidad de agentes de subasta (auction bots) [5]: "Agents that can run, and participate in, online auctions for goods." Lo que se pretende es lograr es llevar a cabo todo el proceso de negociación de las subastas sin intervención humana, por medio de sus agentes representantes. De tal manera que un vendedor parametrice la subasta a realizar (tipo de subasta, precio mínimo, tiempo de subasta, etc.) y genere un agente vendedor que lo representará en la subasta. Por otra parte, los compradores generarán sus agentes parametrizados acorde al objeto de la subasta y a la estrategia a seguir en la misma. A partir de ahí se produce la interacción "automática" entre agentes compradores y vendedores de la subasta, según sus modelos de comportamiento y estrategias de negociación, hasta el momento en que ésta concluya. Al finalizar, los agentes tanto compradores como vendedores informarán de los resultados e iniciarán los procesos necesarios tras la adjudicación del producto de la subasta, en caso de que esta adjudicación se produzca. En cuanto a los modelos de subasta, los contemplados en el sistema corresponden a la tipología de subastas abiertas y más concretamente a las subastas al alza (inglesa) y las subastas a la baja (holandesa). En el Capítulo 2 se explican en que consisten cada una de ellas. En este campo de los sistemas multiagente de subastas existen bastantes estudios sobre todo en el contexto de la subasta doble continua o CDA y se han utilizado algunos de ellos [6, 7, 8] como fuente para obtener información sobre las estrategias de negociación de los agentes "tipo". En cuanto a la justificación del proyecto, en gran parte se debe al interés del estudiante de obtener una visión práctica del funcionamiento de los SMA y adquirir una experiencia básica en la implementación de estos sistemas utilizando Java.

-8/106-

1.2. Objetivos del PFC

1.2.1.ObjetivosgeneralesyalcanceEl objetivo general del proyecto es adquirir una experiencia en el modelado e implementación de sistemas multiagente (SMA) de negociación. Más concretamente, la negociación se realizará en un entorno de subastas electrónica. En un principio, el modelado de la especificación se pensó realizarla con IDK [9] (INGENIAS Development Kit) pero se descartó debido fundamentalmente a problemas de tiempo para hacer una especificación tan detallada como exige el IDK, hecho ya previsto por el consultor del proyecto. Motivo por el cual se buscó una metodología menos exigente pero que a la vez reflejara claramente los requisitos y modelara el SMA a alto nivel. La metodología que más se adapta a estas necesidades está definida en el artículo "Una Aproximación Metodológica para la Construcción de Modelos de simulación Basados en el Paradigma Multi-Agente" [10] y, en líneas generales, ha sido la que se ha seguido en este proyecto. El entorno de desarrollo del proyecto se realizará en Eclipse y la ejecución del SMA se llevará a cabo con JADE [11,12] (Java Agent Development Framework) un entorno de desarrollo y ejecución de agentes basado en Java, que cumple la especificación FIPA, y que simplifica la implementación de aplicaciones distribuidas. JADE proporciona:

• Un API Java para desarrollar los agentes. • Un contenedor o entorno de ejecución en el que "viven" los agentes (similar al

concepto de contenedor EJB en J2EE). • Un conjunto de herramientas gráficas gestión y depuración de agentes, entre los que

se encuentran: o RMA o Remote Agent Management. Desde él se pueden iniciar el resto de

herramientas gráficas y gestionar los agentes.

-9/106-

Figura 1. Remote Agent Management de JADE

o Snnifer para capturar el flujo de mensajes entre los agentes.

Figura 2. Sniffer de JADE mostrando el flujo de mensajes entre 3 agentes

-10/106-

o Instrospector para acceder a la cola de mensajes enviados y recibidos por un agente y a los comportamientos que está ejecutando.

Figura 3. Instrospector de JADE mostrando los mensajes recibidos por un agente y el comportamiento que

está ejecutando

o JADE Log Manager para ver los logs que se producen en la ejecución del SMA.

Figura 4. Log Manager de JADE

-11/106-

El alcance del proyecto se centra en la capa de negocio y no incluye un entorno gráfico para el interfaz del usuario ni persistencia de datos. Como futura mejora del proyecto se podría realizar un interfaz del usuario Web y utilizar una solución de persistencia como por ejemplo Hibernate [13] o iBatis [14]. De tal manera que combinara J2EE con el entorno de ejecución de JADE.

1.2.2.ObjetivosespecíficosLos objetivos específicos del proyecto consisten en:

• Modelar la especificación de un SMA utilizando la metodología definida en "Una Aproximación Metodológica para la Construcción de Modelos de simulación Basados en el Paradigma Multi-Agente" [15]

• Utilizar JADE como entorno de ejecución y comunicación de un SMA. • Implementar las clases de test que comprueben el funcionamiento de los agentes y

del SMA. • Implementar las clases de los agentes y de sus comportamientos con el fin de lograr

un SMA de subastas virtuales con agentes compradores y vendedores capaces de negociar en base a diferentes estrategias.

-12/106-

1.3. Planificación de trabajo

1.3.1.DivisióndeltrabajoentareasyestimacióndetiemposSe ha optado por una división Top-Down de las tareas necesarias para satisfacer los objetivos señalados anteriormente. En la Tabla 1.1 se recogen la división de estructuras del trabajo y sus duraciones estimadas. T01 Definicióndelplandetrabajo 5díasElaboracióndelplandetrabajodelproyectoT01.1 Recogidadedocumentaciónbásica Obtencióndedocumentaciónnecesariapara

iniciarelestudiodelproyecto.FuenteprincipalInternet

2días

T01.2 Propósitodelproyecto Propósitoydefinicióndelproyecto 1díaT01.3 Objetivos Definicióndelosobjetivosgeneralesy

específicos1día

T01.4 Planificación DescomposicióndeltrabajoentareassiguiendounametodologíaWBSyplanificacióntemporaldelasmismas.

1día

T02 DocumentaciónderequisitosdelSMA 7díasEspecificarlosrequisitosdelSMAmodelandoloscasosdeusoenundiagramageneralyobteniendounadescripcióntextualdeloscasosdeuso,conelpropósitodeidentificarquédebehacerelsistema,cómoycuándo.Asícomounaintroduccióndelosconceptosprincipalesdelsistema.T02.1 Conceptosprincipalesdelsistema Protocolosdesubastas,agentes,estrategiasde

negociación,elhistorialdetransaccionesyprevisióndeproblemasasolventaenelsistema.

2días

T02.2 Diagramadecasosdeuso Diagramageneraldecasosdeusoqueservirádebaseparaidentificarlosrequisitosfuncionalesdelsistema.

1días

T02.3 Descripcióntextualdecasosdeuso Descripcióntextualdeloscasosdeusoidentificadoseneldiagramadecasosdeuso.Serviránparaidentificarlosagentesdelsistema,sustareasylainteracciónentreellos.

4días

T03 EspecificacióndelSMA27días

UnavezconocidoslosrequisitosdelsistemarealizaráunaespecificacióndelSMAbasándoseenlaMetodologíadescritaenelApartado1.2.1.T03.1 Modeloderoles Identificalosrolesopapelesdelosagentes

tomandocomobaseeldiagramadecasosdeuso.

5días

T03.2 Modelodeentorno Describeaquelloscomponentesdelsistemaquenosonagentesperoqueintervienendeunauotraformaenlosprocesosquellevanacabolosagentes.

5días

-13/106-

T03.3 Modelodetareas Detallaelfuncionamientodecadarolmedianteladescomposicióndelastareasensecuenciasdeactividadesysurepresentaciónenundiagramadeactividad.

4días

T03.4 Modeloderazonamientoyaprendizaje Englobalascreencias,objetivos,capacidadesydecisionesdecadarolylasrelacionaconlasactividadesquedebeefectuar.Serepresentagráficamentemediantediagramasdeflujo.

9días

T03.5 Modelodeontología Representarlosconceptosdelaontología(estructuraysignificadodelosconceptosprincipalesdelsistema)ysusrelacionesmedianteundiagramadeclasesUML.

2días

T03.6 Modelodecoordinación UtilizalosdiagramasdesecuenciasUMLpararepresentarlasinteraccionesentrelosrolesylasetapasquelascomponen.

2días

T04 ImplementaciónSMA34días

ImplementaciónenJADEdelSMAsegúnlasespecificacionesdelatareaT03.T04.1 Creardespliegue Definirlaconfiguracióndedesplieguequeserá

utilizadaparalanzarlosagentes. 3díasT04.2 ImplementarclasesdelSMA Crearlasclasesnecesariasparael

funcionamientodelSMA.25días

T04.3 Refinarelcódigo. IntegrarelcódigoIDKconlasclasesdelatareaT04yrefinarelcódigoparaquefuncionecorrectamente. 6días

T05 Redacciónmemoriadelproyecto31días

RedaccióndelamemoriadelproyectoT05.1 DocumentarrequisitosSMA RedactarlosrequisitosdelSMAenbaseal

trabajoobtenidoenlatareaT02.5días

T05.2 DocumentarespecificaciónSMA RedactarlaespecificacióndelSMAenbasealtrabajoobtenidoenlatareaT03.

7días

T05.3 DocumentarimplementacióndelSMA RedactarlaimplementacióndelSMAenbasealtrabajoobtenidoenlatareaT04.

7días

T05.4 Conclusiones,mejoras,referenciasybibliografía

Completarlamemoriaañadiendolasconclusiones,lasmejorasposibles,lasreferenciasylabibliografía.

7días

T05.5 Revisiones Realizarlasmodificacionesnecesariasenlamemoriaenbasealasindicacionesdelconsultor.

5días

-14/106-

T06 Test20días

ElaboracióndelosjuegosdepruebasnecesariosparaprobarelcorrectofuncionamientosdelosagentesydelSMAimplementado.T06.1 Testdeagentes Crearunjuegodepruebasqueverifiqueel

funcionamientodelosagentestipoqueintervienenenelSMA.

10días

T06.2 TestSMA CrearunjuegodepruebasqueverifiqueelfuncionamientodelSMA.

10días

T07 Elaborarpresentaciónvirtual10días

ElaboracióndeunapresentaciónPowerPointquesinteticeyexpongaeltrabajorealizadoenelproyecto.

T08 Revisiones20días

RevisionesfinalesdelSMAobtenido,delamemoriaydelapresentación.

Tabla 1.1. División del trabajo y duración estimada.

1.3.2.Identificacióndehitos

• PEC 1: entrega Planificación en fecha 8/3/2009. • PEC 2: entrega Requisitos y Especificación del SMA en fecha 12/4/2009.

• PEC 3: entrega Implementación del SMA en fecha 17/5/2009. • Entrega final: implementación del SMA, memoria y presentación en fecha

19/6/2009.

-15/106-

1.3.3.Planificacióntemporal En la Tabla 1.2 se muestra la planificación temporal de las tareas con su duración, fechas de comienzo y fechas de fin. En la Figura 1 se muestra el diagrama de Gantt correspondiente a la planificación.

Tabla 1.2. Planificación temporal tareas.

-16/106-

Figura 5. Diagrama de Gantt de las tareas del proyecto.

-17/106-

Capítulo 2. - Especificación de requisitos En este Capítulo se introducen los conceptos principales del núcleo central del SMA y se especifican los requisitos del SMA modelando los casos de uso en un diagrama general y realizando una descripción textual de los casos de uso más relevantes, con el propósito de identificar las funcionalidades principales del sistema y sus actores. Originalmente, el proyecto no consideraba más agentes que los que directamente intervienen en los procesos de negociación de las subastas, es decir, Agente Subastador y Agente Comprador. Tras la lectura de "A Trustworthy Agent Based Online Auction System" [15] se vio la necesidad de incorporar un agente Casa de subastas y agente Buscador, más adelante se detalla el rol de cada uno de ellos, además de adoptarse un diseño similar para conseguir que el sistema sea abierto a la extensión en cuanto a estrategias de compra se refiere.

2.1. Conceptos principales del sistema

2.1.1.TiposdesubastasLos tipos de subasta que podrá elegir el vendedor corresponden a la tipología de subastas abiertas y más concretamente a las siguientes [16,17]:

• Subasta al alza. Pretende fomentar la competencia de los posibles compradores de tal modo que el vendedor establece un precio de salida bajo. Este precio se va incrementando con las sucesivas pujas de modo que se adjudica el objeto de la subasta al participante que haya realizado la puja más alta durante el tiempo de vida de la subasta. El vendedor puede fijar un precio mínimo de tal modo que si al finalizar la subasta la puja máxima no es mayor o igual que el precio mínimo entonces no se producirá la venta o adjudicación. Es la subasta clásica, también conocida como subasta inglesa.

• Subasta a la baja. El vendedor fija un precio de salida alto y sucesivamente lo

baja hasta que aparece un comprador que acepta el precio momento en el cual se le adjudica el objeto de la subasta. Normalmente el vendedor fija un precio de reserva de tal modo que ese precio será el mínimo al que puede llegar el objeto subastado. También se conoce como subasta holandesa.

Nota: en un principio se consideraron las subastas a segundo precio o Vickrey pero se descartaron para no aumentar la complejidad del proyecto.

2.1.2.AgentesEn la concepción inicial de este proyecto se consideraron dos agentes con los roles de vendedor o subastador y de comprador. A medida que el proyecto evoluciona se ve la necesidad de crear nuevos tipos de agentes como es el caso de un agente Casa de subastas que registra las subastas activas y los movimientos del historial de transacciones, entre otras cosas, así como de un agente Buscador que localice las subastas activas que subasten un bien determinado de interés para el usuario.

-18/106-

El sistema trabajará con los tipos de agentes siguiente:

• Agente casa de subastas. Puesto en funcionamiento por el sistema, tiene las responsabilidades siguientes:

o Mantener la lista de subastas activas y de bienes subastados. o Crear la subastas y el agente subastador cuando se da de alta una nueva en el

sistema. o Obtener la lista de subastas activa.

o Obtener la lista de bienes que se subastan. Para acotar el problema se considera que no puede haber dos subastas activas que subasten el mismo bien.

o Cerrar la subasta cuando concluye.

o Responder al agente buscador sobre la búsqueda de una subasta concreta. o Registrar en el historial las transacciones que se produzcan a consecuencia

de la interacción entre agentes compradores y vendedores. o Realizar los test de funcionamiento del SMA de subastas.

• Agente subastador. Son puestos en funcionamiento por el agente Casa de subastas y configurados previamente con:

o El artículo a vender. o El tipo de subasta a realizar: inglesa, holandesa.

o El precio de salida. o El precio de reserva.

o La fecha de finalización de la subasta. Una vez liberado en el sistema, el agente comprador hará las gestiones necesarias para responder a los mensajes de los compradores, notificar los cambios de precios a los agentes involucrados en la subasta, reducir los precios en caso de la subasta holandesa, determinar el ganador, notificar el ganador y notificar la finalización de la subasta al agente Casa de subastas.

• Agente buscador. Actúa de intermediario entre el usuario el agente Casa de subastas para localizar las subastas activas que subasten un bien por el que el usuario está dispuesto a pujar.

• Agente comprador. Puesto en funcionamiento por el agente Casa de subastas y configurado con:

o El artículo que se pretende comprar.

o La puja a realizar. o El precio de reserva (la puja máxima a la puede llegar el agente).

o La estrategia a seguir (se detallan en el apartado Estrategias de negociación)

-19/106-

El agente comprador está vinculado a la subasta establecida en su configuración inicial y se mantendrá en la misma realizando las pujas que considere el agente en base a sus estrategias de negociación y al tipo de subasta.

2.1.3.Estrategiasdenegociación

Las estrategias de negociación [6] determinarán el comportamiento de los agentes en la subasta y serán parametrizadas al crear el agente aunque podrían modificarse dinámicamente según el conocimiento del entorno, lo que permitiría, por ejemplo, que en la subasta inglesa no todos los compradores pujen de la misma forma. Las estrategias seguidas por los agentes y los resultados a los que llevan éstas podrán contrastarse ya que el sistema guardará un historial de transacciones de las subastas.

En general, la estrategia del pujador determinará cuánto debe pujar y cuándo hacerlo. Para ello, el sistema contemplará las estrategias siguientes:

• Incremental. Estrategia del comprador de la subasta inglesa en la que el agente puja a intervalos regulares incrementando la puja en una cantidad preestablecida al crear el agente. Se puede optar por una de estas dos formas de incrementar la puja:

o Nueva puja = puja anterior + incremento.

o Nueva puja = puja anterior * incremento. • Apuesta única n rondas. Estrategia del comprador de la subasta holandesa en la

que al principio el agente considera pujar en la subasta por el precio configurado en su atributo Puja. Si en el transcurso de la subasta se supera el número de rondas configurado en la estrategia entonces el valor de aceptación de la puja será el de su precio de reserva.

• Apuesta única n rondas incremento dinámico. Estrategia del comprador de la subasta holandesa en la que en principio el agente considera pujar en la subasta por el precio configurado en su atributo Puja. Si se supera el número de rondas preestablecido en la estrategia entonces incrementará el valor de aceptación de la puja en una cantidad fija siempre y cuando no llegue al precio de reserva.

Por otra parte, se pretende que el SMA a implementar pertenezca abierto a la extensión en el sentido de que sea sencillo implementar nuevas estrategias y configurarlas para que sean utilizadas por los agentes compradores. Por ejemplo, para que en lugar de ser estrategias estáticas, como las comentadas anteriormente, sean dinámicas y reactivas al comportamiento de otros pujadores o al historial de transacciones. Además, en la subasta holandesa podría resultar interesante incluir adaptaciones de estrategias propias de agentes de subastas dobles continuas [7, 8] como por ejemplo la de los Agentes Kaplan, Agentes Zero-Intelligente Plus (ZIP) o Agentes GD.

-20/106-

2.1.4.HistorialdetransaccionesEl sistema guardará un registro de las transacciones que tienen lugar en las subastas, almacenando información referente al identificador de la subasta, identificador del agente que realizó la transacción, el tipo de transacción, el precio (de puja o de venta) y la fecha. El propósito de este historial es doble, por una parte puede utilizarse como fuente de datos para realizar un estudio sobre el comportamiento de los tipos de agentes en las subastas. Por otra parte puede utilizarse como base de conocimiento para que los agentes compradores y vendedores puedan adaptar su estrategia de negociación.

2.1.5.Problemasasolventarenelsistema

En una valoración previa de las cuestiones que deben resolverse en la implementación de este SMA de subastas se pueden identificar los siguientes:

• El sistema de suscripciones a las subastas y notificaciones de cambios de precios. Puede solventarse empleando el patrón Observador, de modo que los compradores se suscriben a las subastas de los vendedores y estos podrán notificar eventos de la subasta a todos sus subscriptores.

• Pujas simultáneas en la subasta inglesa. Se produce cuando más de un comprador realiza una puja simultáneamente. Puede tomarse como un problema de concurrencia de productor-consumidor, siendo el productor el vendedor y el consumidor el comprador. Se solventa utilizando una cola thread safe para procesar los mensajes de puja que reciba el vendedor, aunque esta funcionalidad ya está incorporada en el propio JADE y por tanto no es necesario implementarla de el sistema.

• Colisiones en ofertas realizadas por los compradores en la subasta holandesa. Se produce cuando más de un comprador oferta el mismo precio. Se puede resolver con el mismo sistema que el caso de las pujas simultaneas en la subasta inglesa. Otra solución que puede adoptarse es utilizar un contador de colisiones, establecer un máximo de colisiones permitidas y repetir la subasta hasta que el contador llegue al máximo en cuyo caso se daría como ganador aleatoriamente a una de las pujas ganadoras.

-21/106-

2.2. Diagrama de casos de uso En la Figura 6. Diagrama de casos de uso, se identifica el actor Agente CasaDesSubastas que se encarga de poner en marcha los casos de uso Revistar subasta y Crear compra que desencadenan todo el proceso de una subasta. También figuran los agentes Comprador y Subastador y una especialización de este último, el Agente Subastador holandesa que pone en marcha el caso de uso bajar precio (caso particular de este tipo de subastas). Así como el agente Buscador encargado de localizar una subasta en base a un criterio.

Figura 6. Diagrama de casos de uso

2.3. Descripción textual de casos de uso En la descripción textual siguiente solo se tendrán en cuenta los casos de uso que no están incluidos en otros puesto que su descripción textual no aporta nada a la documentación de requisitos aunque es importante que figuren en el diagrama de casos de uso para ofrecer una visión de las implicaciones de los casos de uso "principales" (puestos en marcha directamente por un actor).

-22/106-

2.3.1.RegistrarsubastaCaso de uso Registrar subasta Actores Agente CasaDeSubastas

Precondición La subasta no está registrada en el sistema

Poscondición La subasta está registrada en el sistema y hay un agente subastador encargado de la venta objeto de la subasta.

Descripción 1. El Agente CasaDeSubastas crea un Agente Subastador encargado de la subasta. 2. Registra el bien subastado en la lista de bienes subastados. 3. Registra la subasta en la lista de subastas activas:

• El identificador de la subasta • La fecha de inicio de la subasta • El identificador del agente subastador • El objeto a subastar • El tipo de subasta a realizar: inglesa, holandesa. • El precio de salida • El precio de venta de reserva

Flujo alternativo

2.3.2.DeterminarganadorCaso de uso Determinar ganador Actores Agente Subastador Precondición Hay un Agente Subastador encargado de la subasta y, o bien, la subasta es inglesa y ha

finalizado, o bien, la subasta es holandesa y hay uno o más compradores que ofertan el precio establecido por el Agente Subastador.

Poscondición La subasta cierra

Descripción 1. El Agente Subastador comprueba que la puja actual es la ganadora. 2. El Agente Subastador notifica al Agente CasaDeSubastas y a los agentes compradores del resultado de la subasta. 3. El Agente Subastador da por cerrada la subasta y se lo notifica a al Agente CasaDeSubastas.

Flujo alternativo

2.3.3.BajarprecioCaso de uso Bajar precio Actores Agente Subastador Precondición El tipo de subasta es holandesa y no ha finalizado

Poscondición El precio del bien subastado se ha reducido Descripción 1. El Agente Subastador determina en base a su estrategia que es necesario bajar el

precio. 2. Calcula el nuevo precio de la subasta. 3. Notifica el nuevo precio al Agente CasaDeSubastas y a los agentes vendedores suscritos en la subasta.

Flujo alternativo

-23/106-

2.3.4.CrearcompraCaso de uso Crear compra Actores Agente CasaDeSubastas Precondición Hay una subasta en curso de interés para el comprador

Poscondición Se crea un agente comprador suscrito a la subasta Descripción 1. Crea un agente Comprador asignándole una estrategia parametrizada de la forma

siguiente. Para la subasta inglesa:

• La forma de incrementar la puja. • El incremento. • La puja inicial • La puja máxima o reserva.

Para la subasta Holandesa: • El incremento • El precio aceptable inicial • El precio aceptable máximo o reserva. • El número de ronda máximo para incrementar el precio aceptable

2. Le asigna una subasta concreta.

Flujo alternativo

2.3.5.PujarCaso de uso Pujar Actores Agente comprador

Precondición El agente Comprador está suscrito a una subasta. Poscondición Una nueva puja del agente comprador es notificada al Agente Subastador

Descripción 1. El agente comprador determina realizar una puja y el importe de la misma según la estrategia seguida por el agente Comprador. 2. El agente Comprador envía un mensaje al Agente Subastador notificando la puja. 3. El Agente Subastador procesa la puja. 4. El Agente Subastador verifica que la puja es correcta y la notifica al Agente CasaDeSubastas y al resto de compradores.

Flujo alternativo 4a. Si la subasta ha finalizado entonces caso de uso Determinar ganador.

2.3.6.LocalizarsubastaCaso de uso Localizar subasta Actores Agente Buscador

Precondición Poscondición

Descripción 1. El usuario indica el objeto de subasta que le interesa localizar. 2. El agente Buscador envía un mensaje al Agente CasaDeSubastas con la búsqueda a realizar. 3. El Agente CasaDeSubastas envía un mensaje al Agente Buscador con el resultado de la búsqueda. 4. El Agente Buscador informa textualmente al usuario del resultado de la búsqueda.

Flujo alternativo

-24/106-

Capítulo 3. - Especificación del SMA 3.1. Modelo de roles En este modelo se identificación los roles o papeles de los agentes tomando como base el diagrama de casos de uso.

En la Figura 7, se pueden ver los roles de los agentes contemplados en el sistema. El agente CasaDeSubastas está relacionado con 0 o más agentes Subastadores Cada agente Comprador dispone de un agente Buscador el cual solicita al agente CasaDeSubastas la lista de subastas actuales o aquellas en las que se subasta un bien determinado. La relación de uso entre Agente Subastador y Agente Comprador representa la negociación entre ambos que se produce en la subasta. También se puede ver la relación de especialización del agente Subastador Holandesa respecto al agente Subastador.

Complementando al diagrama anterior, se describe a alto nivel y en formato tabular el papel que desempeña cada tipo de agente en cuanto a sus objetivos, responsabilidades principales, capacidades e información que requiere para cumplir sus objetivos. Rol Agente Buscador Objetivos Localizar las subastas activas según criterio de búsqueda

Responsabilidades Enviar mensajes de búsqueda de subastas al Agente CasaDeSubastas Notificar las subastas encontradas al usuario

Capacidades Buscar subastas

Información requerida • El "objeto" o bien que quiere localizarse en subasta

-25/106-

Rol Agente CasaDeSubastas Objetivos Llevar un control de todas las subastas del sistema

Responsabilidades • Crear los agentes subastadores • Crear los agentes compradores • Registrar las subastas en el sistema • Notificar la subasta activa de un bien determinado • Eliminar al agente subastador cuando concluya una subasta • Actualizar el Historial de transacciones

Capacidades Creación de agentes y gestión de las subastas

Información requerida • Los parámetros de configuración de la subasta. • Los parámetros de configuración de los agentes compradores • Los parámetros de configuración de los agentes subastadores • Las datos de la transacción a registrar.

Rol Agente Subastador Objetivos Vender el objeto de la subasta con el mayor beneficio posible respetando el

precio de reserva. Responsabilidades • Determinar el ganador.

• Notificar ganador. • Notificar nueva oferta a los suscriptores (subasta inglesa)

Capacidades Vender un producto mediante subasta electrónica.

Información requerida • Los parámetros de configuración de la subasta. • Las ofertas de compra (pujas) de los vendedores.

Rol Agente Subastador Holandesa Objetivos Vender el objeto de la subasta con el mayor beneficio posible respetando el

precio de reserva Responsabilidades Las mismas que las del Agente Subastador y además la estrategia a seguir a la

hora de determinar: • Cuando ofertar el objeto de la subasta a un precio más reducido. • La disminución de precio.

Capacidades Vender un producto mediante subasta electrónica. Información requerida • Los parámetros de configuración de la subasta (igual que en Agente

Subastador) • Las ofertas de compra (pujas) de los vendedores.

Rol Agente Comprador Objetivos Comprar el objeto de la subasta al menor precio posible sin superar el precio de

reserva. Responsabilidades Efectuar las pujas según el tipo de subasta y la estrategia elegida por el

comprador. Capacidades Comprar productos en una subasta electrónica.

Información requerida • Los parámetros de configuración del agente. • El tipo de subasta. • El precio de venta actual. • La estrategia a seguir

-26/106-

3.2. Modelo de entorno El modelo del entorno describe aquellos componentes del sistema que no son agentes pero que intervienen de una u otra forma en los procesos que llevan a cabo los agentes. Se puede entender como la relación a nivel de flujo de información que se produce entre los agentes y el entorno, identificando las entradas de datos, procesos que se llevan a cabo y las salidas generadas. Componente Precio de compra aceptable (subasta holandesa) Entradas Dato Emisor(es)

• El número de rondas actuales de la subasta • El número de rondas máximo para el

comprador • El precio de compra aceptable actual • El precio de compra de reserva • El incremento de precio de compra por

ronda

• Comprador • Subastador

Procesos En las subastas holandesas el comprador recalculará el precio de compra aceptable según su estrategia. Para la estrategia Apuesta única n rondas: SI numero rondas actual >= número de rondas máximo para el comprador ENTONCES Precio de compra aceptable=Precio de compra de reserva FIN SI Para la estrategia Apuesta única incremento dinámico: SI numero rondas actual >= número de rondas máximo para el comprador ENTONCES SI precio de compra aceptable + incremento > precio de compra de reserva ENTONCES No se modifica el precio de compra aceptable SI NO Precio de compra aceptable=precio de compra aceptable anterior + incremento FIN SI FIN SI Salidas Dato Receptor(es) El precio de compra aceptable Comprador

-27/106-

Componente Oferta de compra subasta inglesa Entradas Dato Emisor(es)

• La puja actual • El precio de reserva • El incremento • La forma de incrementar la puja

• Comprador • Subastador

Procesos En la subasta inglesa el comprador determinará si puja o no en una ronda y el valor de la puja en base a su estrategia. Para la estrategia incremental: MIENTRAS (puja<puja actual) SI (tipo de incremento es sumar) ENTONCES puja = puja + incremento SI NO puja = puja * incremento FIN SI FIN MIENTRAS Salidas Dato Receptor(es) La puja de un comprador en una ronda de una subasta

Comprador Subastador

Componente Oferta de venta subasta holandesa Entradas Dato Emisor(es)

• El precio de venta actual • El precio de venta de reserva • El decremento

• Subastador

Procesos En la subasta holandesa el subastador determinará el nuevo precio de venta ofertado si no hay ofertas de compra en una ronda. nuevo precio de venta = precio de venta actual - decremento SI (nuevo precio de venta>=precio de venta de reserva) ENTONCES precio de venta actual = nuevo precio de venta SI NO terminar subasta FIN SI Salidas Dato Receptor(es) La oferta de venta del subastador holandesa Subastador

-28/106-

3.3. Modelo de tareas Detalle del funcionamiento de cada rol mediante la descomposición de las tareas en secuencias de actividades y su representación en un diagrama de actividad. En este modelo se contemplan los diagramas siguientes:

Figura 7. Diagrama de actividad subasta inglesa

Figura 8. Diagrama de actividad subasta holandesa

-29/106-

3.4. Modelo de ontologías El modelo emplea como representación gráfica un diagrama muy similar al diagrama de clases de UML para representar los conceptos de la ontología (estructura y significado de los conceptos principales del sistema) y sus relaciones.

Figura 9. Diagrama de conceptos

-30/106-

3.5. Modelo de coordinación Este modelo utiliza los diagramas de secuencias UML para representar las interacciones entre los roles y las etapas que las componen. En estos diagramas se muestra el flujo de mensajes, y el tipo de los mismos, entre los roles.

3.5.1.NegociaciónsubastadoringlesayCompradorEl proceso de negociación de la subasta inglesa entre subastador y comprador se coordina según protocolo de interacción FIPA English Auction Interaction Protocol [18] donde Initiator corresponde al rol de Subastador y Participant al rol de Comprador.

Figura 10. Diagrama de secuencia del protocolo de interacción de la subasta inglesa

3.5.2.NegociaciónsubastadorholandesayCompradorEl proceso de negociación de la subasta holandesa entre subastador y comprador se coordina según protocolo de interacción FIPA Dutch Auction Interaction Protocol [19] donde Initiator corresponde al rol de Subastador y Participant al rol de Comprador.

-31/106-

Figura 11. Diagrama de secuencia del protocolo de interacción de la subasta holandesa

3.5.3.SuscripcióncompradorysubastadorEl proceso de suscripción a una subasta por parte del comprador se coordina según protocolo de interacción FIPA Subscribe Interaction Protocol [20] donde Initiator corresponde al rol de Comprador y Participant al rol de Subastador.

Figura 12. Diagrama de secuencia del protocolo de suscripción mantenido entre Comprador y Subastador

-32/106-

3.5.4.Búsquedadesubastas.Comprador‐Buscador‐CasadesubastasEl proceso de búsqueda de una subasta por parte del comprador utilizando los servicios de un agente buscador que consulta al agente Casa de subastas se coordina según protocolo de interacción FIPA Brokering Interaction Protocol [21] donde Initiator corresponde al rol de Comprador y Broker al rol de Buscador.

Figura 13. Diagrama de secuencia del protocolo FIPA-Brokering

El subprotocolo utilizado para interrogar al agente Casa de subastas es el FIPA Query Interaction Protocol [22], donde Initiator es el agente Buscador y Participant es el agente Casa de subastas.

-33/106-

Figura 14. Diagrama de secuencia del protocolo FIPA-Query que actúa como subprotocolo en el proceso de búsqueda de una subasta

Capítulo 4. - Implementación La implementación del SMA se ha realizado en un ordenador con sistema operativo Mac OS X versión 10.5 y el entorno de desarrollo utilizado ha sido Eclipse 3.3.2.

4.1. Diagrama de clases Las clases necesarias para implementar el SMA de subastas son las que se muestran en la figura siguiente. Todas ellas incluyen comentarios tipo JavaDoc así como comentarios de línea. En el Anexo 1 se muestra el código Java de todas las clases utilizadas.

Figura 15. Diagrama de clases del SMA

-35/106-

4.2. Implementación de los agentes

Los agentes del sistema extienden una clase base llamada AgenteBase que implementa métodos de uso común para los agentes y que a su vez extiende la clase jade.core.Agent. Concretamente un método para registrar al agente en las "páginas amarillas" (DF Services) de modo que sea fácilmente localizable y otro método para quitarlo de dicho registro.

Los agentes que extienden AgenteBase son:

• AgenteBuscador • AgenteCasaSubastas • AgenteComprador • AgenteSubastador

Los mencionados agentes implementan el rol especificado en el punto 3.1. Modelo de roles.

4.3. Comunicación entre agentes La comunicación entre los agentes se realizará acorde al Lenguaje de Comunicación de Agentes (ACL) recogido en el protocolo FIPA-ACL [23]. Un mensaje FIPA-ACL, además de los datos de emisor (sender), receptor (receiver), protocolo (protocol) y otros datos de cabecera, adjunta el tipo de acción comunicativa según se puede ver en la tabla adjunta [24].

Accióncomunicativa

(Performative) Significado

accept‐proposal Aceptarunapropuestarecibidapreviamente

agree Estardeacuerdoenrealizaralgunaacción

cancel Cancelaralgunaacciónpedidapreviamente

cfp Solicitarpropuestaspararealizarunaaccióndada

confirm Informaraunreceptorqueunaproposiciónescierta

disconfirm Informaraunreceptorqueunaproposiciónesfalsa

failure Informaraotroagentequeseintentóunaacciónperofalló

inform Informaraunreceptorqueunaproposiciónescierta

inform‐if Sielagentequerecibelaaccióncreequelasentenciaesverdaderainformarádemaneraafirmativa,sinoindicaráqueesfalsa.

inform‐ref Permitequeelemisorinformealreceptordeunobjetoquecreequecorrespondeaundescriptor,comopuedeserunnombreuotradescripciónqueloidentifique.

not‐understood Informaraunreceptorqueelemisornoentendióelmensaje

propagate Elreceptortrataelmensajecomosifuesedirigidodirectamenteaél,ydebeidentificar

-36/106-

losagentesenestedescriptoryenviarleselmensajeaellos

propose Enviarunapropuestapararealizarunaciertaacción

proxy Elreceptordebeseleccionaragentesobjetivodenotadosporunadescripcióndada,yenviarlesunmensajeembebido

query‐if Preguntarleaotroagentesiunadeterminadaproposiciónescierta

query‐ref Preguntaraotroagenteporelobjetoreferenciadoenunaexpresión

refuse Rechazarrealizarunaacción

reject‐proposal Rechazarunapropuestaduranteunanegociación

request Solicitaraunreceptorquerealicealgunaacción

request‐when Solicitaralreceptorquerealicealgunaaccióncuandounaproposicióndadaseacierta

request‐whenever Solicitaralreceptorquerealicealgunaaccióncadavezqueunaproposicióndadaseacierta

subscribe Una intención persistente de notificar al emisor de un determinado valor, y volver anotificarlecadavezquedichovalorcambie

En el apartado siguiente, Implementación de los comportamientos (behaviours) se indica el tipo de acciones comunicativas que utilizarán los agentes a implementar en el sistema.

4.4. Implementación de los comportamientos (behaviours)

4.4.1.ComportamientosdesubastadoresLos comportamientos de los subastadores se han realizado adaptando el FIPA Contract Net Interaction Protocol [25] al protocolo de la subasta inglesa y holandesa. Encapsulan las estrategias de cada tipo de subasta: inglesa y holandesa. Las clases correspondientes a los subastadores: SubastadorHolandesaBehaviour y SubastadorInglesaBehaviour extienden la clase base SubastadorBehaviour que a su vez extiende la clase jade.proto.ContractNetInitiator. SubastadorBehaviour contiene los métodos comunes a los comportamientos de los subastadores:

• registrarTransacción. Envía un mensaje al agente CasaSubastas para que registre la transacción.

• getCasaSubastas. Obtiene el identificador del agente CasaSubastas registrado en las páginas amarillas.

-37/106-

Figura 16. FIPA Contract Net Interaction Protocol

4.4.2.ComportamientosdecompradoresLos comportamientos de los compradores también obedecen a una adaptación del FIPA Contract Net Interaction Protocol. Los comportamientos de los compradores encapsulan las estrategias utilizadas por los compradores y ya comentadas en el apartado 2.1.3: CompradorInglesaIncrementalBehaviour, CompradorHolandesaNRondasBehaviour y CompradorHolandesaIncrementoDinamicoBehaviour; extienden la clase jade.proto. SSIteratedContractNetResponder.

4.4.3.ComportamientosqueinicianunapeticiónEstos comportamientos extienden la clase jade.proto.AchieveREInitiator que implementa los protocolos de estilo FIPA Request:

• BuscadorBehaviourInitiator. El agente Buscador realiza al agente CasaSubastas una petición de búsqueda de una subasta en base al nombre del objeto subastado.

• CompradorSuscribirBehaviourInitiator. El agente Comprador realiza una petición de suscripción a un comprador para que le suscriba en una subasta.

• SubastadorTransaccionesBehaviourInitiator. El agente Subastador realiza una petición al agente CasaSubastas para que registre una transacción.

-38/106-

4.4.4.ComportamientosquerespondenaunapeticiónEstos comportamientos extienden la clase jade.proto.AchieveREResponder:

• BuscadorBehaviourResponder. Devuelve al agente Comprador el resultado de la búsqueda de la subasta.

• CasaSubastasBusquedasBehaviourResponder. Devuelve al agente Buscador el resultado de la búsqueda de la subasta.

• SubastadorSuscribirBehaviourResponder. Suscribe al agente Comprador a la subasta indicada en la petición correspondiente del comprador.

• CasaSubastasTransaccionesBehaviourResponder. Registra la transacción contenida en la petición realizada por el agente Subastador.

4.5. Implementación de las estrategias

4.5.1.InterfacesutilizadosenlasestrategiasSe define el interface ICfgApuesta que deben implementar las estrategias de los compradores e ICfgSubasta para las estrategias de los subastadores.

4.5.2.ClasesqueimplementanelinterfaceICfgApuestaEncapsulan los datos necesarios para la estrategia de los compradores. Son las siguientes, ya comentadas en el apartado 2.1.3:

• IncrementalCfgImpl • ApuestaUnicaNRondasCfgImpl • ApuestaUnicaIncrementoDinamicoCfgImpl

4.5.3.ClasesqueimplementanelinterfaceICfgSubastaEncapsulan los datos necesarios para la estrategia de los subastadores. Son las siguientes:

• SubastaHolandesaImpl • SubastaInglesaImpl

4.6. Clases de información manejada en la subasta Se utilizan las clases Subasta que contiene todos los datos necesarios para realizar la subasta y la clase Transacción que se utilizará para el registro del historial de transacciones.

-39/106-

4.7. Estructura de paquetes Las clases implementadas se estructuran dentro del paquete uoc.sma. En la figura siguiente puede verse la estructura de paquetes utilizada con el fin de organizar todas las clases del sistema según sean de tipo agente, comportamiento, etc..

Figura 17. Estructura de paquetes utilizada en el desarrollo del SMA

-40/106-

4.8. Librerías utilizadas Las librería utilizadas en la implementación corresponden a:

• El Java Runtime Environment 1.5.0 • El entorno de ejecución JADE 3.6.1:

o http.jar o iiop.jar o jade.jar o jadeTools.jar o commons-codec-1.3.jar

4.9. Distribución final La distribución de la aplicación está almacenada en una carpeta llamada SUBASTAS dentro de la cual se encuentran las carpetas siguientes:

• Carpeta src: contiene los paquetes y clases creadas en el proyecto.

• Carpeta bin: contiene todas las clases del SMA en el archivo smasubastas.jar (incluyendo archivos fuente) así como las librerías de JADE.

• Carpeta doc: contiene el JAVADOC de la aplicación.

-41/106-

Capítulo 5. - Ejecución 5.1. Ejecución del SMA La ejecución del SMA se realiza desde la clase IniciarSMA empaquetada en el archivo el archivo smasubastas.jar junto con el resto de clases del sistema multiagente. Esta clase realiza las acciones siguientes:

• Obtiene una referencia al entorno de ejecución de JADE • Crea un contenedor JADE • Crea un agente de tipo AgenteCasaSubastas

Para ejecutar el SMA desde la línea de comandos hay que abrir la carpeta SUBASTAS\BIN y poner el comando:

java -jar smasubastas.jar Hay que tener en cuenta que las clases utilizadas se han compilado con la versión 1.5 de Java.

5.2. Test de ejecución Puesto que el sistema de subastas se ocupa de la capa de negocio y no dispone de interfaz de usuario, en la clase AgenteCasaSubastas se han implementado métodos para probar el funcionamiento del SMA. Estos métodos ya se ejecutan directamente al iniciar la aplicación.

• testSubastas. Se lanza al crearse el AgenteCasaSubastas (método setup). Crea 2 subastas (y por tanto 2 agentes compradores), las añade al sistema e invoca la ejecución de los métodos que crean agentes compradores para la subasta inglesa y para la subasta holandesa. La primera subasta comienza transcurrido 1 minuto desde la ejecución de la clase IniciarSMA. La segunda subasta comienza 2 minutos después.

• testCrearCompradoresInglesa. Crea 3 agentes compradores y los suscribe a una subasta inglesa.

• testCrearCompradoresHolandesa. Crea 3 agentes compradores y los suscribe a una subasta holandesa.

Por otra parte, para comprobar el comportamiento del agente Buscador, el agente Comprador, al iniciarse (método setup), solicita la búsqueda de una subasta al agente Buscador. La realización de otros test podría realizarse solo con modificar la clase AgenteCasaSubastas en lo que atañe a los tres métodos citados anterioemente.

-42/106-

El resultado de la ejecución del test es el siguiente: imac‐de‐rodolfo‐de‐benito:binrodolfo$java‐jarsmasubastas.jar16‐jun‐200916:27:42jade.core.RuntimebeginContainerINFO:‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ThisisJADEsnapshot‐revision$WCREV$of$WCDATE$downloadedinOpenSource,underLGPLrestrictions,athttp://jade.tilab.com/‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐16‐jun‐200916:27:43jade.core.BaseServiceinitINFO:Servicejade.core.management.AgentManagementinitialized16‐jun‐200916:27:43jade.core.BaseServiceinitINFO:Servicejade.core.messaging.Messaginginitialized16‐jun‐200916:27:43jade.core.BaseServiceinitINFO:Servicejade.core.mobility.AgentMobilityinitialized16‐jun‐200916:27:43jade.core.BaseServiceinitINFO:Servicejade.core.event.Notificationinitialized16‐jun‐200916:27:43jade.core.messaging.MessagingServiceclearCachedSliceINFO:Clearingcache16‐jun‐200916:27:43jade.mtp.http.HTTPServer<init>INFO:HTTP‐MTPUsingXMLparsercom.sun.org.apache.xerces.internal.parsers.SAXParser16‐jun‐200916:27:43jade.core.messaging.MessagingServicebootINFO:MTPaddresses:http://192.168.0.195:7778/acc16‐jun‐200916:27:43jade.core.AgentContainerImpljoinPlatformINFO:‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐AgentcontainerMain‐Container@imac‐de‐rodolfo‐de‐benito.localisready.‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐16‐jun‐200916:27:43uoc.sma.agentes.AgenteCasaSubastastestSubastasINFO:ElagentedecasadesubastascreaelagenteBuscador16‐jun‐200916:27:43uoc.sma.agentes.AgenteComprador$1actionINFO:Agentebuscador:subastalocalizadaSubastaId:1iMac25Precio:2.25Inicio:TueJun1616:28:43CEST200916‐jun‐200916:27:43uoc.sma.agentes.AgenteComprador$1actionINFO:Agentebuscador:subastalocalizadaSubastaId:1iMac25Precio:2.25Inicio:TueJun1616:28:43CEST200916‐jun‐200916:27:43uoc.sma.agentes.AgenteComprador$1actionINFO:Agentebuscador:subastalocalizadaSubastaId:1iMac25Precio:2.25Inicio:TueJun1616:28:43CEST200916‐jun‐200916:27:43uoc.sma.agentes.AgenteComprador$1actionINFO:Agentebuscador:subastalocalizadaSubastaId:1iMac25Precio:2.25Inicio:TueJun1616:28:43CEST200916‐jun‐200916:27:43uoc.sma.agentes.AgenteComprador$1actionINFO:Agentebuscador:subastalocalizadaSubastaId:1iMac25Precio:2.25Inicio:TueJun1616:28:43CEST200916‐jun‐200916:27:43uoc.sma.agentes.AgenteComprador$1actionINFO:Agentebuscador:subastalocalizadaSubastaId:1iMac25Precio:2.25Inicio:TueJun1616:28:43CEST200916‐jun‐200916:28:43uoc.sma.agentes.AgenteSubastador$1onWakeINFO:Subastador1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE‐SeinicialasubastaSubastaId:1iMac25Precio:2.25Inicio:TueJun1616:28:43CEST200916‐jun‐200916:28:43uoc.sma.behaviours.estrategias.CompradorInglesaIncrementalBehaviourhandleCfpINFO:Comprador2:ENVIA:PROPOSE:5.016‐jun‐200916:28:43uoc.sma.behaviours.estrategias.CompradorInglesaIncrementalBehaviourhandleCfpINFO:Comprador3:ENVIA:PROPOSE:30.016‐jun‐200916:28:43uoc.sma.behaviours.estrategias.CompradorInglesaIncrementalBehaviourhandleCfpINFO:Comprador1:ENVIA:PROPOSE:25.016‐jun‐200916:28:43uoc.sma.behaviours.estrategias.SubastadorInglesaBehaviourhandleAllResponsesINFO:Pujamásaltaenestaronda:30.0prepareResultNotification()methodnotre‐defined16‐jun‐200916:28:43uoc.sma.behaviours.estrategias.CompradorInglesaIncrementalBehaviourhandleCfpINFO:Comprador1:ENVIA:PROPOSE:35.016‐jun‐200916:28:43uoc.sma.behaviours.estrategias.CompradorInglesaIncrementalBehaviourhandleCfpINFO:Comprador2:ENVIA:PROPOSE:40.0prepareResultNotification()methodnotre‐definedprepareResultNotification()methodnotre‐defined16‐jun‐200916:28:43uoc.sma.behaviours.estrategias.SubastadorInglesaBehaviourhandleAllResponsesINFO:Pujamásaltaenestaronda:40.0prepareResultNotification()methodnotre‐defined

-43/106-

prepareResultNotification()methodnotre‐defined16‐jun‐200916:28:43uoc.sma.behaviours.estrategias.CompradorInglesaIncrementalBehaviourhandleCfpINFO:Comprador1:ENVIA:PROPOSE:45.016‐jun‐200916:28:43uoc.sma.behaviours.estrategias.CompradorInglesaIncrementalBehaviourhandleCfpINFO:Comprador3:ENVIA:PROPOSE:90.016‐jun‐200916:28:43uoc.sma.behaviours.estrategias.SubastadorInglesaBehaviourhandleAllResponsesINFO:Pujamásaltaenestaronda:90.0prepareResultNotification()methodnotre‐definedprepareResultNotification()methodnotre‐defined16‐jun‐200916:28:43uoc.sma.behaviours.estrategias.CompradorInglesaIncrementalBehaviourhandleCfpINFO:Comprador1:ENVIA:PROPOSE:95.016‐jun‐200916:28:43uoc.sma.behaviours.estrategias.CompradorInglesaIncrementalBehaviourhandleCfpINFO:Comprador2:ENVIA:PROPOSE:160.016‐jun‐200916:28:43uoc.sma.behaviours.estrategias.SubastadorInglesaBehaviourhandleAllResponsesINFO:Pujamásaltaenestaronda:160.0prepareResultNotification()methodnotre‐definedprepareResultNotification()methodnotre‐defined16‐jun‐200916:28:43uoc.sma.behaviours.estrategias.CompradorInglesaIncrementalBehaviourhandleCfpINFO:Comprador1:ENVIA:PROPOSE:165.016‐jun‐200916:28:43uoc.sma.behaviours.estrategias.SubastadorInglesaBehaviourhandleAllResponsesINFO:Pujamásaltaenestaronda:165.0prepareResultNotification()methodnotre‐defined16‐jun‐200916:28:43uoc.sma.behaviours.estrategias.SubastadorInglesaBehaviourhandleAllResponsesINFO:Pujamásaltaenestaronda:0.016‐jun‐200916:28:43uoc.sma.behaviours.estrategias.SubastadorInglesaBehaviourhandleAllResponsesINFO:Ganadordelasubasta:SubastaId:1iMac25Precio:165.0Inicio:TueJun1616:28:43CEST2009elcompradorComprador1conunapujade165.0prepareResultNotification()methodnotre‐defined16‐jun‐200916:29:43uoc.sma.agentes.AgenteSubastador$1onWakeINFO: Subastador 2@imac‐de‐rodolfo‐de‐benito.local:1099/JADE ‐ Se inicia la subasta Subasta Id:2 Mac Book pro Precio:250.0Inicio:TueJun1616:29:43CEST200916‐jun‐200916:29:43uoc.sma.behaviours.estrategias.SubastadorHolandesaBehaviouronEndINFO:Subastador2@imac‐de‐rodolfo‐de‐benito.local:1099/JADE:Ofertadeventa:235.0prepareResultNotification()methodnotre‐defined16‐jun‐200916:29:43uoc.sma.behaviours.estrategias.SubastadorHolandesaBehaviouronEndINFO:Subastador2@imac‐de‐rodolfo‐de‐benito.local:1099/JADE:Ofertadeventa:220.0prepareResultNotification()methodnotre‐defined16‐jun‐200916:29:43uoc.sma.behaviours.estrategias.SubastadorHolandesaBehaviouronEndINFO:Subastador2@imac‐de‐rodolfo‐de‐benito.local:1099/JADE:Ofertadeventa:205.0prepareResultNotification()methodnotre‐defined16‐jun‐200916:29:43uoc.sma.behaviours.estrategias.SubastadorHolandesaBehaviouronEndINFO:Subastador2@imac‐de‐rodolfo‐de‐benito.local:1099/JADE:Ofertadeventa:190.0prepareResultNotification()methodnotre‐defined16‐jun‐200916:29:43uoc.sma.behaviours.estrategias.SubastadorHolandesaBehaviouronEndINFO:Subastador2@imac‐de‐rodolfo‐de‐benito.local:1099/JADE:Ofertadeventa:175.0prepareResultNotification()methodnotre‐defined16‐jun‐200916:29:43uoc.sma.behaviours.estrategias.SubastadorHolandesaBehaviourhandleAllResponsesINFO:FINDESUBASTA16‐jun‐200916:29:43uoc.sma.behaviours.estrategias.SubastadorHolandesaBehaviourhandleAllResponsesINFO:Ganadordelasubasta:SubastaId:2MacBookproPrecio:175.0Inicio:TueJun1616:29:43CEST2009elcompradorComprador6conunapujade175.0

-44/106-

5.2.1.Muestradeflujodemensajeseneltestdelasubastainglesa

Figura 18. Intercambio de mensajes en subasta inglesa

-45/106-

5.2.2.Muestra de intercambio demensajes de negociación entre subastador ycompradoreseneltestdelasubastainglesaEste extracto de los mensajes intercambiados entre el Subastador1 y los agentes Comprador1, Comprador2 y Comprador 3 corresponde a la primera ronda de la subasta. Se han marcado en negrita el tipo de mensaje e identificado el remitente y destinatario de los mensajes. Se puede ver que hay 3 mensajes de propuesta CFP (Call For Proposal) que el subastador dirige a los compradores con el precio de salida del artículo, 2.25 euros. También se ven los mensajes de respuesta a dichas propuestas (PROPOSE) con la puja propuesta por Comprador1, Comprador2 y Comprador3: 25.0, 5.0 y 30.0, respectivamente. (CFP:sender ( agent‐identifier :name "Subastador 1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE" :addresses (sequencehttp://192.168.0.196:7778/acc)):receiver (set ( agent‐identifier :name Comprador2@imac‐de‐rodolfo‐de‐benito.local:1099/JADE :addresses (sequencehttp://192.168.0.196:7778/acc))):content"2.25":reply‐withR1245001470219_0:reply‐by20090614T174440206Z:conversation‐idC8941849_1245001470219)(CFP:sender ( agent‐identifier :name "Subastador 1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE" :addresses (sequencehttp://192.168.0.196:7778/acc)):receiver (set ( agent‐identifier :name Comprador1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE :addresses (sequencehttp://192.168.0.196:7778/acc))):content"2.25":reply‐withR1245001470220_1:reply‐by20090614T174440206Z:conversation‐idC8941849_1245001470219)(PROPOSE:sender ( agent‐identifier :name Comprador1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE :addresses (sequencehttp://192.168.0.196:7778/acc)):receiver (set ( agent‐identifier :name "Subastador 1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE" :addresses (sequencehttp://192.168.0.196:7778/acc))):content"25.0":reply‐with "Subastador 1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE1245001470230" :in‐reply‐to R1245001470220_1:conversation‐idC8941849_1245001470219)(CFP:sender ( agent‐identifier :name "Subastador 1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE" :addresses (sequencehttp://192.168.0.196:7778/acc)):receiver (set ( agent‐identifier :name Comprador3@imac‐de‐rodolfo‐de‐benito.local:1099/JADE :addresses (sequencehttp://192.168.0.196:7778/acc))):content"2.25":reply‐withR1245001470222_2:reply‐by20090614T174440206Z:conversation‐idC8941849_1245001470219)(PROPOSE:sender ( agent‐identifier :name Comprador2@imac‐de‐rodolfo‐de‐benito.local:1099/JADE :addresses (sequencehttp://192.168.0.196:7778/acc)):receiver (set ( agent‐identifier :name "Subastador 1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE" :addresses (sequencehttp://192.168.0.196:7778/acc))):content"5.0":reply‐with "Subastador 1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE1245001470233" :in‐reply‐to R1245001470219_0:conversation‐idC8941849_1245001470219)(PROPOSE

-46/106-

:sender ( agent‐identifier :name Comprador3@imac‐de‐rodolfo‐de‐benito.local:1099/JADE :addresses (sequencehttp://192.168.0.196:7778/acc)):receiver (set ( agent‐identifier :name "Subastador 1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE" :addresses (sequencehttp://192.168.0.196:7778/acc))):content"30.0":reply‐with "Subastador 1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE1245001470248" :in‐reply‐to R1245001470222_2:conversation‐idC8941849_1245001470219)

5.2.3.Muestradeflujodemensajeseneltestdelasubastaholandesa

Figura 19. Intercambio de mensajes en subasta holandesa

-47/106-

5.2.4.Muestra de intercambio demensajes de negociación entre subastador ycompradoreseneltestdelasubastaholandesaEste extracto de los mensajes intercambiados en la primera ronda de la subasta entre el Subastador2 y los agentes Comprador4, Comprador5 y Comprador 6 corresponde a la primera ronda de la subasta. Se pueden ver los mensajes CFP que envía el subastador a los compradores proponiendo un precio de venta de 250.0. Como contestación a este mensaje todos los compradores rechazan (CFP:sender ( agent‐identifier :name "Subastador 2@imac‐de‐rodolfo‐de‐benito.local:1099/JADE" :addresses (sequencehttp://192.168.0.196:7778/acc)):receiver (set ( agent‐identifier :name Comprador4@imac‐de‐rodolfo‐de‐benito.local:1099/JADE :addresses (sequencehttp://192.168.0.196:7778/acc))):content"250.0":reply‐withR1245004074545_0:reply‐by20090614T182804535Z:conversation‐idC476737_1245004074545)(CFP:sender ( agent‐identifier :name "Subastador 2@imac‐de‐rodolfo‐de‐benito.local:1099/JADE" :addresses (sequencehttp://192.168.0.196:7778/acc)):receiver (set ( agent‐identifier :name Comprador5@imac‐de‐rodolfo‐de‐benito.local:1099/JADE :addresses (sequencehttp://192.168.0.196:7778/acc))):content"250.0":reply‐withR1245004074546_1:reply‐by20090614T182804535Z:conversation‐idC476737_1245004074545)(REFUSE:sender ( agent‐identifier :name Comprador5@imac‐de‐rodolfo‐de‐benito.local:1099/JADE :addresses (sequencehttp://192.168.0.196:7778/acc)):receiver (set ( agent‐identifier :name "Subastador 2@imac‐de‐rodolfo‐de‐benito.local:1099/JADE" :addresses (sequencehttp://192.168.0.196:7778/acc))):reply‐with "Subastador 2@imac‐de‐rodolfo‐de‐benito.local:1099/JADE1245004074552" :in‐reply‐to R1245004074546_1:conversation‐idC476737_1245004074545)(CFP:sender ( agent‐identifier :name "Subastador 2@imac‐de‐rodolfo‐de‐benito.local:1099/JADE" :addresses (sequencehttp://192.168.0.196:7778/acc)):receiver (set ( agent‐identifier :name Comprador6@imac‐de‐rodolfo‐de‐benito.local:1099/JADE :addresses (sequencehttp://192.168.0.196:7778/acc))):content"250.0":reply‐withR1245004074548_2:reply‐by20090614T182804535Z:conversation‐idC476737_1245004074545)(REFUSE:sender ( agent‐identifier :name Comprador4@imac‐de‐rodolfo‐de‐benito.local:1099/JADE :addresses (sequencehttp://192.168.0.196:7778/acc)):receiver (set ( agent‐identifier :name "Subastador 2@imac‐de‐rodolfo‐de‐benito.local:1099/JADE" :addresses (sequencehttp://192.168.0.196:7778/acc))):reply‐with "Subastador 2@imac‐de‐rodolfo‐de‐benito.local:1099/JADE1245004074554" :in‐reply‐to R1245004074545_0:conversation‐idC476737_1245004074545)(REFUSE:sender ( agent‐identifier :name Comprador6@imac‐de‐rodolfo‐de‐benito.local:1099/JADE :addresses (sequencehttp://192.168.0.196:7778/acc)):receiver (set ( agent‐identifier :name "Subastador 2@imac‐de‐rodolfo‐de‐benito.local:1099/JADE" :addresses (sequencehttp://192.168.0.196:7778/acc))):reply‐with "Subastador 2@imac‐de‐rodolfo‐de‐benito.local:1099/JADE1245004074560" :in‐reply‐to R1245004074548_2:conversation‐idC476737_1245004074545)

-48/106-

5.2.5.MuestrademensajesentreelagenteSubastador,elagenteDFyelagenteCasaSubastas En este ejemplo el subastador pide con un mensaje REQUEST al agente DF que localice al agente CasaSubastas. El agente DF le responde con un mensaje INFORM indicando el identificador el agente CasaSubastas. El agente subastador le pide REQUEST al agente CsaSubastas que registre una transacción y este le responde que lo ha realizado (AGREE). (REQUEST:sender ( agent‐identifier :name "Subastador 1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE" :addresses (sequencehttp://192.168.0.196:7778/acc)):receiver (set ( agent‐identifier :name df@imac‐de‐rodolfo‐de‐benito.local:1099/JADE :addresses (sequencehttp://192.168.0.196:7778/acc))):content "((action ( agent‐identifier :name df@imac‐de‐rodolfo‐de‐benito.local:1099/JADE :addresses (sequencehttp://192.168.0.196:7778/acc )) (search (df‐agent‐description :services (set (service‐description :type CasaDeSubastas))) (search‐constraints:max‐results‐1))))":reply‐with "rw‐Subastador 1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE1245001470264‐10" :language fipa‐sl0 :ontology FIPA‐Agent‐Management:protocolfipa‐request:conversation‐id"conv‐Subastador1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE1245001470264‐10")(INFORM:sender(agent‐identifier:namedf@imac‐de‐rodolfo‐de‐benito.local:1099/JADE:addresses(sequencehttp://192.168.0.196:7778/acc)):receiver (set ( agent‐identifier :name "Subastador 1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE" :addresses (sequencehttp://192.168.0.196:7778/acc))):content "((result (action (agent‐identifier :name df@imac‐de‐rodolfo‐de‐benito.local:1099/JADE :addresses (sequencehttp://192.168.0.196:7778/acc)) (search (df‐agent‐description :services (set (service‐description :type CasaDeSubastas))) (search‐constraints :max‐results ‐1))) (sequence (df‐agent‐description :name (agent‐identifier :name Casa‐Subastas@imac‐de‐rodolfo‐de‐benito.local:1099/JADE :addresses (sequence http://192.168.0.196:7778/acc)) :services (set (service‐description :name \"Casa‐Subastas‐Casadesubastas\":typeCasaDeSubastas))))))":reply‐with "Subastador 1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE1245001470271" :in‐reply‐to "rw‐Subastador 1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE1245001470264‐10":languagefipa‐sl0:ontologyFIPA‐Agent‐Management:protocolfipa‐request:conversation‐id"conv‐Subastador1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE1245001470264‐10")(REQUEST:sender ( agent‐identifier :name "Subastador 1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE" :addresses (sequencehttp://192.168.0.196:7778/acc)):receiver (set ( agent‐identifier :name Casa‐Subastas@imac‐de‐rodolfo‐de‐benito.local:1099/JADE :addresses (sequencehttp://192.168.0.196:7778/acc))):contentuoc.sma.datos.Transaccion:reply‐withR1245001470278_0:protocolfipa‐request:conversation‐idC6486835_1245001470278)(AGREE:sender ( agent‐identifier :name Casa‐Subastas@imac‐de‐rodolfo‐de‐benito.local:1099/JADE :addresses (sequencehttp://192.168.0.196:7778/acc)):receiver (set ( agent‐identifier :name "Subastador 1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE" :addresses (sequencehttp://192.168.0.196:7778/acc))):reply‐with "Subastador 1@imac‐de‐rodolfo‐de‐benito.local:1099/JADE1245001470290" :in‐reply‐to R1245001470278_0 :protocolfipa‐request:conversation‐idC6486835_1245001470278)

-49/106-

5.2.6.Rondasypujasobtenidaseneltestdelasubastainglesa La subasta inicial subastaba un artículo con un precio de salida de 2.25. La configuración inicial de los compradores que participaron en ella es la siguiente: Comprador Pujainicial Incremento Tipoincremento Reserva

1 25 10 puja+incremento 1902 5 2 puja*incremento 1953 30 3 puja*incremento 175

Las pujas en cada ronda han sido las siguientes: Ronda Comprador1 Comprador2 Comprador3

1 25 5 302 35 40 903 95 160 ‐4 165 ‐ ‐

Resulta ganador el Comprador 1 con una puja de 165.

5.2.7.Rondasypujasobtenidaseneltestdelasubastaholandesa La subasta inicial subastaba un artículo con un precio de salida de 250. La configuración inicial de los compradores que participaron en ella es la siguiente: Comprador Pujainicial Incremento Estrategia Reserva Rondas

4 100 20 IncrementalDinamico 160 45 120 10 IncrementalDinamico 180 46 140 ‐ NRondas 180 5

Las pujas en cada ronda han sido las siguientes:

Ronda Subastador2 Comprador4 Comprador5 Comprador61 235 ‐ ‐ ‐2 220 ‐ ‐ ‐3 205 ‐ ‐ ‐4 190 ‐ ‐ ‐5 175 ‐ ‐ 175

-50/106-

5.3. Sistema de logging En el proceso de desarrollo de la solución software se ha utilizado el sistema de log propio de JADE, la clase jade.util.Logger. Las clases inicializan el logger en nivel INFO para mostrar solo los mensajes de ese nivel: privatefinalLoggerlogger=Logger.getMyLogger(this.getClass().getName());logger.setLevel(Logger.INFO); Los mensajes de log que se utilizan utilizan dos niveles de detalle: INFO y FINE: logger.log(Logger.INFO,myAgent.getLocalName()+":ENVIA:PROPOSE:"+puja);logger.log(Logger.FINE,myAgent.getName()+":Recibe:ACCEPT"); Si es necesario un mayor detalle en el log para ver el comportamiento del sistema entonces puede establecerse el nivel FINE.

-51/106-

Capítulo 6. - Conclusiones y propuestas de mejora Los Sistemas Multiagente de negociación constituyen una alternativa muy a tener en cuenta en aquellos entornos en los que sea necesario elegir un algoritmo de negociación u estrategia dependiendo de determinadas circunstancias. En este sentido el trabajo realizado en este proyecto no solo se limita a las subastas electrónicas si no que puede servir de base para la resolución de problemas de planificación y optimización de recursos basados en el mejor "precio" o coste que puede ofrecer un agente en la resolución de una tarea concreta. Es importante señalar que el estudiante ha tenido la oportunidad de aplicar los conocimientos adquiridos en este proyecto en su ámbito profesional, proponiendo una solución basada en multiagentes de negociación para resolver un problema de planificación y optimización de recursos en un proyecto de I+D en el ámbito de bioenergía, en el que actualmente trabaja como ingeniero de software. En cuanto a las propuestas de mejora, son las siguientes:

• Integrar el Sistema Multiagente en la capa de negocio de una aplicación J2EE, posibilitando que la utilización del sistema se realice vía Web con un simple navegador en lugar de hacerlo con una aplicación de escritorio o desde una solución software de movilidad.

• Interfaz del usuario: aunque el alcance de este proyecto no incluía el interfaz del usuario, el interfaz del usuario facilitaría la interacción con el software.

• Persistencia de datos: no contemplado en el alcance de este proyecto, utilizar una base de datos relacional es necesario para registrar las subastas y transacciones realizadas.

• Cifrado de mensajes: puesto que los agentes pueden estar distribuidos y el intercambio de mensajes realizarse por redes no seguras como Internet, el cifrado del contenido de los mensajes puede aportar un nivel de seguridad básico al sistema. La implementación del cifrado puede realizarse con las clases del paquete javax.crypto utilizando, por ejemplo, el cifrado simétrico AES.

-52/106-

Bibliografía Aranda Corral (2006). Construcción de un sistema multiagente mediante Jade. Curso:

Agentes Inteligentes. Universidad de Sevilla.

Bellifemine, Caire, Trucco, Rimassa (2007). JADE PROGRAMMER’S GUIDE Bellifemine, Caire, Trucco, Rimassa (2007). JADE v3.6.1 API

Botia (2005). Construcción de Agentes Software con JAVA + JADE. Seminario de Aplicación de los Agentes Software al Ocio y al turismo. Universidad Carlos III de Madrid.

David Sánchez Ruenes. PROTOCOLS I ONTOLOGIES JADE 2.61. GUIA DE PROGRAMACIÓ. Universitat Rovira i Virgili

Foundation for Intelligent Physical Agents (2003). FIPA ACL Message Structure Specification, disponible en Internet (http://www.fipa.org/specs/fipa00061/SC00061G.html)

Ganzha, Paprzycki, Pirvanescu, Badica y Abraham (2001). Jade Based Multi-Agent E-Commerce Environment: Initial Implementation. 6th Int. Symposium SYNASC04, Romania.

García Olaya (2007). Diseño Software de Agentes Inteligentes Autónomos: Tema IV –Estándares para el desarrollo de SMA. Universidad Carlos III de Madrid.

Imbert Paredes (2005). Una Arquitectura Cognitiva Multinivel para Agentes con Comportamiento

Influido por Características Individuales y Emociones, Propias y de Otros Agentes. Tesis doctoral, Facultad de Informática. Universidad Politécnica De Madrid.

Ismail Khalil (2009). Cooperative Systems - UE, disponible en Internet (http://www.tk.uni-linz.ac.at/teaching/)

Jennings, Sycara Y Wooldridge (1998). A Roadmap of Agent Research and Development. Autonomous Agents and Multi-Agent Systems, 1, 7–38 (1998). Kluwer Academic Publishers, Boston.

Llamas Bello (2002). Protocolos de interacción entre agentes (FIPA). Sistemas Multiagente, Cursos de doctorado UVA.

Rinkesh Patel (2006). A Trustworthy Agent Based Online Auction System. CIS Master Project. University of Massachusetts Dartmouth.

Stan Franklin y Art Graesser (1996). Is it an Agent, or just a Program?: A Taxonomy for Autonomous Agents. Third International Workshop on Agent Theories, Architectures, and Languages, Springer-Verlag.

Valladares Pernas (2004). Multi-Agent System for Online Auctions. CIS Master Project. University of Massachusetts Dartmouth.

-53/106-

Referencias bibliográficas [1] Moreno Ribas, Antonio. Agentes y sistemas multiagente. Módulo 2 P05/81007/00776.

UOC [2] FIPA, disponible en Internet (http://www.fipa.org) [3] Wooldridgey Jennings (1995)

[4] Luck M, McBurney P, Shehory O, Willmott S (2005) Agent Technology: Computing as Interaction (A Roadmap for Agent Based Computing). AgentLink. Disponible en Internet (http://www.agentlink.org/roadmap/al3rm.pdf)

[5] Wooldridge, Michael (2002). An Introduction to Multiagent systems. Wiley

[6] Posada, Marta y Lopez, Adolfo (2008). How to Choose the Bidding Strategy in Continuous Double Auctions: Imitation Versus Take-The-Best Heuristics. Journal of Artificial Societies and Social Simulation 11(1)6, disponible en Internet (http://jasss.soc.surrey.ac.uk/11/1/6.html).

[7] Bagnall y Toft. Zero Intelligence Plus and Gjerstad-Dickhaut Agents for Sealed Bid Auctions. Diponible en Internet en (http://citeseer.ist.psu.edu/708332.html)

[8] Posada, Lopez y Hernández (2004). Aprendizaje Evolutivo en la Subasta Doble Continua. Un enfoque Multiagente, disponible en Internet en (http://io.us.es/cio2004/comunicaciones/111-120.pdf)

[9] IDK, disponible en Internet (http://grasia.fdi.ucm.es/main/?q=en/node/127) [10] Moreno, Velásquez, Ovalle. Una Aproximación Metodológica para la Construcción

de Modelos de Simulación Basados en el Paradigma Multi-Agente. Avances en Sistemas e Informática, Vol.4 No. 2, Septiembre de 2007, disponible en Internet en (http://pisis.unalmed.edu.co/avances/archivos/ediciones/Edicion%20Avances%202007%202/16.pdf)

[11] JADE, disponible en Internet (http://jade.tilab.com) [12] Bellifemine, Caire, Greenwood (2007). Developing Multi Agent Systems with JADE.

Wiley [13] Hibernate, disponible en Internet en (https://www.hibernate.org)

[14] iBatis, disponible en Internet en (http://ibatis.apache.org) [15] Patel, Rinkesh (2006). A Trustworthy Agent Based Online Auction System, disponible

en Internet (http://www.cis.umassd.edu/~hxu/Projects/UMD/TrustworthyAuction/Trustworthy-Auction-System.ppt)

[16] Fabra, Natalia (2003). Mecanismos de Subastas, disponible en Internet (http://www.eco.uc3m.es/nfabra/Docencia/Seminarios/Subastas_UMTS.pdf)

[17] Juan Momparler, Mario Hidalgo. Modelos de subastas y su aplicación a los concursos, disponible en Internet (http://www.uv.es/asepuma/XIII/comunica/comunica_58.pdf)

-54/106-

[18] Foundation for Intelligent Physical Agents (2002). FIPA English Auction Interaction Protocol Specification, disponible en Internet en (http://www.fipa.org/specs/fipa00031/index.html)

[19] Foundation for Intelligent Physical Agents (2002). FIPA Dutch Auction Interaction Protocol Specification, disponible en Internet en (http://www.fipa.org/specs/fipa00032/index.html)

[20] Foundation for Intelligent Physical Agents (2002). FIPA Subscribe Interaction Protocol Specification, disponible en Internet en (http://www.fipa.org/specs/fipa00035/SC00035H.html)

[21] Foundation for Intelligent Physical Agents (2002). FIPA Brokering Interaction Protocol Specification, disponible en Internet en (http://www.fipa.org/specs/fipa00033/SC00033H.pdf)

[22] Foundation for Intelligent Physical Agents (2002). FIPA Query Interaction Protocol Specification, disponible en Internet en (http://www.fipa.org/specs/fipa00027/SC00027H.pdf)

[23] Foundation for Intelligent Physical Agents (2002). FIPA ACL Message Structure Specification, disponible en Internet en (http://www.fipa.org/specs/fipa00061/SC00061G.pdf)

[24] Escuela Superior de Ingeniería Informática de la Universidad de Vigo. Programación en JADE - Comunicación, disponible en Internet en (http://programacionjade.wikispaces.com/Comunicación)

[25] Foundation for Intelligent Physical Agents (2002). FIPA ContractNet Interaction Protocol Specification, disponible en Internet en (http://www.fipa.org/specs/fipa00029/SC00029H.pdf)

-55/106-

Anexo A. Clases Java implementadas ClaseAgenteBasepackageuoc.sma.agentes;importjade.core.Agent;importjade.domain.DFService;importjade.domain.FIPAException;importjade.domain.FIPAAgentManagement.DFAgentDescription;importjade.domain.FIPAAgentManagement.ServiceDescription;importjade.util.Logger;/***Clasebaseparaloaagentesquecontieneservicioscomunesatodosellos**@authorRodolfodeBenitoArango**/@SuppressWarnings("serial")publicclassAgenteBaseextendsAgent{ privatefinalLoggerlogger=Logger.getMyLogger(this.getClass().getName()); @Override /* *Procedimientoqueseejecutaenlacreacióndelagente */ protectedvoidsetup(){ //Estableceelniveldemensajesdellogger logger.setLevel(Logger.INFO); } /** *Registraaunagenteenlaspáginasamarillas *parafacilitarsulocalización * *@paramtipoAgenteEltipodeagentearegistrar *@paramnombreElnombredelagente * */ protectedvoidregistrarDFAgente(StringtipoAgente,Stringnombre){ logger.log(Logger.FINE,this.getLocalName()+"registrandoagente"+nombre+"enpáginasamarillas"); //Crealadescripcióndelagenteyleasignaelnombredeagente DFAgentDescriptiondescripcionAgente=newDFAgentDescription(); descripcionAgente.setName(getAID()); //Crealadescripcióndelservicioyleasignaelnombredelagenteytipo ServiceDescriptionsd=newServiceDescription(); sd.setType(tipoAgente); sd.setName(nombre); descripcionAgente.addServices(sd); try{ //Registraelagenteenlaspáginasamarillas DFService.register(this,descripcionAgente); }catch(FIPAExceptione){ e.printStackTrace(); } }

-56/106-

/** *Localizaaunagenteenlaspáginasamarillas * *@paramtipoEltipodeagentealocalizar *@returnElarraydeagentesquerespondenaltpodeagentealocalizar */ protectedDFAgentDescription[]getAgentePaginasAmarillas(Stringtipo){ logger.log(Logger.FINE,this.getLocalName()+"localizandoagente"+tipo+"enpáginasamarillas"); //Crealaplantillatipodelagentealocalizar DFAgentDescriptionplantilla=newDFAgentDescription(); DFAgentDescription[]resultado=null; ServiceDescriptionsd=newServiceDescription(); sd.setType(tipo); plantilla.addServices(sd); try{ //Buscaalagenteenlaspáginasamarillas resultado=DFService.search(this,plantilla); }catch(FIPAExceptionfe){ fe.printStackTrace(); } returnresultado; }}

-57/106-

ClaseAgenteCasaSubastaspackageuoc.sma.agentes;importjava.io.IOException;importjava.util.ArrayList;importjava.util.GregorianCalendar;importjava.util.Iterator;importjava.util.logging.FileHandler;importuoc.sma.behaviours.CasaSubastasBusquedasBehaviourResponder;importuoc.sma.behaviours.CasaSubastasTransaccionesBehaviourResponder;importuoc.sma.datos.Subasta;importuoc.sma.datos.Transaccion;importuoc.sma.estrategias.ApuestaUnicaIncrementoDinamicoCfgImpl;importuoc.sma.estrategias.ApuestaUnicaNRondasCfgImpl;importuoc.sma.estrategias.ICfgSubasta;importuoc.sma.estrategias.IncrementalCfgImpl;importuoc.sma.estrategias.SubastaHolandesaImpl;importuoc.sma.estrategias.SubastaInglesaImpl;importjade.core.AID;importjade.domain.DFService;importjade.domain.FIPAException;importjade.domain.FIPANames;importjade.lang.acl.ACLMessage;importjade.lang.acl.MessageTemplate;importjade.util.Logger;importjade.util.leap.HashMap;importjade.wrapper.ControllerException;importjade.wrapper.PlatformController;importjade.wrapper.StaleProxyException;/***Agenteconlasresponsabilidadessiguientes:*‐Crearunagentesubastadorcuandosecreaunanuevasubasta*‐Crearlasubasta*‐Obtenerlalistadebienesquesesubastan.Paraacotarelproblemaseconsidera*quenopuedehaber2subastasactivasquesubastenelmismobien.*‐BuscarelIDdelasubastasegúnelbiensubastado*‐Eliminaralagentesubastadorcuandoconcluyelasubasta**Comportamientos:*‐Atenderlaspeticionesdeescrituraenelhistorialdetransacciones*‐Atenderlaspeticionesdebúsquedadesubastas**@authorRodolfodeBenitoArango**/@SuppressWarnings("serial")publicclassAgenteCasaSubastasextendsAgenteBase{ privateHashMapsubastas;//Lalistadesubastasactivas(id,subasta) privateArrayList<Transaccion>historialTransacciones;//Elhistorialdetransacciones privateHashMapbienesSubastados;//Lalistadebienessubastados(bienSubastado,idSubasta) privatePlatformControllercontenedor;//Unareferenciaalcontenedordeagentes privatefinalLoggerlogger=Logger.getMyLogger(this.getClass().getName()); @Override /** *Alinicializarelagenterealizalasoperacionessiguientes:

-58/106-

*‐Inicializarlaslistasdehistorialdetransacciones *‐Inicializarlalistadesubastasactivas *‐Inicializarlalistadebienessubastados *‐Añadirloscomportamientosalagente *‐Registrarseenlaspáginasamarillas * */ protectedvoidsetup(){ super.setup(); //HabilitaelloggerparaescribirenelficheroHistorial.log try{ FileHandlerhandler; handler=newFileHandler("Historial.log"); logger.addHandler(handler); }catch(SecurityExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } logger.setLevel(Logger.INFO); this.contenedor=getContainerController();//Obtieneunareferenciaalcontenedor //Inicializacióndeestructurasdedatos inicializarEstructurasDatos(); //Registroenpáginasamarillas registrarDFAgente("CasaDeSubastas",getLocalName()+"‐Casadesubastas"); addHistorialTransaccionesBehaviour(); addBusquedaSubastasBehaviour(); //Amododepruebaañadesubastasalsistema testSubastas(); } /** *Añadeelcomportamientoqueatiendealaspeticionesdebúsquedas *desubastas * *SigueelprotocoloFIPA_QUERY */ privatevoidaddBusquedaSubastasBehaviour(){ logger.log(Logger.FINE,"Agente"+getLocalName()+"esperandopeticionesdebúsquedadesubastas..."); MessageTemplatetemplate=MessageTemplate.and( MessageTemplate.MatchProtocol(FIPANames.InteractionProtocol.FIPA_QUERY), MessageTemplate.MatchPerformative(ACLMessage.QUERY_REF)); addBehaviour(newCasaSubastasBusquedasBehaviourResponder(this,template)); } /** *Añadeelcomportamientoqueseencargadeatenderlaspeticiones *deañadirinformacióndelasubastaalhistorial * *SigueelprotocoloFIPA‐REQUEST */ privatevoidaddHistorialTransaccionesBehaviour(){ logger.log(Logger.FINE,"Agente"+getLocalName()+"esperandopeticionesparaelhistorialdetransacciones..."); MessageTemplateprotocolo=MessageTemplate.MatchProtocol(FIPANames.InteractionProtocol.FIPA_REQUEST); MessageTemplateperformativa=MessageTemplate.MatchPerformative(ACLMessage.REQUEST); MessageTemplateplantilla=MessageTemplate.and(protocolo,performativa);

-59/106-

addBehaviour(newCasaSubastasTransaccionesBehaviourResponder(this,plantilla)); } /** *Inicializalasestructurasdedatosnecesariasparaelagente */ privatevoidinicializarEstructurasDatos(){ historialTransacciones=newArrayList<Transaccion>(); subastas=newHashMap(); bienesSubastados=newHashMap(); } /** *Agregaunatransacciónalhistorial * *@paramtLatransacciónaagregar */ publicvoidaddTransaccion(Transacciont){ historialTransacciones.add(t); logger.log(Logger.FINE,"Sehaañadidolatransacción"+t); if(t.getOperación().equalsIgnoreCase(Transaccion.FIN)){ logger.log(Logger.FINE,"Secierralasubasta"+t.getIdSubasta()); this.cerrarSubasta(t.getIdSubasta()); } } /** *Obtieneelhistorialdetransacciones * *@returnLalistadetransacciones */ publicArrayList<Transaccion>getTransacciones(){ returnhistorialTransacciones; } /** *Añadeunanuevasubastaalsistema *‐CreaelAgentevendedoryloasociaalasubasta *‐Añadelasubastaalalistadesubastasactivas *‐Añadeelbiensubastadoalalistadebienes *‐Creaunanuevatransaccióndeiniciodesubastaylaañadealhistorial * *@params‐Lasubastaaañadir *@paramestrategiaSubastaLaestrategiadesubastadelvendedor(subastainglesa,holandesa,etc.) */ privatevoidaddSubasta(Subastas,ICfgSubastaestrategiaSubasta){ crearAgenteSubastador(s,estrategiaSubasta); subastas.put(s.getIdSubasta(),s); addBienSubastado(s.getObjetoSubastado(),s.getIdSubasta()); addTransaccion(new Transaccion(s.getFechaInicio(),s.getIdSubasta(),s.getAgenteSubastador().getLocalName(),"INICIO",s.getPrecio())); logger.log(Logger.FINE,"Sehacreadoenelsistemalasubasta"+s); } /** *Eliminalasubastadelalistadesubastasactivas * *@paramid‐Elidentificadordelasubastaaeliminar */ publicvoidremoveSubasta(intid){ subastas.remove(id); }

-60/106-

/** *Obtienelasubastaindicadaporelidentificador * *@paramidElidentidficadordelasubasta *@returnLasubasta */ publicSubastagetSubasta(intid){ return(Subasta)subastas.get(id); } /** *Añadeunnuevobiensubastadoalalista * *CadabiendiferenteseidentificaenunHashMapcuyas *clavesreferencianaunArrayListdesubastasparapermitir *colisionesenelHashMap * *@paramb‐Elbienquesesubasta *@paraml */ publicvoidaddBienSubastado(Stringb,intl){ bienesSubastados.put(b.toUpperCase(),newInteger(l)); logger.log(Logger.FINE,"Hayunnuevobiensubastado"+b+"enlasubasta"+l); } /** *Eliminaunbiendelalistadebienessubastados * *@parambElbienaeliminar */ publicvoidremoveBienSubastado(Stringb){ bienesSubastados.remove(b.toUpperCase()); } /** *Localizalasubastaquecontieneelbienabuscar *Sinoloencuentradevuelve0 * *@parambienSubastadoElbienalocalizarenlasubasta *@returnLasubasta */ publicSubastagetSubasta(StringbienSubastado){ if(bienesSubastados!=null){ if(bienesSubastados.get(bienSubastado.toUpperCase())!=null){ return(Subasta)subastas.get((Integer)bienesSubastados.get(bienSubastado.toUpperCase())); } } returnnull; } /** *Devuelvetodalalistadesubastas *@return */ publicIteratorgetAllSubastas(){ return(Iterator)this.subastas.values(); }

-61/106-

/** *Creaunnuevoagentesubastadorencargadodeunasubasta * *@paramsLasubastaqueatiendeelagentevendedor *@paramestrategiaSubastaLaestrategiaqueseguirálasubasta(Inglesa,Holandesa,etc) */ privatevoidcrearAgenteSubastador(Subastas,ICfgSubastaestrategiaSubasta){ Object[]args=newObject[2]; args[0]=s; args[1]=estrategiaSubasta; try{ contenedor.createNewAgent("Subastador"+s.getIdSubasta(), "uoc.sma.agentes.AgenteSubastador",args).start(); }catch(StaleProxyExceptione){ e.printStackTrace(); }catch(ControllerExceptione){ e.printStackTrace(); } s.setAgenteSubastador(newAID("Subastador"+s.getIdSubasta(),AID.ISLOCALNAME)); logger.log(Logger.FINE,"ElagentedecasadesubastascreaelagenteSubastadorparalasubasta "+s.getIdSubasta()); } /** *Eliminadelamemoriaelagentesubastador * *@paramlocalnameElagenteaeliminar */ privatevoideliminarAgenteSubastador(Stringlocalname){ try{ contenedor.getAgent(localname).kill(); }catch(StaleProxyExceptione){ e.printStackTrace(); }catch(ControllerExceptione){ e.printStackTrace(); } } /** *Realizalasoperacionesnecesariasparaeliminarlasubasta *unavezéstahayaconcluido: *‐Quitarlasubastadelalista *‐Quitarelbiensubastadodelalista *‐Eliminaralagentesubastadorresponsabledelasubasta * *@paramidSubastaElidentificadordelasubastaacerrar */ publicvoidcerrarSubasta(intidSubasta){ removeBienSubastado(getSubasta(idSubasta).getObjetoSubastado()); eliminarAgenteSubastador(getSubasta(idSubasta).getAgenteSubastador().getLocalName()); removeSubasta(idSubasta); } @Override /** *Alfinalizarelagente: *‐Quitarelregistrodelaspáginasamarillas */ protectedvoidtakeDown(){ super.takeDown(); try{ DFService.deregister(this); }catch(FIPAExceptionfe){

-62/106-

fe.printStackTrace(); } logger.log(Logger.INFO,"Historialdetransacciones:"+this.historialTransacciones); } /** *Métodoquecompruebaelfuncionamientodelassubastasinglesayholandesa *Creaunasubastainglesayunasubastaholandesa * *Crea3agentescompradoresparaunasubastainglesay3compradorespara *unasubastaholandesa. * *Creaunagentebuscador. * */ privatevoidtestSubastas(){ GregorianCalendarfInicioS1=newGregorianCalendar(); fInicioS1.add(GregorianCalendar.MINUTE,1); Subastas1=newSubasta(1,fInicioS1.getTime(),"iMac25",2.25,50,true,Subasta.SUBASTA_INGLESA); //ICfgSubastae1=newSubastaInglesaImpl(); GregorianCalendarfInicioS2=newGregorianCalendar(); fInicioS2.add(GregorianCalendar.MINUTE,2); Subastas2=newSubasta(2,fInicioS2.getTime(),"MacBookpro",250,0,true,Subasta.SUBASTA_HOLANDESA); //Crea2subastadeejemplo addSubasta(s1,newSubastaInglesaImpl()); addSubasta(s2,newSubastaHolandesaImpl()); try{ //Creaagentebuscadordesubastas contenedor.createNewAgent("Buscador","uoc.sma.agentes.AgenteBuscador",null).start(); logger.log(Logger.INFO,"ElagentedecasadesubastascreaelagenteBuscador"); testCrearCompradoresInglesa(s1); testCrearCompradoresHolandesa(s2); }catch(StaleProxyExceptione){ e.printStackTrace(); }catch(ControllerExceptione){ e.printStackTrace(); } } /** *Crea3compradoresdepruebaparalasubastaHolandesa * *@params2 *@throwsStaleProxyException *@throwsControllerException */ privatevoidtestCrearCompradoresHolandesa(Subastas2)throwsStaleProxyException,ControllerException{ Object[]args4=newObject[2]; args4[0]=s2; args4[1]=newApuestaUnicaIncrementoDinamicoCfgImpl(20,100,160,4); Object[]args5=newObject[2]; args5[0]=s2; args5[1]=newApuestaUnicaIncrementoDinamicoCfgImpl(10,120,180,4); Object[]args6=newObject[2]; args6[0]=s2;

-63/106-

args6[1]=newApuestaUnicaNRondasCfgImpl(0,140,180,5); contenedor.createNewAgent("Comprador4","uoc.sma.agentes.AgenteComprador",args4).start(); logger.log(Logger.FINE,"ElagentedecasadesubastascreaelagenteComprador4paralasubasta "+s2.getIdSubasta()); contenedor.createNewAgent("Comprador5","uoc.sma.agentes.AgenteComprador",args5).start(); logger.log(Logger.FINE,"ElagentedecasadesubastascreaelagenteComprador5paralasubasta "+s2.getIdSubasta()); contenedor.createNewAgent("Comprador6","uoc.sma.agentes.AgenteComprador",args6).start(); logger.log(Logger.FINE,"ElagentedecasadesubastascreaelagenteComprador6paralasubasta "+s2.getIdSubasta()); } /** *CreacompradoresdepruebaparalasubastaInglesa * *@params1 *@throwsStaleProxyException *@throwsControllerException */ privatevoidtestCrearCompradoresInglesa(Subastas1)throwsStaleProxyException,ControllerException{ Object[]args1=newObject[2]; args1[0]=s1; args1[1]=newIncrementalCfgImpl(0,10,25,190); Object[]args2=newObject[2]; args2[0]=s1; args2[1]=newIncrementalCfgImpl(1,2,5,195); Object[]args3=newObject[2]; args3[0]=s1; args3[1]=newIncrementalCfgImpl(1,15,30,175); contenedor.createNewAgent("Comprador1","uoc.sma.agentes.AgenteComprador",args1).start(); logger.log(Logger.FINE,"ElagentedecasadesubastascreaelagenteComprador1paralasubasta "+s1.getIdSubasta()); contenedor.createNewAgent("Comprador2","uoc.sma.agentes.AgenteComprador",args2).start(); logger.log(Logger.FINE,"ElagentedecasadesubastascreaelagenteComprador2paralasubasta "+s1.getIdSubasta()); contenedor.createNewAgent("Comprador3","uoc.sma.agentes.AgenteComprador",args3).start(); logger.log(Logger.FINE,"ElagentedecasadesubastascreaelagenteComprador3paralasubasta "+s1.getIdSubasta()); }}

-64/106-

ClaseAgenteSubastadorpackageuoc.sma.agentes;importjava.util.Date;importjava.util.HashSet;importjava.util.Iterator;importjava.util.Set;importuoc.sma.behaviours.SubastadorSuscribirBehaviourResponder;importuoc.sma.behaviours.estrategias.SubastadorHolandesaBehaviour;importuoc.sma.behaviours.estrategias.SubastadorInglesaBehaviour;importuoc.sma.datos.Subasta;importuoc.sma.estrategias.ICfgSubasta;importjade.core.AID;importjade.core.behaviours.WakerBehaviour;importjade.domain.FIPAAgentManagement.FailureException;importjade.domain.FIPAAgentManagement.NotUnderstoodException;importjade.domain.FIPAAgentManagement.RefuseException;importjade.lang.acl.ACLMessage;importjade.lang.acl.MessageTemplate;importjade.proto.SubscriptionResponder;importjade.proto.SubscriptionResponder.Subscription;importjade.proto.SubscriptionResponder.SubscriptionManager;importjade.util.Logger;/***Agentequeseencargadeunasubastadeterminadapuestaenmarchaporun*usuarioTienelasresponsabilidadessiguientes:*‐Aceptarlaspujasdeloscompradoresyefectuarlaspostcondionesalarecepcióndeunapuja*‐Notificaralosagentescompradoresparticipantesloscambiosdeprecioen*lasubasta*‐Notificarelganador**@authorRodolfodeBenitoArango**/@SuppressWarnings("serial")publicclassAgenteSubastadorextendsAgenteBase{ privatefinalLoggerlogger=Logger.getMyLogger(this.getClass().getName()); privateSubastasubasta; privateICfgSubastaestrategiaSubasta; privateSet<Subscription>suscripciones=newHashSet<Subscription>(); publicSubastagetSubasta(){ returnsubasta; } publicvoidsetSubasta(Subastasubasta){ this.subasta=subasta; } publicSet<Subscription>getSuscripciones(){ returnsuscripciones; } publicvoidsetSuscripciones(Set<Subscription>suscripciones){ this.suscripciones=suscripciones; } publicICfgSubastagetEstrategiaSubasta(){ returnestrategiaSubasta; }

-65/106-

/** *Añadeelcomportamientoconlaestrategiaqueutilizaráelcomprador * *@paramestrategiaSubastaLaestrategiaaseguirenlacompra */ publicvoidsetEstrategiaSubasta(ICfgSubastaestrategiaSubasta){ this.estrategiaSubasta=estrategiaSubasta; } @Override protectedvoidsetup(){ super.setup(); //Compruebalosargumentosdelagentesubastadoryobtienelaestrategiadelvendedor subasta=(Subasta)this.getArguments()[0]; if((getArguments()!=null)&&(getArguments().length>=2)){ setEstrategiaSubasta((ICfgSubasta)getArguments()[1]); }else{ logger.log(Logger.INFO,"Elagente"+this.getLocalName()+"nodisponedeningunaestrategiadeventa"); //Terminalaejecucióndelagentecuandoelnúmerodeargumentosesincorrecto this.doDelete(); } logger.log(Logger.FINE,"Agentesubastador"+this.getLocalName()+"creado."); logger.log(Logger.FINE,this.getLocalName()+":Esperandosuscripcionesalasubasta..."); //SecreaunaplantillaparaquesóloseadmitanmensajesdelprotocoloFIPA‐Subscribe MessageTemplatetemplate=SubscriptionResponder.createMessageTemplate(ACLMessage.SUBSCRIBE); //SecreaunSubscriptionManagerqueregistraráyeliminarálassuscripciones. SubscriptionManagergestor=crearGestorSubscripciones(); //Seañadeuncomportamientoquemanejalosmensajesrecibidosparasuscribirse. this.addBehaviour(newSubastadorSuscribirBehaviourResponder(this,template,gestor)); this.addBehaviour(newWakerBehaviour(this,subasta.getFechaInicio()){ @Override protectedvoidonWake(){ super.onWake(); logger.log(Logger.INFO,myAgent.getName() +"‐Seinicialasubasta"+subasta); ACLMessagecfpMsg=newACLMessage(ACLMessage.CFP); cfpMsg.setContent(String.valueOf(subasta.getPrecio())); cfpMsg.setReplyByDate(newDate(System.currentTimeMillis()+10000)); if(subasta.getTipoSubasta()==Subasta.SUBASTA_INGLESA) myAgent.addBehaviour(newSubastadorInglesaBehaviour(myAgent,cfpMsg)); elseif(subasta.getTipoSubasta()==Subasta.SUBASTA_HOLANDESA) myAgent.addBehaviour(newSubastadorHolandesaBehaviour(myAgent,cfpMsg)); } } ); } /** *Creaelgestordesuscripcionesydefinelosmétodospara *suscribirydesuscribiragentesalassubastas * *@return */ privateSubscriptionManagercrearGestorSubscripciones(){ SubscriptionManagergestor=newSubscriptionManager(){

-66/106-

publicbooleanderegister(Subscriptionsuscripcion) throwsFailureException{ if(suscripcion.getMessage().getContent()!=null){ intidSubasta=obtenerIdSubasta(suscripcion.getMessage() .getContent()); suscripciones.remove(suscripcion); returnremoveSuscriptor(suscripcion.getMessage() .getSender(),idSubasta); } returnfalse; } publicbooleanregister(Subscriptionsuscripcion) throwsRefuseException,NotUnderstoodException{ if(suscripcion.getMessage().getContent()!=null){ intidSubasta=obtenerIdSubasta(suscripcion.getMessage() .getContent()); suscripciones.add(suscripcion); returnaddSuscriptor(suscripcion.getMessage().getSender(), idSubasta); } returnfalse; } privateintobtenerIdSubasta(Stringcontent){ returnInteger.parseInt(content); } }; returngestor; } @Override protectedvoidtakeDown(){ super.takeDown(); } /** *Añadeunsuscriptoralalistadesuscriptores * *@paramsuscriptor */ publicbooleanaddSuscriptor(AIDsuscriptor,intidSubasta){ subasta.getSuscriptores().add(suscriptor); logger.log(Logger.FINE,"Sehaañadidoelsuscriptor"+suscriptor.getLocalName()+"alasubasta"+subasta); returntrue; } /** *Eliminaunsuscriptordelalistadesuscriptores * *@paramsuscriptor */ publicbooleanremoveSuscriptor(AIDsuscriptor,intidSubasta){ subasta.getSuscriptores().remove(suscriptor); logger.log(Logger.FINE,"Sehaeliminadoelsuscriptor"+suscriptor.getLocalName()+"delasubasta"+subasta); returntrue; } //Compruebalapropuesta.Enestecasosielcontenidodelmensajetieneunalongitudmayorque2,devuelvetrue publicbooleancompruebaMensaje(Stringpropuesta){ returntrue; }

-67/106-

/** *AñadealmensajeCFPalossuscriptoresdelasubasta * *@parammElmensajequeseenviará *@return */ publicACLMessageaddAgentsToMessage(ACLMessagem){ Iterator<AID>it=subasta.getSuscriptores().iterator(); while(it.hasNext()){ m.addReceiver(it.next()); } returnm; }}

ClaseAgenteBuscador packageuoc.sma.agentes;importuoc.sma.behaviours.BuscadorBehaviourInitiator;importuoc.sma.behaviours.BuscadorBehaviourResponder;importjade.domain.DFService;importjade.domain.FIPAException;importjade.domain.FIPANames;importjade.lang.acl.ACLMessage;importjade.lang.acl.MessageTemplate;importjade.util.Logger;/***Agentequetienecomoresponsabilidadprincipallocalizar*lassubastasactivasdeinterésparaelcomprador*apartirdelbienacomprarycomunicarselasalusuario.**SebasaenFIPA‐BROKERINGdetalmaneraqueesteagentebuscadoractuade*intermediarioentreelagenteCasaSubastasyelagentecomprador.*Elagentecompradorlepiderealizarunabúsquedayelagentebuscador*selaremitealagenteCasaSubastas.*CuandoelagenteCasaSubastasdevuelveelresultadodelabúsqueda,*esteagenteretornaelresultadoalcomprador***@authorRodolfodeBenito**/@SuppressWarnings("serial")publicclassAgenteBuscadorextendsAgenteBase{ privatefinalLoggerlogger=Logger.getMyLogger(this.getClass().getName()); @Override /* *Procedimientoqueseejecutaenlacreacióndelagente */ protectedvoidsetup(){ logger.log(Logger.FINE,"Agente"+getLocalName() +"esperandopeticiones..."); registrarDFAgente("BUSCADOR",this.getLocalName()); //CreaunaplantillademensajesconelprotocoloFIPA_REQUEST

-68/106-

//conmensajesdetipoREQUEST MessageTemplatetemplate=MessageTemplate.and(MessageTemplate .MatchProtocol(FIPANames.InteractionProtocol.FIPA_REQUEST), MessageTemplate.MatchPerformative(ACLMessage.REQUEST)); //AñadealagenteelcomportamientoqueresponderáalaspeticionesdelagenteComprador BuscadorBehaviourResponderresponder=newBuscadorBehaviourResponder(this,template); //RegistraunAchieveREInitiatorparaelestadoPREPARE_RESULT_NOTIFICATION //QueseutilizaráparainiciarlaconversaciónconelagenteCasaSubastas //solicitandoquerealiceunabúsquedayparadevolverelresultadodelabúsqueda //alagentecomprador responder.registerPrepareResultNotification(newBuscadorBehaviourInitiator(this,null)); addBehaviour(responder); } @Override /* *Seejecutaalfinalizarelagente */ protectedvoidtakeDown(){ super.takeDown(); //Eliminalaentradadelaspáginasamarillas try{ DFService.deregister(this); }catch(FIPAExceptionfe){ fe.printStackTrace(); } }}

ClaseAgenteCompradorpackageuoc.sma.agentes;importuoc.sma.behaviours.CompradorSuscribirBehaviourInitiator;importuoc.sma.behaviours.estrategias.CompradorHolandesaIncrementoDinamicoBehaviour;importuoc.sma.behaviours.estrategias.CompradorHolandesaNRondasBehaviour;importuoc.sma.behaviours.estrategias.CompradorInglesaIncrementalBehaviour;importuoc.sma.datos.Subasta;importuoc.sma.estrategias.ApuestaUnicaIncrementoDinamicoCfgImpl;importuoc.sma.estrategias.ApuestaUnicaNRondasCfgImpl;importuoc.sma.estrategias.ICfgApuesta;importuoc.sma.estrategias.IncrementalCfgImpl;importjade.core.AID;importjade.core.behaviours.Behaviour;importjade.domain.FIPANames;importjade.domain.FIPAAgentManagement.DFAgentDescription;importjade.lang.acl.ACLMessage;importjade.lang.acl.MessageTemplate;importjade.lang.acl.UnreadableException;importjade.util.Logger;/***Agenteresponsablede:*‐Pujarenunasubastaacordeaunosparámetrosfijadosporelusuario*‐Admitevariasestrategias:*Incremental:partiendodeunpreciomínimoyunomáximo,elagenterealizapujas

-69/106-

* aunintervalodetiemposfijadoporelusuarioincrementandolapujaen* unacantidadfijaestipuladaporelusuario.*Francotirador:partedeunpreciomáximoalqueestádispuestoallegarelcomprador* (preciodereserva)yrealizaunpujaenelúltimominutodelasubasta* porunaimportecomprendidoentrelapujamáximaenesemomentoyel* preciodereservadelcomprador.*Primerapuja:elagentehaceunapujainstantaneaporelimporteseñaladoporelcomprador.**Elsistemaestáabiertoaimplementarcualquierotraestrategiasinqueestoimplique*cambioalgunoenlaarquitecturadelSMA.**@authorRodolfodeBenito**/@SuppressWarnings("serial")publicclassAgenteCompradorextendsAgenteBase{ privatefinalLoggerlogger=Logger.getMyLogger(this.getClass().getName()); privateSubastasubasta;//Contieneunareferenciaalasubastaalaquesesuscribiráelcomprador privateICfgApuestaestrategia; privateAIDidBuscador=null; publicICfgApuestagetEstrategia(){ returnestrategia; } publicvoidsetEstrategia(ICfgApuestaestrategiaComprador){ this.estrategia=estrategiaComprador; } publicSubastagetSubasta(){ returnsubasta; } publicvoidsetSubasta(Subastasubasta){ this.subasta=subasta; } @Override protectedvoidsetup(){ logger.setLevel(Logger.INFO); //Compruebaqueelnúmerodeargumentospasadosenlacreacióndelagenteseancorrectos if((getArguments()!=null)&&(getArguments().length>=2)){ setEstrategia((ICfgApuesta)getArguments()[1]); }else{ logger.log(Logger.FINE,"Elagente"+this.getLocalName()+"nodisponedeningunaestrategia"); this.doDelete(); } //LocalizaalAgenteBuscadorenlaspáginasamarillas DFAgentDescription[]aBuscador=getAgentePaginasAmarillas("BUSCADOR"); if(aBuscador!=null) this.idBuscador=aBuscador[0].getName(); addSuscripcionBehaviour(); addEstrategiaBehaviour(); addBusquedaBehaviour(); testAgenteBuscador("iMac25"); }

-70/106-

/** *Métododepruebaqueutilizaalaagentebuscadorparalocalizarsubastas *activasquecontengaeltextopasadocomoparámetro * *@paramcadenaBusqueda */ privatevoidtestAgenteBuscador(StringcadenaBusqueda){ if(idBuscador!=null){ logger.log(Logger.FINE,this.getLocalName()+"verificandoelfuncionamientodelagentebuscador"); ACLMessagemensaje=newACLMessage(ACLMessage.REQUEST); mensaje.setProtocol(FIPANames.InteractionProtocol.FIPA_REQUEST); mensaje.setContent(cadenaBusqueda); mensaje.addReceiver(idBuscador); this.send(mensaje); }else logger.log(Logger.INFO,this.getLocalName()+"nosepudolocalizaralagentebuscadorenpáginasamarillas"); } /** *Añadecomocomportamientounaclaseinternaque,asuvez,añadirácomocomportamiento *larecepcióndeunmensajedetipoINFORMprocedentedelagentebuscador */ privatevoidaddBusquedaBehaviour(){ addBehaviour(newBehaviour(){ //PlantillapararesponderalosmensajestipoINFORMprocedentesdelagentebuscador MessageTemplatetemplate=MessageTemplate.and(MessageTemplate .MatchProtocol(FIPANames.InteractionProtocol.FIPA_REQUEST), MessageTemplate.MatchPerformative(ACLMessage.INFORM)); publicvoidaction(){ //EsperaunmensajetipoINFORM ACLMessagemensaje=receive(template); if(mensaje!=null){ try{ if(mensaje.getContentObject()!=null){ //Muestralasubastabuscada logger.log(Logger.INFO,"Agentebuscador:subastalocalizada"+(Subasta)mensaje.getContentObject()); }else logger.log(Logger.INFO,"Elagentebuscadornohalocalizadoningunasubasta"); }catch(UnreadableExceptione){ e.printStackTrace(); } }else{ block(); } } @Override publicbooleandone(){ returnfalse; } }); }

-71/106-

/***Añadecomocomportamientounaclaseinternaque,asuvez,añadirácomocomportamiento*laestrategiaquecorrespondaalrecibirunmensajedetipoCFP(simbolizaeliniciodelasubasta)*/privatevoidaddEstrategiaBehaviour(){ addBehaviour(newBehaviour(){ //PlantillapararesponderalosmensajestipoCFP privateMessageTemplatemt=MessageTemplate.MatchPerformative(ACLMessage.CFP); publicvoidaction(){ //EsperaunmensajetipoCFP ACLMessagecfp=receive(mt); if(cfp!=null){ //Cuandorecibeelmensajeañadeelcomportamientoquecorespondealaestrategiadecompra logger.log(Logger.FINE,myAgent.getLocalName()+":RECIBE:CFP"); if(estrategiainstanceofApuestaUnicaIncrementoDinamicoCfgImpl){ myAgent.addBehaviour(newCompradorHolandesaIncrementoDinamicoBehaviour(myAgent,cfp)); } if(estrategiainstanceofApuestaUnicaNRondasCfgImpl){ myAgent.addBehaviour(newCompradorHolandesaNRondasBehaviour(myAgent,cfp)); } if(estrategiainstanceofIncrementalCfgImpl){ myAgent.addBehaviour(newCompradorInglesaIncrementalBehaviour(myAgent,cfp)); } }else{ block(); } } @Override publicbooleandone(){ returnfalse; } }); } /***Añadeelcomportamientoparaqueelcompradorpuedasuscribirseaunasubasta*cuyoIDsepasacomoparámetroenlacreacióndelagente**SigueelprotocoloFIPA‐Subscribe*/privatevoidaddSuscripcionBehaviour(){//SecreaunmensajedetipoSUBSCRIBEyseasociaalprotocoloFIPA‐Subscribe.ACLMessagemensaje=newACLMessage(ACLMessage.SUBSCRIBE);mensaje.setProtocol(FIPANames.InteractionProtocol.FIPA_SUBSCRIBE);//Trabajaconelprimerodelosargumentosdecreacióndelagente//paraobtenerelidentificadordelasubastaalquevaasuscribirse//elagentecompradorif(getArguments()!=null){ setSubasta((Subasta)getArguments()[0]); intidSubasta=subasta.getIdSubasta(); //Pasaenelmensajeelidentificadordelasubastaalaquedebesuscribirse mensaje.setContent(String.valueOf(idSubasta));//Lasubastaalaquesesuscribe //Añadeelcomportamientothis.addBehaviour(newCompradorSuscribirBehaviourInitiator(this,mensaje));}else{ logger.log(Logger.FINE,"Elagente"+this.getLocalName()+"nodisponedeningunasubastaalaquesuscribirse");}} }

-72/106-

ClaseSubastadorBehaviourpackageuoc.sma.behaviours.estrategias;importjava.io.IOException;importuoc.sma.behaviours.SubastadorTransaccionesBehaviourInitiator;importuoc.sma.datos.Transaccion;importjade.core.AID;importjade.core.Agent;importjade.domain.DFService;importjade.domain.FIPAException;importjade.domain.FIPANames;importjade.domain.FIPAAgentManagement.DFAgentDescription;importjade.domain.FIPAAgentManagement.ServiceDescription;importjade.lang.acl.ACLMessage;importjade.proto.ContractNetInitiator;@SuppressWarnings("serial")publicclassSubastadorBehaviourextendsContractNetInitiator{ publicSubastadorBehaviour(Agenta,ACLMessagecfp){ super(a,cfp); } /** *EnvíaunmensajealagenteCasaSubastasparaqueregistrelatransacción * *@paramt *Latransacción *@paramidCasaSubastas *ElidentificadordelagenteCasaSubastas */ protectedvoidregistrarTransaccion(Transacciont,AIDidCasaSubastas){ ACLMessagemsg=newACLMessage(ACLMessage.REQUEST); msg.setProtocol(FIPANames.InteractionProtocol.FIPA_REQUEST); msg.addReceiver(idCasaSubastas); try{ msg.setContentObject(t); }catch(IOExceptione){ e.printStackTrace(); } myAgent.addBehaviour(newSubastadorTransaccionesBehaviourInitiator(myAgent,msg)); } /** *ObtieneelidentificadordelagenteCasaSubastasdelaspáginasamarillas *@return */ protectedDFAgentDescription[]getCasaSubastas(){ DFAgentDescriptiontemplate=newDFAgentDescription(); DFAgentDescription[]result=null; ServiceDescriptionsd=newServiceDescription(); sd.setType("CasaDeSubastas"); template.addServices(sd); try{ result=DFService.search(myAgent,template); }catch(FIPAExceptionfe){ fe.printStackTrace(); } returnresult; }}

-73/106-

ClaseSubastadorHolandesaBehaviourpackageuoc.sma.behaviours.estrategias;importjava.util.Date;importjava.util.Vector;importuoc.sma.agentes.AgenteSubastador;importuoc.sma.datos.Subasta;importuoc.sma.datos.Transaccion;importuoc.sma.estrategias.SubastaHolandesaImpl;importjade.core.AID;importjade.core.Agent;importjade.domain.FIPAAgentManagement.DFAgentDescription;importjade.lang.acl.ACLMessage;importjade.util.Logger;/***EncapsulaelcomportamientodeunagentesubastadordesubastaHolandesa**@authorRodolfodeBenito**/@SuppressWarnings("serial")publicclassSubastadorHolandesaBehaviourextendsSubastadorBehaviour{ privatefinalLoggerlogger=Logger.getMyLogger(this.getClass().getName()); privateAgenteSubastadoragente; privateSubastas; privateSubastaHolandesaImplestrategiaVendedor; privateAIDidCasaSubastas; privatedoubledecremento=15;//Eldecrementodeprecioqueseaplicará //encadaronda privateintcontadorPujas=0; privatebooleanfinalSubasta=false; privatebooleaninferiorReserva=false; publicSubastadorHolandesaBehaviour(Agenta,ACLMessagemsg){ super(a,msg); logger.setLevel(Logger.INFO); agente=(AgenteSubastador)myAgent; s=agente.getSubasta(); estrategiaVendedor=(SubastaHolandesaImpl)agente .getEstrategiaSubasta(); //LocalizaralAgentedeSubastasenlaspáginasamarillas DFAgentDescription[]aCasaSubastas=getCasaSubastas(); if(aCasaSubastas!=null) this.idCasaSubastas=aCasaSubastas[0].getName(); } @Override /** *PreparaelmensajeCFPsiguiente */ protectedVectorprepareCfps(ACLMessagecfp){ cfp=agente.addAgentsToMessage(cfp); Vectormensajes=newVector(); mensajes.add(cfp);

-74/106-

returnmensajes; } @Override /** *Compruebasiesnecesariaotrarondaylainiciasiespreciso */ publicintonEnd(){ if(finalSubasta==false){ ACLMessagenextMsg=newACLMessage(ACLMessage.CFP); nextMsg.setContent(String.valueOf(s.getPrecio())); logger.log(Logger.INFO,myAgent.getName()+":Ofertadeventa:" +s.getPrecio()); myAgent.addBehaviour(newSubastadorHolandesaBehaviour(myAgent, nextMsg)); } returnsuper.onEnd(); } /** *Gestionalasrespuestasdetodoslosparticipantesenlasubasta */ protectedvoidhandleAllResponses(Vectorrespuestas,Vectoracceptances){ contadorPujas=0; for(ACLMessagerespuesta:(Vector<ACLMessage>)respuestas){ //ControlarlosmensajesdetipoREFUSE(elagentenopuja) if(respuesta.getPerformative()==ACLMessage.REFUSE){ logger.log(Logger.FINE,respuesta.getSender().getLocalName() +"NOPUJA"); //ControlalosmensajesdetipoPROPOSE(laspujas) }elseif(respuesta.getPerformative()==ACLMessage.PROPOSE){ ++contadorPujas; doublepuja=Double.parseDouble(respuesta.getContent()); logger.log(Logger.FINE,"Agente:" +respuesta.getSender().getLocalName()+"Puja=" +String.valueOf(puja)); registrarTransaccion(newTransaccion(newDate(),s .getIdSubasta(),respuesta.getSender().getLocalName(), Transaccion.PUJA,puja),idCasaSubastas); //Pujaganadora s.setPrecio(puja); s.setMsgMejorOferta(respuesta); break; } } //Hayunapuja if(contadorPujas>0){ finalSubasta=true; logger.log(Logger.INFO,"FINDESUBASTA"); //EnviarACCEPTsihayunganador if(s.getMsgMejorOferta()!=null){ //Estableceelganadordelasubasta s.setGanador(s.getMsgMejorOferta().getSender()); logger.log(Logger.INFO,"Ganadordelasubasta:"+s +"elcomprador" +s.getMsgMejorOferta().getSender().getLocalName() +"conunapujade"+s.getPrecio()); registrarTransaccion(newTransaccion(newDate(),s .getIdSubasta(),s.getMsgMejorOferta().getSender() .getLocalName(),Transaccion.FIN,s.getPrecio()), idCasaSubastas);

-75/106-

ACLMessageaccept=s.getMsgMejorOferta().createReply(); accept.setPerformative(ACLMessage.ACCEPT_PROPOSAL); accept.setContent(String.valueOf(s.getPrecio())); acceptances.add(accept); for(ACLMessageresponse:(Vector<ACLMessage>)respuestas){ if(s.getMsgMejorOferta()!=response){ ACLMessagereject=response.createReply(); reject.setPerformative(ACLMessage.REJECT_PROPOSAL); reject.setContent(String.valueOf(s.getPrecio())); acceptances.add(reject); } } } }else{ //Recalcularlanuevaofertadeprecioporpartedelvendedor doublenuevoPrecio=s.getPrecio()‐decremento; if(nuevoPrecio>=s.getPrecioReserva()){ s.setPrecio(nuevoPrecio); registrarTransaccion(newTransaccion(newDate(),s .getIdSubasta(),myAgent.getLocalName(), Transaccion.OFERTA,s.getPrecio()),idCasaSubastas); }else inferiorReserva=true; } //Encasoquenoserecibaningunarespuestaoelnuevopreciosea //inferioraldereserva //sedaporfinalizadalasubastasinganador if(respuestas.size()==0||inferiorReserva){ logger.log(Logger.INFO,"Nohayganadordelasubasta.Sehaagotadoeltiempomáximodeesperade nuevaspujasoelvendedornobajarámaselprecio"); for(ACLMessageresponse:(Vector<ACLMessage>)respuestas){ ACLMessagereject=response.createReply(); reject.setPerformative(ACLMessage.REJECT_PROPOSAL); reject.setContent(String.valueOf(s.getPrecioReserva())); acceptances.add(reject); finalSubasta=true; } } }

-76/106-

ClaseSubastadorInglesaBehaviour packageuoc.sma.behaviours.estrategias;importjava.util.Date;importjava.util.Vector;importuoc.sma.agentes.AgenteSubastador;importuoc.sma.datos.Subasta;importuoc.sma.datos.Transaccion;importuoc.sma.estrategias.SubastaInglesaImpl;importjade.core.AID;importjade.core.Agent;importjade.domain.FIPAAgentManagement.DFAgentDescription;importjade.lang.acl.ACLMessage;importjade.util.Logger;/***Encapsulaelcomportamientodeunagentesubastadordesubastainglesa**@authorRodolfodeBenito**/publicclassSubastadorInglesaBehaviourextendsSubastadorBehaviour{ privatefinalLoggerlogger=Logger.getMyLogger(this.getClass().getName()); privateAgenteSubastadoragente; privateSubastas; privateSubastaInglesaImplestrategiaVendedor; privateAIDidCasaSubastas; privateintcontadorPujas=0; privatebooleanfinalSubasta=false; publicSubastadorInglesaBehaviour(Agenta,ACLMessagemsg){ super(a,msg); agente=(AgenteSubastador)myAgent; s=agente.getSubasta(); estrategiaVendedor=(SubastaInglesaImpl)agente.getEstrategiaSubasta(); //LocalizaralAgentedeSubastasenlaspáginasamarillas DFAgentDescription[]aCasaSubastas=getCasaSubastas(); if(aCasaSubastas!=null) this.idCasaSubastas=aCasaSubastas[0].getName(); } @Override /** *PreparaelmensajeCFPsiguiente */ protectedVectorprepareCfps(ACLMessagecfp){ cfp=agente.addAgentsToMessage(cfp); Vectormensajes=newVector(); mensajes.add(cfp); returnmensajes; }

-77/106-

@Override /** *Compruebasiesnecesariaotrarondaylainiciasiespreciso */ publicintonEnd(){ if(finalSubasta==false){ ACLMessagenextMsg=newACLMessage(ACLMessage.CFP); nextMsg.setContent(String.valueOf(s.getPrecio())); myAgent.addBehaviour(newSubastadorInglesaBehaviour(myAgent, nextMsg)); } returnsuper.onEnd(); } /** *Gestionalasrespuestasdetodoslosparticipantesenlasubasta */ protectedvoidhandleAllResponses(Vectorrespuestas,Vectoracceptances){ ACLMessagemejorOfertaMsg=null; doublemejorPuja=0; contadorPujas=0; for(ACLMessagerespuesta:(Vector<ACLMessage>)respuestas){ //ControlarlosmensajesdetipoREFUSE(elagentenopuja) if(respuesta.getPerformative()==ACLMessage.REFUSE){ logger.log(Logger.FINE,respuesta.getSender().getLocalName() +"NOPUJA"); //ControlalosmensajesdetipoPROPOSE(laspujas) }elseif(respuesta.getPerformative()==ACLMessage.PROPOSE){ ++contadorPujas; doublepuja=Double.parseDouble(respuesta.getContent()); logger.log(Logger.FINE,"Agente:" +respuesta.getSender().getLocalName()+"Puja=" +String.valueOf(puja)); registrarTransaccion(newTransaccion(newDate(),s .getIdSubasta(),respuesta.getSender().getLocalName(), Transaccion.PUJA,puja),idCasaSubastas); //Compruebasieslamejorpuja if(puja>mejorPuja){ mejorPuja=puja; s.setPrecio(mejorPuja); mejorOfertaMsg=respuesta; s.setMsgMejorOferta(mejorOfertaMsg); } } } logger.log(Logger.INFO,"Pujamásaltaenestaronda:" +String.valueOf(mejorPuja)); if(contadorPujas==0){ finalSubasta=true; logger.log(Logger.FINE,"Nohaymáspujas"); //EnviarACCEPTsihayunganador if((s.getMsgMejorOferta())!=null &&(s.getPrecio()>s.getPrecioReserva())){ //Estableceelganadordelasubasta s.setGanador(s.getMsgMejorOferta().getSender()); logger.log(Logger.INFO,"Ganadordelasubasta:"+s +"elcomprador" +s.getMsgMejorOferta().getSender().getLocalName() +"conunapujade"+s.getPrecio());

-78/106-

registrarTransaccion(newTransaccion(newDate(),s .getIdSubasta(),s.getMsgMejorOferta().getSender() .getLocalName(),Transaccion.FIN,s.getPrecio()), idCasaSubastas); ACLMessageaccept=s.getMsgMejorOferta().createReply(); accept.setPerformative(ACLMessage.ACCEPT_PROPOSAL); accept.setContent(String.valueOf(s.getPrecio())); acceptances.add(accept); for(ACLMessageresponse:(Vector<ACLMessage>)respuestas){ if(s.getMsgMejorOferta()!=response){ ACLMessagereject=response.createReply(); reject.setPerformative(ACLMessage.REJECT_PROPOSAL); reject.setContent(String.valueOf(s.getPrecio())); acceptances.add(reject); } } }else{ logger.log(Logger.INFO, "Nohayganadordelasubasta.Laspujasnosuperanelpreciodereserva:" +s.getPrecioReserva()); for(ACLMessageresponse:(Vector<ACLMessage>)respuestas){ ACLMessagereject=response.createReply(); reject.setPerformative(ACLMessage.REJECT_PROPOSAL); reject.setContent(String.valueOf(s.getPrecioReserva())); acceptances.add(reject); } } } }}

-79/106-

ClaseCompradorInglesaIncrementalBehaviourpackageuoc.sma.behaviours.estrategias;importuoc.sma.agentes.AgenteComprador;importuoc.sma.estrategias.IncrementalCfgImpl;importjade.core.Agent;importjade.domain.FIPAAgentManagement.FailureException;importjade.domain.FIPAAgentManagement.NotUnderstoodException;importjade.domain.FIPAAgentManagement.RefuseException;importjade.lang.acl.ACLMessage;importjade.proto.SSIteratedContractNetResponder;importjade.util.Logger;/***Estrategiadelcompradordelasubastainglesaenlaqueelagentepujaa*intervalosregularesincrementandolapujaenunacantidadpreestablecidaal*crearelagente.Sepuedeoptarporunadeestasdosformasdeincrementarla*puja:**Nuevapuja=pujaanterior+incremento.Nuevapuja=pujaanterior**incremento.**@authorRodolfodeBenito**/@SuppressWarnings("serial")publicclassCompradorInglesaIncrementalBehaviourextends SSIteratedContractNetResponder{ privatefinalLoggerlogger=Logger.getMyLogger(this.getClass().getName()); privateAgenteCompradoragente; privateIncrementalCfgImplestrategia; privatedoublepuja=0; privateintcontadorPujas=0; publicCompradorInglesaIncrementalBehaviour(Agenta,ACLMessagecfp){ super(a,cfp); logger.setLevel(Logger.INFO); agente=(AgenteComprador)a; estrategia=(IncrementalCfgImpl)agente.getEstrategia(); } @Override /** *TratalosmensajesCallForProposalprocedentesdelcompradorconla *pujaactualdelasubasta * *Enestemétododecidesipujaronoyelimportedelapuja,enviandoun *mensajedepropuesta(sipuja)oderechazo(sinopuja) * */ protectedACLMessagehandleCfp(ACLMessagecfp)throwsRefuseException, FailureException,NotUnderstoodException{ ACLMessagefirstPropose=cfp.createReply(); puja=obtenerPuja(Double.parseDouble(cfp.getContent())); if((pujaAceptable(puja)) &&(puja>Double.parseDouble(cfp.getContent()))){ //Lapujanosobrepasaelpreciodereservadelcomprador

-80/106-

//yademásesmayorquelapujaactual.Seproponeunapuja firstPropose.setPerformative(ACLMessage.PROPOSE); logger.log(Logger.INFO,myAgent.getLocalName() +":ENVIA:PROPOSE:"+puja); firstPropose.setContent(String.valueOf(puja)); estrategia.setPuja(puja); ++contadorPujas; }else{ //Nopuja firstPropose.setPerformative(ACLMessage.REFUSE); logger.log(Logger.FINE,myAgent.getLocalName() +":ENVIA:REFUSE:"+cfp.getContent()); } returnfirstPropose; } @Override protectedvoidhandleRejectProposal(ACLMessagecfp,ACLMessagepropose, ACLMessagereject){ logger.log(Logger.FINE,myAgent.getLocalName()+":Recibe:REJECT"); if(reject==null){ logger.log(Logger.FINE,myAgent.getLocalName() +":Responder:TIMEOUT"); } } @Override /** *Tratalosmensajesdeaceptacióndepropuestadepujaprocedentesdel *subastadorEncasoderecibirunmensajedeaceptaciónindicaquelapuja *delagenteeslaganadoradelasubastayseenvíaunmensajeINFORMal *agentesubastadorconfirmandoenimportedelapujaganadora */ protectedACLMessagehandleAcceptProposal(ACLMessagecfp, ACLMessagepropose,ACLMessageaccept)throwsFailureException{ logger.log(Logger.FINE,myAgent.getName()+":Recibe:ACCEPT"); if(accept!=null){ ACLMessageinform=accept.createReply(); inform.setPerformative(ACLMessage.INFORM); inform.setContent(String.valueOf(estrategia.getPuja())); logger.log(Logger.FINE,myAgent.getLocalName() +":Envía:INFORM:"+puja); returninform; }else{ ACLMessagerefuse=cfp.createReply(); refuse.setPerformative(ACLMessage.REFUSE); refuse.setContent(String.valueOf(estrategia.getPuja())); logger.log(Logger.FINE,myAgent.getLocalName() +":Envía:REFUSE"); returnrefuse; } }

-81/106-

/** *Calculalapujaqueofertaráelcomprador * *@returnElvalordelapuja */ privatedoubleobtenerPuja(DoublepujaActual){ doubleincremento=estrategia.getIncremento(); inttipoIncremento=estrategia.getTipoIncemento(); doublepuja=estrategia.getPuja(); while(puja<pujaActual){ if(tipoIncremento==0){ puja=puja+incremento; }else{ puja=Math.round(puja*incremento); } logger.log(Logger.FINE,myAgent.getLocalName() +"Calculandonuevapuja:"+puja); } returnpuja; } /** *Compruebasilapujaesaceptableenbasealaestrategiadelcompradory *supreciodereserva * *@parampuja *Elimportedelapuja *@returntruesilapujaesaceptableyfaseencasocontrario */ privatebooleanpujaAceptable(doublepuja){ return((puja<estrategia.getReserva())&&((puja>estrategia .getPuja())||(contadorPujas==0))); }}

-82/106-

ClaseCompradorHolandesaNRondasBehaviourpackageuoc.sma.behaviours.estrategias;importuoc.sma.agentes.AgenteComprador;importuoc.sma.estrategias.ApuestaUnicaNRondasCfgImpl;importjade.core.Agent;importjade.domain.FIPAAgentManagement.FailureException;importjade.domain.FIPAAgentManagement.NotUnderstoodException;importjade.domain.FIPAAgentManagement.RefuseException;importjade.lang.acl.ACLMessage;importjade.proto.SSIteratedContractNetResponder;importjade.util.Logger;/***Estrategiadelcompradordelasubastaholandesaenlaquealprincipioel*agenteconsiderapujarenlasubastaporelprecioconfiguradoensuatributo*Puja.Sieneltranscursodelasubastasesuperaelnúmeroderondas*configuradoenlaestrategiaentonceselvalordeaceptacióndelapujaserá*eldesupreciodereserva.**@authorRodolfodeBenito**/@SuppressWarnings("serial")publicclassCompradorHolandesaNRondasBehaviourextends SSIteratedContractNetResponder{ privatefinalLoggerlogger=Logger.getMyLogger(this.getClass().getName()); privateAgenteCompradoragente; privateApuestaUnicaNRondasCfgImplestrategia; privatedoublepuja=0; publicCompradorHolandesaNRondasBehaviour(Agenta,ACLMessagecfp){ super(a,cfp); logger.setLevel(Logger.INFO); agente=(AgenteComprador)a; estrategia=(ApuestaUnicaNRondasCfgImpl)agente.getEstrategia(); } @Override /** *Tratalaspropuestasdecompradelsubastastadoryenvíaunmensaje *PROPOSEencasoqueaceptelaofertadeventaounmensajeREFUSEsi *rechazalaoferta */ protectedACLMessagehandleCfp(ACLMessagecfp)throwsRefuseException, FailureException,NotUnderstoodException{ ACLMessagefirstPropose=cfp.createReply(); estrategia.setContadorRondas(estrategia.getContadorRondas()+1); puja=Double.parseDouble(cfp.getContent()); if(pujaAceptable(puja)){ //Seaceptalapuja firstPropose.setPerformative(ACLMessage.PROPOSE); logger.log(Logger.FINE,myAgent.getLocalName() +":ENVIA:PROPOSE:"+puja); firstPropose.setContent(String.valueOf(puja));

-83/106-

}else{ //Nopuja firstPropose.setPerformative(ACLMessage.REFUSE); logger.log(Logger.FINE,myAgent.getLocalName() +":ENVIA:REFUSE:"+cfp.getContent()); } returnfirstPropose; } @Override /** *Tratalosmensajesderechazosobreunapropuestaenviadaalcomprador */ protectedvoidhandleRejectProposal(ACLMessagecfp,ACLMessagepropose, ACLMessagereject){ logger.log(Logger.FINE,myAgent.getLocalName()+":Recibe:REJECT"); if(reject==null){ logger.log(Logger.FINE,myAgent.getLocalName() +":Responder:TIMEOUT"); } } @Override /** *Tratalosmensajesdeaceptacióndeunapropuestadecompraporpartedel *comprador. * *EnvíaunmensajeINFORMcuandoelsubastadoraceptalapropuestade *compra. * */ protectedACLMessagehandleAcceptProposal(ACLMessagecfp, ACLMessagepropose,ACLMessageaccept)throwsFailureException{ logger.log(Logger.FINE,myAgent.getName()+":Recibe:ACCEPT"); if(accept!=null){ ACLMessageinform=accept.createReply(); inform.setPerformative(ACLMessage.INFORM); inform.setContent(String.valueOf(estrategia.getPuja())); logger.log(Logger.FINE,myAgent.getLocalName() +":Envía:INFORM:"+puja); returninform; }else{ ACLMessagerefuse=cfp.createReply(); refuse.setPerformative(ACLMessage.REFUSE); refuse.setContent(String.valueOf(estrategia.getPuja())); logger.log(Logger.FINE,myAgent.getLocalName() +":Envía:REFUSE"); returnrefuse; } } /** *Compruebasilapujapropuestaporelagentecompradoresaceptableysi *elnúmeroderondasesmayoroigualqueelestablecidoentonces *incrementaelvalordelapujaaceptable * *@parampuja *Elpreciopropuestoporelagentevendedor *@return */ privatebooleanpujaAceptable(doublepuja){ if(puja<=estrategia.getPuja())

-84/106-

returntrue; if(estrategia.getContadorRondas()>=estrategia.getRondas() &&estrategia.getReserva()!=estrategia.getPuja()){ //Transcurridasnrodasseigualalapujaalpreciodereserva estrategia.setPuja(estrategia.getReserva()); logger.log(Logger.FINE,myAgent.getLocalName() +":seigualaelvalordelanuevapujaaceptablealdelareserva:" +estrategia.getReserva()); returnfalse; }else returnfalse;//Nointeresapujar }}

ClaseCompradorHolandesaIncrementoDinamicoBehaviourpackageuoc.sma.behaviours.estrategias;importuoc.sma.agentes.AgenteComprador;importuoc.sma.estrategias.ApuestaUnicaIncrementoDinamicoCfgImpl;importjade.core.Agent;importjade.domain.FIPAAgentManagement.FailureException;importjade.domain.FIPAAgentManagement.NotUnderstoodException;importjade.domain.FIPAAgentManagement.RefuseException;importjade.lang.acl.ACLMessage;importjade.proto.SSIteratedContractNetResponder;importjade.util.Logger;/***Estrategiadelcompradordelasubastaholandesaenlaqueenprincipioel*agenteconsiderapujarenlasubastaporelprecioconfiguradoensuatributo*Puja.Sisesuperaelnúmeroderondaspreestablecidoenlaestrategia*entoncesincrementaráelvalordeaceptacióndelapujaenunacantidadfija*siempreycuandonolleguealpreciodereserva.**@authorRodolfodeBenito**/@SuppressWarnings("serial")publicclassCompradorHolandesaIncrementoDinamicoBehaviourextends SSIteratedContractNetResponder{ privatefinalLoggerlogger=Logger.getMyLogger(this.getClass().getName()); privateAgenteCompradoragente; privateApuestaUnicaIncrementoDinamicoCfgImplestrategia; privatedoublepuja=0; publicCompradorHolandesaIncrementoDinamicoBehaviour(Agenta,ACLMessagecfp){ super(a,cfp); logger.setLevel(Logger.INFO); agente=(AgenteComprador)a; estrategia=(ApuestaUnicaIncrementoDinamicoCfgImpl)agente .getEstrategia(); }

-85/106-

@Override /** *Tratalaspropuestasdecompradelsubastastadoryenvíaunmensaje *PROPOSEencasoqueaceptelaofertadeventaounmensajeREFUSEsi *rechazalaoferta */ protectedACLMessagehandleCfp(ACLMessagecfp)throwsRefuseException, FailureException,NotUnderstoodException{ ACLMessagefirstPropose=cfp.createReply(); estrategia.setContadorRondas(estrategia.getContadorRondas()+1); puja=Double.parseDouble(cfp.getContent()); if(pujaAceptable(puja)){ //Seaceptalapuja firstPropose.setPerformative(ACLMessage.PROPOSE); logger.log(Logger.FINE,myAgent.getLocalName() +":ENVIA:PROPOSE:"+puja); firstPropose.setContent(String.valueOf(puja)); }else{ //Nopuja firstPropose.setPerformative(ACLMessage.REFUSE); logger.log(Logger.FINE,myAgent.getLocalName() +":ENVIA:REFUSE:"+cfp.getContent()); } returnfirstPropose; } @Override /** *Tratalosmensajesderechazosobreunapropuestaenviadaalcomprador */ protectedvoidhandleRejectProposal(ACLMessagecfp,ACLMessagepropose, ACLMessagereject){ logger.log(Logger.FINE,myAgent.getLocalName()+":Recibe:REJECT"); if(reject==null){ logger.log(Logger.FINE,myAgent.getLocalName() +":Responder:TIMEOUT"); } } @Override /** *Tratalosmensajesdeaceptacióndeunapropuestadecompraporpartedel *comprador. * *EnvíaunmensajeINFORMcuandoelsubastadoraceptalapropuestade *compra. * */ protectedACLMessagehandleAcceptProposal(ACLMessagecfp, ACLMessagepropose,ACLMessageaccept)throwsFailureException{ logger.log(Logger.FINE,myAgent.getLocalName()+":Recibe:ACCEPT"); if(accept!=null){ ACLMessageinform=accept.createReply(); inform.setPerformative(ACLMessage.INFORM); inform.setContent(String.valueOf(estrategia.getPuja())); logger.log(Logger.FINE,myAgent.getName()+":Envía:INFORM:" +puja); returninform; }else{

-86/106-

ACLMessagerefuse=cfp.createReply(); refuse.setPerformative(ACLMessage.REFUSE); refuse.setContent(String.valueOf(estrategia.getPuja())); logger.log(Logger.FINE,myAgent.getLocalName() +":Envía:REFUSE"); returnrefuse; } } /** *Compruebasilapujapropuestaporelagentecompradoresaceptableysi *elnúmeroderondasesmayoroigualqueelestablecidoentonces *incrementaelvalordelapujaaceptable * *@parampuja *Elpreciopropuestoporelagentevendedor *@return */ privatebooleanpujaAceptable(doublepuja){ if(puja<=estrategia.getPuja()) returntrue; if(estrategia.getContadorRondas()>=estrategia.getRondas()){ if((estrategia.getPuja()+estrategia.getIncremento())>estrategia .getReserva()){ //Lanuevapujaaceptablesuperaelpreciodereserva logger.log(Logger.FINE,myAgent.getLocalName() +":elvalordelanuevapujaaceptable" +(estrategia.getPuja()+estrategia.getIncremento()) +"superalareserva"+estrategia.getReserva()); returnfalse; }else{ //Calculalapujaaceptableparalanuevaronda estrategia.setPuja(estrategia.getPuja() +estrategia.getIncremento()); logger.log(Logger.FINE,myAgent.getLocalName() +":recalculandoelvalordelanuevapujaaceptablea:" +estrategia.getPuja() +estrategia.getIncremento()); returnfalse; } }else returnfalse;//Nointeresapujar }}

-87/106-

ClaseBuscadorBehaviourInitiatorpackageuoc.sma.behaviours;importjava.io.IOException;importjava.util.Vector;importuoc.sma.datos.Subasta;importjade.core.AID;importjade.core.Agent;importjade.domain.DFService;importjade.domain.FIPAException;importjade.domain.FIPANames;importjade.domain.FIPAAgentManagement.DFAgentDescription;importjade.domain.FIPAAgentManagement.ServiceDescription;importjade.lang.acl.ACLMessage;importjade.lang.acl.UnreadableException;importjade.proto.AchieveREInitiator;importjade.proto.AchieveREResponder;importjade.util.Logger;/***ComportamientodelAgentebuscador.FormapartedelprotocoloFIPA‐Brokering**Recibe:*‐MensajesdelAgenteCasaSubastas*quecontienenelresultadodelabúsqueda**Envía:*‐MensajesdepeticiónalAgenteCasaSubastas*solicitandounabúsquedadesubastas**‐MensajesderespuestaalAgenteComprador*conelresultadodelabúsqueda**@authorRodofodeBenito**/publicclassBuscadorBehaviourInitiatorextendsAchieveREInitiator{ privatefinalLoggerlogger=Logger.getMyLogger(this.getClass().getName()); privateAIDidCasaSubastas; publicBuscadorBehaviourInitiator(Agenta,ACLMessagemt){ super(a,mt); logger.setLevel(Logger.INFO); //LocalizaralAgentedeSubastasenlaspáginasamarillas DFAgentDescription[]aCasaSubastas=getCasaSubastas(); if(aCasaSubastas!=null) this.idCasaSubastas=aCasaSubastas[0].getName(); } /** *ConstruyelapreguntaalAgenteCasaSubastasenbaseala *preguntadelAgenteComprador */ protectedVectorprepareRequests(ACLMessagerequest){ //RecuperalapeticiónentrantedelDataStore StringclavePeticionEntrada=(String)((AchieveREResponder)parent).REQUEST_KEY; ACLMessagepeticionEntrada=(ACLMessage)getDataStore().get(clavePeticionEntrada);

-88/106-

//PreparalapeticiónparaenviarselaalAgenteCasaSubastas logger.log(Logger.FINE,"Agente"+myAgent.getLocalName() +":Redirigiendothepeticióna"+idCasaSubastas.getName()); ACLMessagepeticionSalida=newACLMessage(ACLMessage.QUERY_REF); peticionSalida.setProtocol(FIPANames.InteractionProtocol.FIPA_QUERY); peticionSalida.addReceiver(idCasaSubastas); peticionSalida.setContent(peticionEntrada.getContent()); peticionSalida.setReplyByDate(peticionEntrada.getReplyByDate()); Vectorv=newVector(1); v.addElement(peticionSalida); returnv; } protectedvoidhandleInform(ACLMessageinform){ guardarMensaje(ACLMessage.INFORM); } protectedvoidhandleRefuse(ACLMessagerefuse){ guardarMensaje(ACLMessage.FAILURE); } protectedvoidhandleNotUnderstood(ACLMessagenotUnderstood){ guardarMensaje(ACLMessage.FAILURE); } protectedvoidhandleFailure(ACLMessagefailure){ guardarMensaje(ACLMessage.FAILURE); } protectedvoidhandleAllResultNotifications(Vectornotificaciones){ if(notificaciones.size()==0){ //Timeout guardarMensaje(ACLMessage.FAILURE); } } /** *TratalosmensajesrecibidosygestionaelDatastore *pararecuperarlosmensajesrecibidosyalmacenar *mensajesderespuesta * *@paramperformative */ privatevoidguardarMensaje(intperformative){ Subastasubasta=null; if(performative==ACLMessage.INFORM){ logger.log(Logger.INFO,"Agente"+myAgent.getLocalName() +":Redirecciónconseguida"); }else{ logger.log(Logger.INFO,"Agente"+myAgent.getLocalName() +":Falloenlaredirección"); } //RecuperalapeticiónentrantedelDataStore.Elmensajedelagentecomprador StringclavePeticionEntrada=(String)((AchieveREResponder)parent).REQUEST_KEY; ACLMessagepeticionEntrada=(ACLMessage)getDataStore().get(clavePeticionEntrada); //RecuperadelDataStorelarespuestadelagenteCasaDeSubastas ACLMessagerespuestaCasaSubastas=(ACLMessage)getDataStore().get(REPLY_KEY); //PreparaelmensajeparaelAgenteCompradorylaalmacenaenelDataStore ACLMessagemensaje=peticionEntrada.createReply(); mensaje.setPerformative(performative); try{ if(respuestaCasaSubastas.getContentObject()!=null){

-89/106-

subasta=(Subasta)respuestaCasaSubastas.getContentObject(); mensaje.setContentObject(subasta); } }catch(IOExceptione){ e.printStackTrace(); }catch(UnreadableExceptione){ e.printStackTrace(); } Stringnotificationkey=(String)((AchieveREResponder)parent).RESULT_NOTIFICATION_KEY; getDataStore().put(notificationkey,mensaje); } /** *LocalizaalagenteCasaSubastasenlaspáginasamarillas *@return */ privateDFAgentDescription[]getCasaSubastas(){ DFAgentDescriptiontemplate=newDFAgentDescription(); DFAgentDescription[]result=null; ServiceDescriptionsd=newServiceDescription(); sd.setType("CasaDeSubastas"); template.addServices(sd); try{ result=DFService.search(myAgent,template); }catch(FIPAExceptionfe){ fe.printStackTrace(); } returnresult; }}

-90/106-

ClaseCompradorSuscribirBehaviourInitiatorpackageuoc.sma.behaviours;importjava.util.Vector;importuoc.sma.agentes.AgenteComprador;importjade.core.AID;importjade.core.Agent;importjade.lang.acl.ACLMessage;importjade.lang.acl.MessageTemplate;importjade.proto.SubscriptionInitiator;importjade.util.Logger;@SuppressWarnings("serial")/***Clasequemodelaelcomportamientodelcompradorcomosuscriptor*deunasubasta.**SigueelprotocoloFIPA‐SubscriptionconelroldeInitiator**/publicclassCompradorSuscribirBehaviourInitiatorextendsSubscriptionInitiator{ privatefinalLoggerlogger=Logger.getMyLogger(this.getClass().getName()); publicCompradorSuscribirBehaviourInitiator(Agentagente,ACLMessagemensaje){ super(agente,mensaje); logger.setLevel(Logger.INFO); } @Override /* *Seencargadecrearelmensajedesuscripciónparaunsubastador *determinadoyunasubastaconcreta */ protectedVectorprepareSubscriptions(ACLMessagesubscription){ subscription.addReceiver(((AgenteComprador)myAgent).getSubasta() .getAgenteSubastador());//Elidentificadordelsubastador subscription.setContent(String.valueOf(((AgenteComprador)myAgent) .getSubasta().getIdSubasta()));//Eliddelasubastaalaquesesuscribe logger.log(Logger.FINE,"Agente"+myAgent.getLocalName() +":Creandomensajedesuscripcion"+subscription); returnsuper.prepareSubscriptions(subscription); } protectedvoidhandleAgree(ACLMessageinform){ logger.log(Logger.FINE,myAgent.getLocalName() +":Solicitudaceptada."); } protectedvoidhandleRefuse(ACLMessageinform){ logger.log(Logger.FINE,myAgent.getLocalName() +":Solicitudrechazada."); } protectedvoidhandleInform(ACLMessageinform){ logger.log(Logger.FINE,myAgent.getLocalName()+":Informerecibido:" +inform.getContent()+"\n"); }

-91/106-

protectedvoidhandleFailure(ACLMessagefailure){ //SecompruebasielfallovienedelAMSodeotroagente. if(failure.getSender().equals(myAgent.getAMS())){ logger.log(Logger.INFO,myAgent.getLocalName() +":Elagentenoexiste."); }else{ logger.log(Logger.INFO,myAgent.getLocalName()+":Elagente" +failure.getSender().getName() +"fallóalintentarrealizarlaacciónsolicitada.\n"); } } publicvoidcancellationCompleted(AIDagente){ //Secreaunaplantillaparasolorecibirlosmensajesdelagentequevaacancelarlasuscripción MessageTemplatetemplate=MessageTemplate.MatchSender(agente); ACLMessagemsg=myAgent.blockingReceive(template); //Secompruebaquetipodemensajellega:INFORMoFAILURE if(msg.getPerformative()==ACLMessage.INFORM) logger.log(Logger.INFO,myAgent.getLocalName() +":Suscripcioncanceladaconelagente" +agente.getLocalName()+"\n"); else logger.log(Logger.INFO,myAgent.getLocalName() +":Sehaproducidounfalloenlacancelaciónconelagente" +agente.getLocalName()+"\n"); }}

ClaseSubastadorTransaccionesBehaviourInitiatorpackageuoc.sma.behaviours;importjade.core.Agent;importjade.lang.acl.ACLMessage;importjade.proto.AchieveREInitiator;/***ComportamientodelAgentebuscador*implementaFIPA‐Query**SeutilizaparaenviarlatransacciónquedeberegistrarelagenteCasSubastas***@authorRodofodeBenito*/publicclassSubastadorTransaccionesBehaviourInitiatorextendsAchieveREInitiator{ publicSubastadorTransaccionesBehaviourInitiator(Agenta,ACLMessagemt){ super(a,mt); }}

-92/106-

ClaseBuscadorBehaviourResponderpackageuoc.sma.behaviours;importjade.core.Agent;importjade.domain.FIPAAgentManagement.NotUnderstoodException;importjade.domain.FIPAAgentManagement.RefuseException;importjade.lang.acl.ACLMessage;importjade.lang.acl.MessageTemplate;importjade.proto.AchieveREResponder;importjade.util.Logger;/***ComportamientodelAgentebuscadorqueformapartedelprotocoloFIPA‐Brokering**Envía:*‐MensajesderespuestaAGREEalAgenteCompradorcuandorecibeuna*peticióndebúsqueda***@authorRodofodeBenito**/publicclassBuscadorBehaviourResponderextendsAchieveREResponder{ privatefinalLoggerlogger=Logger.getMyLogger(this.getClass().getName()); publicBuscadorBehaviourResponder(Agenta,MessageTemplatemt){ super(a,mt); logger.setLevel(Logger.INFO); } protectedACLMessageprepareResponse(ACLMessagerequest) throwsNotUnderstoodException,RefuseException{ logger.log(Logger.FINE,"Agente"+myAgent.getLocalName() +":Peticiónrecibidade"+request.getSender().getName() +".Laacciónes "+request.getContent()); ACLMessageagree=request.createReply(); agree.setPerformative(ACLMessage.AGREE); returnagree; }}

-93/106-

ClaseCasaSubastasBusquedasBehaviourResponderpackageuoc.sma.behaviours;importjava.io.IOException;importuoc.sma.agentes.AgenteCasaSubastas;importuoc.sma.datos.Subasta;importjade.core.Agent;importjade.domain.FIPAAgentManagement.FailureException;importjade.domain.FIPAAgentManagement.NotUnderstoodException;importjade.domain.FIPAAgentManagement.RefuseException;importjade.lang.acl.ACLMessage;importjade.lang.acl.MessageTemplate;importjade.proto.AchieveREResponder;importjade.util.Logger;/***ComportamientodelAgenteCasaSubastasqueseencargaderesponderala*peticióndebúsquedasdesubastasdelAgenteBuscador**ImplementaFIPa‐QueryconelroldeParticipant**@authorRodolfodeBenito**/@SuppressWarnings("serial")publicclassCasaSubastasBusquedasBehaviourResponderextendsAchieveREResponder{ privatefinalLoggerlogger=Logger.getMyLogger(this.getClass().getName()); publicCasaSubastasBusquedasBehaviourResponder(Agenta,MessageTemplatemt){ super(a,mt); logger.setLevel(Logger.FINE); } /** *Preparaelmensajederespuestaalagentebuscadorconfirmandoqueha *recibidolapeticióndebúsqueda */ protectedACLMessageprepareResponse(ACLMessagerequest) throwsNotUnderstoodException,RefuseException{ logger.log(Logger.FINE,"Agente"+myAgent.getLocalName() +":Peticiónrecibidade"+request.getSender().getName() +".Acciónes"+request.getContent()); logger.log(Logger.FINE,"Agente"+myAgent.getLocalName()+":Agree"); ACLMessageagree=request.createReply(); agree.setPerformative(ACLMessage.AGREE); returnagree; } /** *Preparaelmensagederespuestaalagentebuscadorconelresultadodela *búsqueda */ protectedACLMessageprepareResultNotification(ACLMessagerequest, ACLMessageresponse)throwsFailureException{ logger.log(Logger.FINE,"Agente"+myAgent.getLocalName() +":Búsquedarealizadasatisfactoriamente"); Subastas=((AgenteCasaSubastas)myAgent).getSubasta(request .getContent().toUpperCase());

-94/106-

ACLMessageinform=request.createReply(); inform.setPerformative(ACLMessage.INFORM); try{ inform.setContentObject(s); }catch(IOExceptione){ e.printStackTrace(); } returninform; }}

ClaseSubastadorSuscribirBehaviourResponderpackageuoc.sma.behaviours;importuoc.sma.agentes.AgenteSubastador;importjade.core.Agent;importjade.domain.FIPAAgentManagement.NotUnderstoodException;importjade.lang.acl.ACLMessage;importjade.lang.acl.MessageTemplate;importjade.proto.SubscriptionResponder;importjade.util.Logger;/***ProcesalosmensajesrelacionadosconlasuscripcióndeAgentesCompradoresaunasubasta**ImplementaelprotocoloFIPA‐SubscribeconelroldeParticipant**@authorRodolfodeBenito**/@SuppressWarnings("serial")publicclassSubastadorSuscribirBehaviourResponderextendsSubscriptionResponder{ privatefinalLoggerlogger=Logger.getMyLogger(this.getClass().getName()); publicSubastadorSuscribirBehaviourResponder(Agenta,MessageTemplatemt, SubscriptionManagersm){ super(a,mt,sm); logger.setLevel(Logger.INFO); } privateSubscriptionsuscripcion; /** *Métodoquegestionalasuscripcionaceptando/rechazandolas *propuestasdesuscripciónalasubasta */ protectedACLMessagehandleSubscription(ACLMessagepropuesta) throwsNotUnderstoodException{ logger.log(Logger.FINE,myAgent.getLocalName() +":SUSCRIBErecibidode" +propuesta.getSender().getLocalName()+"\n"); logger.log(Logger.FINE,myAgent.getLocalName() +"LapropuestaessuscribirsealasubastasId:" +myAgent.getLocalName(),propuesta.getContent()+"\n"); //Compruebalosdatosdelapropuesta if(((AgenteSubastador)myAgent).compruebaMensaje(propuesta .getContent())){ //Crealasuscripcion this.suscripcion=this.createSubscription(propuesta);

-95/106-

try{ //ElSubscriptionManagerregistralasuscripcion this.mySubscriptionManager.register(suscripcion); }catch(Exceptione){ logger.log(Logger.FINE,myAgent.getLocalName() +":Errorenelregistrodelasuscripción."); } //Aceptalapropuestaylaenvía ACLMessageagree=propuesta.createReply(); agree.setPerformative(ACLMessage.AGREE); returnagree; }else{ //Rechazalapropuestaylaenvía logger.log(Logger.FINE,myAgent.getLocalName() +":Rechazalapropuestadesuscripción."); ACLMessagerefuse=propuesta.createReply(); refuse.setPerformative(ACLMessage.REFUSE); returnrefuse; } } /** *Gestionalacancelacióndelasubasta */ protectedACLMessagehandleCancel(ACLMessagecancelacion){ logger.log(Logger.FINE,myAgent.getLocalName() +"%s:CANCELrecibidode" +cancelacion.getSender().getLocalName()+"\n"); try{ //ElSubscriptionManagereliminadelregistrolasuscripcion this.mySubscriptionManager.deregister(this.suscripcion); }catch(Exceptione){ logger.log(Logger.FINE,myAgent.getLocalName() +":Errorenlaoperacióndeanluarlasuscripcióndelasuscripción."); } //Aceptalacancelaciónyresponde ACLMessagecancela=cancelacion.createReply(); cancela.setPerformative(ACLMessage.INFORM); returncancela; }}

-96/106-

ClaseCasaSubastasTransaccionesBehaviourResponderpackageuoc.sma.behaviours;importuoc.sma.agentes.AgenteCasaSubastas;importuoc.sma.datos.Transaccion;importjade.core.Agent;importjade.domain.FIPAAgentManagement.NotUnderstoodException;importjade.domain.FIPAAgentManagement.RefuseException;importjade.lang.acl.ACLMessage;importjade.lang.acl.MessageTemplate;importjade.lang.acl.UnreadableException;importjade.proto.AchieveREResponder;importjade.util.Logger;/***ComportamientodelAgenteCasaSubastasqueseencargadeatenderlas*peticionesdeinserccióndeunatransacciónenelhistorialdetransacciones**ImplementaFIPA‐QueryconelroldeParticipant**@authorRodolfodeBenito**/@SuppressWarnings("serial")publicclassCasaSubastasTransaccionesBehaviourResponderextendsAchieveREResponder{ privatefinalLoggerlogger=Logger.getMyLogger(this.getClass().getName()); publicCasaSubastasTransaccionesBehaviourResponder(Agenta, MessageTemplatemt){ super(a,mt); logger.setLevel(Logger.INFO); } /** *Atiendelosmensajesdepeticiónderegistrodeunatrnasacción *procedentesdeunagentesubastador */protectedACLMessagehandleRequest(ACLMessagerequest)throwsNotUnderstoodException,RefuseException{ Transacciont=null; try{ t=(Transaccion)request.getContentObject(); logger.log(Logger.FINE,"Agente"+myAgent.getLocalName() +":Peticiónrecibidade"+request.getSender().getName() +".Transacción"+t); }catch(UnreadableExceptione){ e.printStackTrace(); } //Registralatransacción ((AgenteCasaSubastas)myAgent).addTransaccion(t); logger.log(Logger.FINE,"Agente"+myAgent.getLocalName()+":Agree"); ACLMessageagree=request.createReply(); agree.setPerformative(ACLMessage.AGREE); returnagree; }}

-97/106-

InterfaceICfgApuestapackageuoc.sma.estrategias;importjade.core.behaviours.Behaviour;/***Encapsulalaestrategiaqueseguiráelagentecomprador**Lafinalidaddeesteinterfaceesserimplementadoporlas*clasesquerepresentanlasdiferentesestrategiasqueseguirá*elagentecomprador.**@authorRodolfodeBenitoArango**/publicinterfaceICfgApuesta{ /** *Estableceelcomportamientoenelagentecomprador *queselepasacomoreferencia * *@paramagente */ publicvoidsetComportamiento(Behaviourcomportamiento); /** *Retornaunareferenciaalcomportamientooestrategiaque *seguiráelcomprador * *@return */ publicBehaviourgetComportamiento();}

-98/106-

InterfaceICfgSubastapackageuoc.sma.estrategias;importjade.core.behaviours.Behaviour;/***Encapsulalaestrategiaqueseguiráelagentesubastador**Lafinalidaddeesteinterfaceesserimplementadoporlas*clasesquerepresentanlostiposdesubastas.**@authorRodolfodeBenitoArango**/publicinterfaceICfgSubasta{ /** *Estableceelcomportamientoenelagentesubastador *queselepasacomoreferencia * *@paramagente */ publicvoidsetComportamiento(Behaviourcomportamiento); /** *Retornaunareferenciaalcomportamientooestrategiaque *seguiráelsubastador * *@return */ publicBehaviourgetComportamiento();}

ClaseIncrementalCfgImplpackageuoc.sma.estrategias;importuoc.sma.behaviours.estrategias.CompradorInglesaIncrementalBehaviour;importjade.core.behaviours.Behaviour;/***Encapsulalaestrategiadeunapujainicialquecadaciertotiempo*sevaincrementandoenunacantidadfijasinquelapujalleguea*superarelpreciodereservamarcadoporelcomprador**@authorRodolfodeBenito**/publicclassIncrementalCfgImplimplementsICfgApuesta{ publicfinalintINCREMENTOARITMETICO=0; publicfinalintINCREMENTOGEOMETRICO=1; privateinttipoIncremento; privatedoubleincremento;//Incrementodelapuja privatedoublepuja; privatedoublereserva;//Lapujamáximaalaquellegaráelagente privateCompradorInglesaIncrementalBehaviourcomportamiento; publicIncrementalCfgImpl(inttipoIncemento,doubleincremento, doublepuja,doublereserva){

-99/106-

super(); this.tipoIncremento=tipoIncemento; this.incremento=incremento; this.puja=puja; this.reserva=reserva; } publicBehaviourgetComportamiento(){ returncomportamiento; } publicvoidsetComportamiento(Behaviourcomportamiento){ this.comportamiento=(CompradorInglesaIncrementalBehaviour)comportamiento; } publicintgetTipoIncemento(){ returntipoIncremento; } publicvoidsetTipoIncemento(inttipoIncemento){ this.tipoIncremento=tipoIncemento; } publicdoublegetIncremento(){ returnincremento; } publicvoidsetIncremento(doubleincremento){ this.incremento=incremento; } publicdoublegetPuja(){ returnpuja; } publicvoidsetPuja(doublepuja){ this.puja=puja; } publicdoublegetReserva(){ returnreserva; } publicvoidsetReserva(doublereserva){ this.reserva=reserva; } }

ClaseApuestaUnicaNRondasCfgImplpackageuoc.sma.estrategias;importuoc.sma.behaviours.estrategias.CompradorHolandesaNRondasBehaviour;importjade.core.behaviours.Behaviour;

-100/106-

/***Encapsulalaestrategiadeunaúnicapuja**EnprincipioelagenteconsiderapujarenlasubastaporelprecioconfiguradoensuatributoPuja*Sisesuperaelnúmeroderondas"Rondas"entonceselvalordeaceptacióndelapujaseráel*desupreciodereserva**@authorRodolfodeBenito**/publicclassApuestaUnicaNRondasCfgImplimplementsICfgApuesta{ privatedoubleincremento;//Incrementodelvalordeaceptacióndelapuja privatedoublepuja;//Valordeaceptaciónporelqueestádispuestoapujarsinosealcanzaelnúmeroderondasestipulado privatedoublereserva;//Lapujamáximaalaquellegaráelagente privateintrondas;//Númeroderondasqueesperaráparasubirelvalordeaceptacióndelapuja privateintcontadorRondas;//Contabilizaelnúmeroderondasquellevauncompradorenunasubasta privateCompradorHolandesaNRondasBehaviourcomportamiento; publicApuestaUnicaNRondasCfgImpl(doubleincremento,doublepuja,doublereserva,introndas){ super(); this.incremento=incremento; this.puja=puja; this.reserva=reserva; this.rondas=rondas; this.contadorRondas=0; } publicBehaviourgetComportamiento(){ returncomportamiento; } publicvoidsetComportamiento(Behaviourcomportamiento){ this.comportamiento=(CompradorHolandesaNRondasBehaviour)comportamiento; } publicintgetRondas(){ returnrondas; } publicvoidsetRondas(introndas){ this.rondas=rondas; } publicdoublegetIncremento(){ returnincremento; } publicvoidsetIncremento(doubleincremento){ this.incremento=incremento; } publicdoublegetPuja(){ returnpuja; } publicvoidsetPuja(doublepuja){

-101/106-

this.puja=puja; } publicdoublegetReserva(){ returnreserva; } publicvoidsetReserva(doublereserva){ this.reserva=reserva; } publicintgetContadorRondas(){ returncontadorRondas; } publicvoidsetContadorRondas(intcontadorRondas){ this.contadorRondas=contadorRondas; } }

ClaseApuestaUnicaIncrementoDinamicoCfgImplpackageuoc.sma.estrategias;importuoc.sma.behaviours.estrategias.CompradorHolandesaIncrementoDinamicoBehaviour;importjade.core.behaviours.Behaviour;/***Encapsulalaestrategiadeunaúnicapuja**EnprincipioelagenteconsiderapujarenlasubastaporelprecioconfiguradoensuatributoPuja*Sisesuperaelnúmeroderondas"Rondas"entoncesincrementaráelvalordeaceptacióndelapuja*siempreycuandonolleguealpreciodereserva**@authorRodolfodeBenito**/publicclassApuestaUnicaIncrementoDinamicoCfgImplimplementsICfgApuesta{ privatedoubleincremento;//Incrementodelvalordeaceptacióndelapuja privatedoublepuja;//Valordeaceptaciónporelqueestádispuestoapujarsinosealcanzaelnúmeroderondasestipulado privatedoublereserva;//Lapujamáximaalaquellegaráelagente privateintrondas;//Númeroderondasqueesperaráparasubirelvalordeaceptacióndelapuja privateintcontadorRondas;//Contabilizaelnúmeroderondasquellevauncompradorenunasubasta privateCompradorHolandesaIncrementoDinamicoBehaviourcomportamiento; publicApuestaUnicaIncrementoDinamicoCfgImpl(doubleincremento,doublepuja,doublereserva,introndas){ super(); this.incremento=incremento; this.puja=puja; this.reserva=reserva; this.rondas=rondas; this.contadorRondas=0; } publicBehaviourgetComportamiento(){ returncomportamiento; }

-102/106-

publicvoidsetComportamiento(Behaviourcomportamiento){ this.comportamiento=(CompradorHolandesaIncrementoDinamicoBehaviour)comportamiento; } publicintgetRondas(){ returnrondas; } publicvoidsetRondas(introndas){ this.rondas=rondas; } publicdoublegetIncremento(){ returnincremento; } publicvoidsetIncremento(doubleincremento){ this.incremento=incremento; } publicdoublegetPuja(){ returnpuja; } publicvoidsetPuja(doublepuja){ this.puja=puja; } publicdoublegetReserva(){ returnreserva; } publicvoidsetReserva(doublereserva){ this.reserva=reserva; } publicintgetContadorRondas(){ returncontadorRondas; } publicvoidsetContadorRondas(intcontadorRondas){ this.contadorRondas=contadorRondas; }}

-103/106-

ClaseSubastaHolandesaImplpackageuoc.sma.estrategias;importuoc.sma.behaviours.estrategias.SubastadorHolandesaBehaviour;importjade.core.behaviours.Behaviour;/***EncapsulalaconfiguracióndelasubastaHolandesa**@authorRodolfodeBenitoArango**/publicclassSubastaHolandesaImplimplementsICfgSubasta{ privateSubastadorHolandesaBehaviourcomportamiento; publicBehaviourgetComportamiento(){ returncomportamiento; } publicvoidsetComportamiento(Behaviourcomportamiento){ this.comportamiento=(SubastadorHolandesaBehaviour)comportamiento; }}

ClaseSubastaInglesaImplpackageuoc.sma.estrategias;importuoc.sma.behaviours.estrategias.SubastadorInglesaBehaviour;importjade.core.behaviours.Behaviour;/***EncapsulalaconfiguracióndelasubastaInglesa**@authorRodolfodeBenitoArango**/publicclassSubastaInglesaImplimplementsICfgSubasta{ privateSubastadorInglesaBehaviourcomportamiento; publicBehaviourgetComportamiento(){ returncomportamiento; } publicvoidsetComportamiento(Behaviourcomportamiento){ this.comportamiento=(SubastadorInglesaBehaviour)comportamiento; }}

-104/106-

ClaseSubastapackageuoc.sma.datos;importjade.core.AID;importjade.lang.acl.ACLMessage;importjade.util.leap.Serializable;importjava.util.ArrayList;importjava.util.Date;/***Clasequeencapsulalosdatospropiosdelasubasta**@authorRodolfodeBenito*/publicclassSubastaimplementsSerializable{ publicstaticfinalintSUBASTA_INGLESA=1; publicstaticfinalintSUBASTA_HOLANDESA=2; privatestaticfinallongserialVersionUID=1L; privateintidSubasta; privateDatefechaInicio; privateAIDagenteSubastador; privateStringobjetoSubastado; privatedoubleprecio; privatedoubleprecioReserva; privatebooleanactiva; privateinttipoSubasta; privateAIDganador; privateACLMessagemsgMejorOferta; privateArrayList<AID>suscriptores; publicSubasta(intidSubasta,DatefechaInicio,StringobjetoSubastado, doubleprecio,doubleprecioReserva,booleanactiva,inttipoSubasta){ super(); this.idSubasta=idSubasta; this.fechaInicio=fechaInicio; this.objetoSubastado=objetoSubastado; this.precio=precio; this.precioReserva=precioReserva; this.activa=activa; this.tipoSubasta=tipoSubasta; suscriptores=newArrayList<AID>(); } publicACLMessagegetMsgMejorOferta(){ returnmsgMejorOferta; } publicvoidsetMsgMejorOferta(ACLMessagemsgMejorOferta){ this.msgMejorOferta=msgMejorOferta; } publicdoublegetPrecio(){ returnprecio; } publicvoidsetPrecio(doubleprecio){ this.precio=precio; }

-105/106-

publicintgetIdSubasta(){ returnidSubasta; } publicvoidsetIdSubasta(intidSubasta){ this.idSubasta=idSubasta; } publicDategetFechaInicio(){ returnfechaInicio; } publicvoidsetFechaInicio(DatefechaInicio){ this.fechaInicio=fechaInicio; } publicStringgetObjetoSubastado(){ returnobjetoSubastado; } publicvoidsetObjetoSubastado(StringobjetoSubastado){ this.objetoSubastado=objetoSubastado; } publicdoublegetPrecioReserva(){ returnprecioReserva; } publicvoidsetPrecioReserva(doubleprecioReserva){ this.precioReserva=precioReserva; } publicbooleanisActiva(){ returnactiva; } publicvoidsetActiva(booleanactiva){ this.activa=activa; } publicintgetTipoSubasta(){ returntipoSubasta; } publicvoidsetTipoSubasta(inttipoSubasta){ this.tipoSubasta=tipoSubasta; } publicAIDgetAgenteSubastador(){ returnagenteSubastador; } publicvoidsetAgenteSubastador(AIDagenteSubastador){ this.agenteSubastador=agenteSubastador; } publicAIDgetGanador(){ returnganador; } publicvoidsetGanador(AIDganador){ this.ganador=ganador; } publicArrayList<AID>getSuscriptores(){ returnsuscriptores; } publicvoidsetSuscriptores(ArrayList<AID>suscriptores){ this.suscriptores=suscriptores; } @Override publicStringtoString(){ Stringcadena; cadena="SubastaId:"+getIdSubasta()+""+getObjetoSubastado()+"Precio:"+getPrecio()+"Inicio:"+getFechaInicio(); returncadena; }}

-106/106-

ClaseTransacciónpackageuoc.sma.datos;importjava.io.Serializable;importjava.util.Date;/***Encapsulalosdatosdeunatransacciónuoperaciónrealizadaenunasubasta*@authorRodolfodeBenito*/publicclassTransaccionimplementsSerializable{ privateDatefecha; privateintidSubasta; privateStringagente; privateStringoperación; privatedoublevalor; publicstaticfinalStringPUJA="PUJA"; publicstaticfinalStringOFERTA="OFERTA"; publicstaticfinalStringINICIO="INICIO"; publicstaticfinalStringFIN="FIN"; publicTransaccion(Datefecha,intidSubasta,Stringagente,Stringoperación,doublevalor){ super(); this.fecha=fecha; this.idSubasta=idSubasta; this.agente=agente; this.operación=operación; this.valor=valor; } publicDategetFecha(){ returnfecha; } publicvoidsetFecha(Datefecha){ this.fecha=fecha; } publicintgetIdSubasta(){ returnidSubasta; } publicvoidsetIdSubasta(intidSubasta){ this.idSubasta=idSubasta; } publicStringgetAgente(){ returnagente; } publicvoidsetAgente(Stringagente){ this.agente=agente; } publicStringgetOperación(){ returnoperación; } publicvoidsetOperación(Stringoperación){ this.operación=operación; } publicdoublegetValor(){ returnvalor; } publicvoidsetValor(doublevalor){ this.valor=valor; } publicStringtoString(){ Stringcadena="TransacciónFecha:"+getFecha()+"Id.subasta:"+getIdSubasta()+"Agente:" +getAgente()+"Operación:"+getOperación()+"Valor:"+getValor(); returncadena; }}