Está en la página 1de 20

Introduccin al modelado y simulacin con Mason

Juan Pavn Mestras jpavon@fdi.ucm.es Universidad Complutense Madrid

http://grasia.fdi.ucm.es

Este tutorial se ha desarrollado como parte del proyecto SiCoSSys, subvencionado por el Ministerio de Ciencia e Innovacin TIN2008-06464-C03

Mason

Multi-Agent Simulator Of Neighborhoods... or Networks... or something... Librera Java de simulacin multi-agente de eventos discretos

Desarrollado conjuntamente por el Evolutionary Computation Laboratory y el Center for Social Complexity, ambos de la George Mason University

Informacin y descargas: http://cs.gmu.edu/~eclab/projects/mason/

Juan Pavn - UCM 2011

Mason

Caractersticas

100% Java (1.3 o ms) Eficiente y portable (ncleo pequeo) Modelos independientes de la visualizacin, que se puede aadir, quitar o cambiar en cualquier momento Los modelos se pueden parar y continuar, incluso migrando dinmicamente entre varias plataformas Se pueden reproducir resultados idnticos entre plataformas Los modelos son autocontenidos y pueden ejecutarse en otros frameworks y aplicaciones Java (p.ej. como applets) Visualizacin 2D y 3D Se pueden generar diagramas, grficos, flujos de datos, imgenes y pelculas Quicktime de la simulacin

Juan Pavn - UCM 2011

Mason

Instalacin

Descargar el software

http://cs.gmu.edu/~eclab/projects/mason/mason.zip

Adicionalmente

Para 3D: instalar el framework Java3D Para generar pelculas o grficos de la simulacin, cargar varias libreras adicionales:

http://cs.gmu.edu/~eclab/projects/mason/libraries.zip Que comprende JFreeChart, iText, y el Java Media Framework

Documentacin:

Manual: http://cs.gmu.edu/~eclab/projects/mason/manual.pdf En lnea: http://cs.gmu.edu/~eclab/projects/mason/docs/


Mason

Juan Pavn - UCM 2011

Mason con Eclipse


Crear un proyecto Java normalmente En libreras


Add user library La primera vez User Libraries-> New


Dar un nombre: Mason Add JARs para aadir los .jar de las libreras de Mason

Las dems veces que se cree un proyecto Mason basta con incluir la librera Mason

Trabajar como con cualquier proyecto Java

Juan Pavn - UCM 2011

Mason

Definicin de libreras Mason en Eclipse

Juan Pavn - UCM 2011

Mason

Objetivos de diseo de Mason

Posibilidad de ejecutar muchos tipos de simulaciones


Sistemas sociales complejos Modelado fsico Inteligencia artificial

Eficiente con grandes nmeros de agentes Garantizar la duplicabilidad de los resultados cientficos Alto grado de modularidad y flexibilidad Ncleo pequeo y fcil de entender Separar las herramientas de visualizacin Check-pointing y recuperacin

Juan Pavn - UCM 2011

Mason

Arquitectura en capas

Utilidades Core model library Herramientas de visualizacin Capas de simulacin personalizadas Aplicaciones de simulacin

Juan Pavn - UCM 2011

Mason

Checkpointing y recuperacin

Juan Pavn - UCM 2011

Mason

Arquitectura
Clara separacin de Modelo y Vista

(patrn MVC)

Juan Pavn - UCM 2011

Mason

10

Modelo

El modelo est encapsulado en el objeto sim.engine.SimState que contiene

Un planificador (sim.engine.Schedule) de eventos discretos, que planifica: Agentes Fields: representan el espacio
Un field es una estructura de datos que relaciona objetos y valores Existen campos ya construidos:
Networks continuous space Grids

1. 2.

Generador de nmeros aleatorios


Instancia de la clase ec.util.MersenneTwisterFast

Juan Pavn - UCM 2011

Mason

11

Vista

Herramientas de visualizacin 2D y 3D Plug-ins para visualizacin adicional (p.ej. GIS) Una vista se encapsula en un objeto asim.display.GUIState, que contiene:

Un objeto controller para iniciar, parar, etc. el planificador


El ms comn es la ventana console

El controlador maneja varias ventanas llamadas displays, que hacen la visualizacin 2D o 3D Los displays muestran los campos usando uno o ms field portrayals
Un field protrayal puede visualizar objetos individuales o valores de los campos llamando a un simple portrayal que est diseado para mostrar ese objeto o valor particular

inspectors permiten ver detalles de esos objetos


Mason

Juan Pavn - UCM 2011

12

Utilidades

Componentes adicionales que facilitan el diseo de modelos y la ejecucin de la simulacin:


Distribuciones de nmeros aleatorios Colecciones de objetos Objetos para inspeccionar Java Bean Properties GUI widgets Generacin de pelculas y fotografas de la simulacin

Externas:

GeoMason: GIS extensions to MASON Rigid-body 2D Physics Social Networks

Juan Pavn - UCM 2011

Mason

13

Ejecucin

Desde lnea de comandos


La simulacin es un programa Java que usa las libreras Mason Pueden ejecutarse como applets (p.ej. web de Mason)

Desde la consola Mason

Juan Pavn - UCM 2011

Mason

14

Ejemplo

Patio del colegio


Cap. 2 del manual de Mason (Student Schoolyard Cliques) Una red social en un espacio bi-dimensional continuo que representa el patio de un colegio y el colegio en el centro

Juan Pavn - UCM 2011

Mason

15

El modelo: clase Students


import sim.engine.*; import sim.util.*; import sim.field.continuous.*; Todos los modelos heredan de sim.engine.SimState

public class Studentsextends SimState{ public Continuous2Dyard =new Continuous2D(1.0,100,100); public int numStudents =50; public Students(long seed){ super(seed); } La clase sim.engine.SimState usa un generador de nmeros aleatorios de Mason

public void start(){ super.start(); //cleartheyard yard.clear(); //addsomestudentstotheyard for(int i=0;i<numStudents;i++){ Studentstudent=new Student(); yard.setObjectLocation(student, new Double2D(yard.getWidth()*0.5+random.nextDouble() 0.5, yard.getHeight()*0.5+random.nextDouble() 0.5)); } }
Juan Pavn - UCM 2011 Mason

16

El modelo: inicializacin
import sim.engine.*; import sim.util.*; import sim.field.continuous.*; public class Studentsextends SimState { public Continuous2Dyard =new Continuous2D(1.0,100,100); public int numStudents =50; public Students(long seed){ super(seed); Inicializacin del modelo } public void start(){ Crea agentes y los coloca en super.start(); un espacio //clear the yard yard.clear(); //addsomestudentstotheyard for(int i=0;i<numStudents;i++){ Student student =new Student(); yard.setObjectLocation(student, new Double2D(yard.getWidth()*0.5+random.nextDouble() 0.5, yard.getHeight()*0.5+random.nextDouble() 0.5)); } }
Juan Pavn - UCM 2011 Mason

17

Mtodo main

Cmo arrancar una simulacin:


public static void main(String[]args){ doLoop(Students.class,args); System.exit(0); }
Ejecuta el bucle de la simulacin:
1.

Crea una intancia del modelo (subclase de SimState) e inicializa el generador de nmeros aleatorios con una semilla (p.ej. la hora actual) Llama el mtodo start() del modelo Llama repetidamente el mtodo step(SimState state) del planificador, que llamar a cada uno de los agentes (mtodo step) Cuando no quedan agentes o al cabo de N iteraciones, llama al mtodo finish() por si hubiera que hacer alguna limpieza

Acaba con todos los threads

2. 3.

4.

Juan Pavn - UCM 2011

Mason

18

Otra forma de escribir el mtodo main

public static void main(String[]args){ SimStatestate= new Students(System.currentTimeMillis()); state.start(); do if (!state.schedule.step(state))break; while(state.schedule.getSteps()<5000); state.finish(); System.exit(0); }

Juan Pavn - UCM 2011

Mason

19

El espacio
import sim.engine.*; import sim.util.*; import sim.field.continuous.*;

Declaracin de un tipo de field

public class Studentsextends SimState { public Continuous2Dyard =new Continuous2D(1.0,100,100); public int numStudents =50; public Students(long seed){ super(seed); } Campo 100x100

public void start(){ super.start(); Utilizacin del field //clear the yard yard.clear(); //addsomestudentstotheyard for(inti=0;i<numStudents;i++){ Student student =new Student(); yard.setObjectLocation(student, new Double2D(yard.getWidth()*0.5+random.nextDouble() 0.5, yard.getHeight()*0.5+random.nextDouble() 0.5)); } }
Juan Pavn - UCM 2011 Mason

20

Ejecucin con estudiantes que no hacen nada

Agentes Student que no hacen nada de nada:


public class Student { }

Al ejecutar se obtiene lo siguiente:


MASON Version 16. For further options, try adding ' -help' at end. Job: 0 Seed: 1321985637326 Starting Students Exhausted

Juan Pavn - UCM 2011

Mason

21

Agentes con algo de comportamiento


public class Studentimplements Steppable{
Para que se pueda llamar por el planificador

public void step(SimStatestate){ Obtiene su localizacin Studentsstudents=(Students)state; Mtodo step: se le pasa el Continuous2Dyard=students.yard; estado (el Double2Dme=students.yard.getObjectLocation(this); modelo) //addinavectortothe"teacher" thecenteroftheyard MutableDouble2DsumForces=new MutableDouble2D(); Considera sumForces.addIn(new Double2D((yard.width *0.5 me.x)* una fuerza students.forceToSchoolMultiplier, de atraccin (yard.height*0.5 me.y)*students.forceToSchoolMultiplier)); hacia el // addabitofrandomness centro y se sumForces.addIn(new Double2D(students.randomMultiplier * mueve (students.random.nextDouble()*1.0 0.5), aadiendo tambin un students.randomMultiplier *(students.random.nextDouble()*1.0 factor 0.5))); aleatorio sumForces.addIn(me); students.yard.setObjectLocation(this,new Double2D(sumForces)); } } Se mueve a la nueva localizacin
Juan Pavn - UCM 2011 Mason

22

Pasar los agentes al planificador


public void start(){ super.start(); //clear the yard yard.clear(); //addsomestudentstotheyard for(int i=0;i<numStudents;i++){
Planifica el llamar al mtodo Student student =new Student();

yard.setObjectLocation(student, 1.0 unidades de tiempo newDouble2D(yard.getWidth()*0.5+

step() del agente Student cada

random.nextDouble() 0.5, cada paso de tiempo se elegirn


en orden aleatorio

Como no se especifica prioridad,

yard.getHeight()*0.5+random.nextDouble()0.5)); schedule.scheduleRepeating(student); } }
Juan Pavn - UCM 2011 Mason

23

Ejecucin con estudiantes que hacen algo

Al ejecutar se obtiene lo siguiente:

MASON Version 16. For further options, try adding ' -help' at end. Job: 0 Seed: 1321991027015 Starting Students Steps: 100000 Time: 99999 Rate: 91.575,09158 Steps: 200000 Time: 199999 Rate: 124.223,60248 Steps: 300000 Time: 299999 Rate: 129.198,96641 Steps: 400000 Time: 399999 Rate: 125.786,16352

Tambin se podra hacer que hiciera un nmero determinado de pasos:

>

java Students -for 200000

Juan Pavn - UCM 2011

MASON Version 16. For further options, try adding ' -help' at end. Job: 0 Seed: 1321990820238 Starting Students Steps: 100000 Time: 99999 Rate: 91.407,67824 Steps: 200000 Time: 199999 Rate: 124.378,10945 Quit
Mason

24

Visualizacin de la simulacin

Separacin clara entre modelo y vista


El modelo hereda de sim.engine.SimState La visualizacin hereda de sim.display.GUIState

La clase de visualizacin tendr un mtodo main() que har lo siguiente


Crear un objeto de visualizacin (heredero de GUIState) Crear una consola para controlar la ejecucin de la simulacin Hacer visible la consola

Juan Pavn - UCM 2011

Mason

25

Visualizacin de la simulacin
import sim.engine.*; import sim.display.*; public class StudentsWithUIextends GUIState{ public static void main(String[]args){ StudentsWithUIvid=new StudentsWithUI(); Consolec=new Console(vid); c.setVisible(true); } public StudentsWithUI(){ super(new Students(System.currentTimeMillis()));} public StudentsWithUI(SimStatestate){super(state);} public static StringgetName(){ } }
Juan Pavn - UCM 2011 Mason

Clase de visualizacin bsica (1) Crea el objeto de visualizacin

(2) Crea la consola (3) Visualiza la consola

Da el nombre del modelo

return "StudentSchoolyardCliques";

26

Visualizacin de la simulacin

Juan Pavn - UCM 2011

Mason

27

Visualizacin de la simulacin

Para aadir una visualizacin de lo que ocurre se pueden utilizar objetos de visualizacin 2D y 3D

Display
sim.display.Display2D

Field protrayal
Asociado al display, permite dibujar e inspeccionar objetos field Llama a uno o ms simple protrayals
sim.portrayal.simple.OvalPortrayal2D pinta objetos como crculos

Juan Pavn - UCM 2011

Mason

28

Display 2D de la simulacin

Nuevas variables:
public Display2Ddisplay; public JFramedisplayFrame; ContinuousPortrayal2DyardPortrayal =new ContinuousPortrayal2D();

Nuevos mtodos:
public void init(Controllerc){ super.init(c); display =new Display2D(600,600,this); display.setClipping(false); displayFrame =display.createFrame();

Creacin del display 2D con dimensin 600x600 y sin recortar el field portrayal (que es de 100x100) Colocar el display 2D en un JFrame al que se le da un nombre Al registrar el JFrame aparecer en la display list de la consola Visualizar la ventana del display 2D Asociar el field portrayal al display, llamndole Yard

displayFrame.setTitle("SchoolyardDisplay"); c.registerFrame(displayFrame); displayFrame.setVisible(true); display.attach(yardPortrayal,"Yard" ); }


Juan Pavn - UCM 2011 Mason

29

Display 2D de la simulacin

Nuevos mtodos:
public void start(){ super.start(); setupPortrayals(); } public void load(SimStatestate){ super.load(state); setupPortrayals(); } public void quit(){ super.quit(); displayFrame =null; display =null; }
Se llama al destruir el GUI para hacer limpieza Se llama al recargar una simulacin tras un checkpoint Se llama al pulsar el botn Play y antes del mtodo start() del modelo

if (displayFrame!=null)displayFrame.dispose();

Juan Pavn - UCM 2011

Mason

30

Display 2D de la simulacin

Nuevos mtodos:
public void setupPortrayals(){

Mtodo particular para preparar la visualizacin GUIState tiene dos variables: state: el modelo controller: la consola

Studentsstudents=(Students)state;

//telltheportrayalswhattoportrayandhowtoportraythem yardPortrayal.setField(students.yard ); yardPortrayal.setPortrayalForAll(new OvalPortrayal2D()); //reschedulethedisplayer display.reset(); display.setBackdrop(Color.white); //redrawthedisplay display.repaint(); }


Juan Pavn - UCM 2011 Mason

Indica al field protrayal qu field representar

Indica al field protrayal qu todos los objetos en el field se representarn con un oval 2D Se reregistra con el GUIState para que se repinte en cada step Repinta el display para ponerlo en el momento antes de ejecutar la simulacin
31

Display 2D de la simulacin

Gestionar las capas de visualizacin Para filmar una simulacin Para sacar una instantnea de una simulacin Para hacer zoom del display

Opciones

Los agentes movindose

Juan Pavn - UCM 2011

Mason

32

Aadir una red social


Hasta ahora los alumnos se movan alrededor del profesor Consideremos ahora las relaciones entre ellos Para crear una red: sim.eld.network

Grafos dirigidos o no dirigidos y multigrafo (varios enlaces entre dos nodos) Cualquier objeto puede ser un nodo Los enlaces pueden estar etiquetados o no, y tener un peso
Clase sim.eld.network.Edge La etiqueta es un objeto cualquiera con informacin

En el ejemplo

Los alumnos estn en un grafo no dirigido Enlaces aleatorios indican si se llevan bien o no Si no hay enlace es que no tienen opinin mutua
Mason

Juan Pavn - UCM 2011

33

Aadir una red social

Habr que aadir al principio:


import sim.field.network.*;

La siguiente variable en la clase Students:


public Networkbuddies =new Network(false);

El parmetro false indica que es un grafo no dirigido

Y cada vez que se crea un alumno se introduce en el grafo como un nodo:


buddies.addNode(student);

Luego se pueden manipular los enlaces entre los nodos


Cdigo en la siguiente pgina Los alumnos, de forma aleatoria, se gustan o no (incluso pueden gustarse y disgustarse a la vez)
Mason

Juan Pavn - UCM 2011

34

Aadir una red social


//definelike/dislike relationships Obtiene todos los alumnos Bagstudents =buddies.getAllNodes(); del grafo en un Bag que hay que tratar como read-only for(int i=0;i<students.size();i++){ Object student =students.get(i); //who does helike? Object studentB =null; do studentB =students.get(random.nextInt(students.numObjs)); while (student ==studentB); Cae bien double buddiness =random.nextDouble(); buddies.addEdge(student,studentB,new Double(buddiness)); //who does hedislike? Crea el enlace do studentB =students.get(random.nextInt(students.numObjs)); while (student ==studentB); Cae mal buddiness =random.nextDouble(); buddies.addEdge(student,studentB,new Double(buddiness)); }
Crea el enlace
Juan Pavn - UCM 2011 Mason

35

Cmo usar la red social

Cambiemos el comportamiento de los alumnos para que se acerquen a los que mejor les caen:

//GothroughmybuddiesanddeterminehowmuchIwanttobenearthem MutableDouble2DforceVector =new MutableDouble2D(); Bagout =students.buddies.getEdges(this,null); int len =out.size(); for(int buddy =0;buddy <len;buddy++){ Edge e=(Edge)(out.get(buddy)); double buddiness =((Double)(e.info)).doubleValue(); //Icouldbeintheto()endorthefrom()end.getOtherNode isacutefunction //whichgrabstheguyattheoppositeendfromme. Double2Dhim =students.yard.getObjectLocation(e.getOtherNode(this)); if (buddiness >=0){ //thefurtherIamfromhimthemoreIwanttogotohim forceVector.setTo((him.x me.x)*buddiness,(him.y me.y)*buddiness); if (forceVector.length()>MAX_FORCE)//I'mfarenoughaway forceVector.resize(MAX_FORCE); } else {//thenearerIamtohimthemoreIwanttogetawayfromhim,uptoalimit forceVector.setTo((him.x me.x)*buddiness,(him.y me.y)*buddiness); if (forceVector.length()>MAX_FORCE)//I'mfarenoughaway forceVector.resize(0.0); else if (forceVector.length()>0) forceVector.resize(MAX_FORCE forceVector.length());//invertthedistance } sumForces.addIn(forceVector); }
Juan Pavn - UCM 2011 Mason

36

Visualizar la red social

En la clase StudentsWithUI hay que crear un sim.portrayal.network.NetworkPortrayal2D:


NetworkPortrayal2DbuddiesPortrayal =new NetworkPortrayal2D();

Y configurarlo indicando

Qu red tiene que representar (qu enlaces dibujar)

buddiesPortrayal.setField(new SpatialNetwork2D(students.yard, students.buddies )); buddiesPortrayal.setPortrayalForAll(new SimpleEdgePortrayal2D());

Qu espacio Continuous2D asocia los nodos (en este caso, los alumnos) con su localizacin

display.attach(buddiesPortrayal,"Buddies" );

Juan Pavn - UCM 2011

Mason

37

Visualizar la red social

Juan Pavn - UCM 2011

Mason

38

Artculos sobre Mason


Disponibles en el sitio de Mason:

MASON: A Multi-Agent Simulation Environment. 2005. Sean Luke, Claudio Cioffi-Revilla, Liviu Panait, Keith Sullivan, and Gabriel Balan. In Simulation: Transactions of the society for Modeling and Simulation International. 82(7):517-527. MASON: A New Multi-Agent Simulation Toolkit. 2004. Sean Luke, Claudio Cioffi-Revilla, Liviu Panait, and Keith Sullivan. Proceedings of the 2004 SwarmFest Workshop. MASON: A Java Multi-Agent Simulation Library. 2003. Sean Luke, Gabriel Catalin Balan, Liviu Panait, Claudio Cioffi-Revilla, and Sean Paus. Proceedings of the Agent 2003 Conference.

Juan Pavn - UCM 2011

Mason

39