Clase 04 Archivo

Anuncio
Simulación a Eventos Discretos
Clase 4: EOSimulator y Pascal SIM
Introducción
Una vez construido el modelo de simulación, debe ser traducido a un
programa de computador.
Diferentes opciones:
1. Lenguajes de programación de propósito general.
2. Lenguajes o bibliotecas para la programación de simulaciones.
3. Paquetes de simulación.
En este curso adoptamos la alternativa 2.
2
Introducción
Utilizamos EOSimulator (basado en C++), desarrollado por el
Departamento de Investigación Operativa del Instituto de Computación.
Alternativamente se podrá utilizar Pascal SIM (basado en Pascal y utilizado
en el texto de Davies y O’Keefe), desarrollado por la Universidad de
Southampton.
Ambas bibliotecas permiten la programación de modelos basados en los
enfoques orientados a eventos de dos o tres fases.
3
Conceptos importantes
• Modelo
• Evento (fijo y condicionado)
• Entidad
• Recurso
• Calendario
• Ejecutivo
4
EOSimulator
• Biblioteca para ser utilizada desde un programa en C++.
• Conjunto de clases que brindan servicios y requieren la definición de
operaciones prefijadas.
• Código fuente disponible (no se recomienda modificarlo).
5
Implementación en EOSimulator
• Entidades: Se pueden utilizar las brindadas por defecto, o se pueden
crear nuevas subclases.
• Recursos: Brindados por la biblioteca.
• Eventos: Son clases abstractas, con operaciones cuyo método debe
definirse en clases derivadas.
• Modelo: Deriva de una clase abstracta y debe contener todos los
atributos relevantes del sistema que se modela.
6
Arquitectura de EOSimulator
• core: Estructura de la
simulación.
• dist: Números aleatorios y
distribuciones.
• statics: Recolección de
datos.
• utils: Utilidades varias.
7
Entidades
Poseen atributos para indicar su próximo evento fijo y su instante de
ocurrencia. Deben crearse de forma dinámica (utilizando new). Pueden
crearse entidades especı́ficas, derivadas de Entity.
class Entity {
private:
BEvent* bEv;
double clock;
public:
Entity ();
virtual ~Entity ();
void setBEvent (BEvent* bEv_);
void setClock (double clock_);
double getClock ();
void processEvent ();
};
8
Recursos
Clase base abstracta Bin; clases concretas Renewable y NonRenewable.
class Bin {
public:
virtual ~Bin();
void acquire (double amount_);
bool isAvailable (double amount_);
};
9
Recursos
class Renewable: public Bin {
public:
Renewable (double quantity_, double max_);
~Renewable ();
void returnBin (double amount_);
};
class NonRenewable: public Bin {
public:
NonRenewable (double quantity_);
~NonRenewable ();
void addBin (double amount_);
};
10
Colas
Interfaz EntityQueue, con implementaciones de colas fifo, lifo y de prioridad
(dada por un comparador).
class EntityQueue {
public:
EntityQueue() {};
virtual ~EntityQueue() {};
virtual void push(core::Entity* ent_) = 0;
virtual core::Entity* pop() = 0;
virtual void remove(unsigned int i_) = 0;
virtual bool empty() = 0;
virtual core::Entity* operator[] (unsigned int i_) = 0;
virtual unsigned int size() = 0;
};
11
Eventos
• Clases abstractas BEvent y CEvent.
• Un evento pertenece a un modelo y tiene una referencia al mismo
(owner).
• Para eventos concretos, debe implementarse la operación eventRoutine.
12
Eventos fijos
class BEvent {
protected:
Model& owner;
public:
BEvent (std::string name_, Model& owner_);
virtual ~BEvent ();
std::string getName();
virtual void eventRoutine (Entity* who_) = 0;
};
El nombre de los BEvent es el identificador utilizado para agendar las
entidades. Es de tipo std::string.
13
Eventos condicionados
class CEvent {
protected:
Model& owner;
public:
CEvent (Model& owner_);
virtual ~CEvent ();
virtual void eventRoutine () = 0;
};
14
Modelo
Es una clase abstracta. Define el modelo del sistema que se quiere simular.
Posee como atributos: eventos (B y C), recursos, entidades globales, colas,
histogramas y distribuciones. En un modelo concreto se deben implementar
las operaciones de inicialización init y doInitialSchedules.
class Model {
private:
Experiment* exp;
utils::BEventMap bEvs;
public:
Model();
virtual ~Model();
virtual void init () = 0;
virtual void doInitialSchedules () = 0;
void connectToExp (Experiment *exp_);
void registerBEvent (BEvent* bEv_);
void registerCEvent (CEvent* cEv_);
void registerDist (dist::Distribution* dist_);
void registerHistogram (statics::Histogram* hist_);
void schedule (double offset_, Entity* who_, std::string what_);
double getSimTime();
};
15
Calendario
Dos tipos: eventos B (entidades agendadas a un evento fijo) y C (eventos
condicionados registrados).
class BCalendar {
private:
double simTime, endSim;
utils::EntityQueueOrdered ents;
public:
BCalendar ();
~BCalendar ();
void bPhase ();
bool isStopped();
void schedule (double offset_, Entity* who_);
void setEndTime (double when_);
double getSimTime();
};
16
Calendario
class CCalendar {
private:
utils::CEventVector cEvs;
public:
CCalendar ();
~CCalendar ();
void cPhase ();
void registerCEvent (CEvent* cEv_);
};
17
Ejecutivo
• Clase Experiment contiene los calendarios B y C.
• Las fases A y B usan BCalendar; la fase C usa CCalendar.
• Para correr la simulación, se conecta la instancia de Model con la
instancia de Experiment y luego se ejecuta mediante la operación run.
18
Ejecutivo
class Experiment {
private:
bool running;
dist::DistManager distMan;
BCalendar bCal;
CCalendar cCal;
Model* currModel;
public:
Experiment ();
~Experiment();
void run (double simTime_);
void setModel (Model* model_);
void schedule (double offset_, Entity* who_);
void setSeed (unsigned long seed_);
void registerDist (dist::Distribution* dist_);
void registerCEvent (CEvent* cEv_);
double getSimTime();
};
19
Pascal SIM
• Biblioteca para ser utilizada desde un programa en Pascal.
• Conjunto de variables, constantes, funciones y procedimientos agrupadas
en una unit de Pascal.
• Código fuente disponible; usualmente debe modificarse y recompilarse.
20
Implementación en Pascal SIM
• Entidades: Se utilizan las brindadas por la biblioteca.
especializarlas, se debe cambiar el código.
Para
• Recursos: Brindados por la biblioteca.
• Eventos: Son procedimientos, tanto los eventos B como los C.
• Modelo: Implı́cito en el programa final.
21
Entidades
Poseen atributos para indicar su disponibilidad (para participar en una
actividad), clase, identificación, próximo evento fijo y su instante de
ocurrencia.
entity = ^an_entity;
an_entity = packed record
avail
class
col
attr, next_B
time
end;
:boolean;
:class_num;
:color;
:cardinal;
:real;
Operaciones de creación y eliminación:
function new_entity (c :class_num; a :cardinal):entity;
procedure make_class (var c :queue; n, size :cardinal);
procedure dis_entity (e :entity);
22
Recursos
Son de tipo renovable, una vez utilizados deben ser devueltos.
bin = record
number, num_avail :cardinal;
end;
Operaciones de creación, adquisición y retorno:
procedure make_bin (var from :bin; n :cardinal);
procedure acquire(var from :bin; n :cardinal);
procedure return (var from :bin; n :cardinal);
23
Colas
Son listas circulares doblemente encadenadas. Sus elementos son entidades.
No manejan prioridades.
procedure make_queue (var q :queue);
procedure give_top (q :queue; i :entity);
procedure give_tail (q :queue; i :entity);
function take_top (q :queue):entity;
function take_tail (q :queue):entity;
function empty (q :queue):boolean;
function count (q :queue):cardinal;
24
Eventos
• Son procedimientos definidos por el modelador.
• No tienen ninguna forma particular de definición.
• Para los eventos fijos: la entidad sobre la cual actúan se encuentra
almacenada en la variable global current.
• Los eventos fijos se agendan mediante la operación:
procedure cause (nb :cardinal; e :entity; t :real);
25
Modelo
• El modelo del sistema a simular está implı́cito. Es el archivo .pas y la
memoria que este ocupa en el tiempo de ejecución.
• Para inicializar un modelo se utiliza el procedimiento initialize
(convención), donde se crean las colas, las entidades globales, los
recursos, los histogramas y los torrentes de números aleatorios.
26
Calendario
• Es una lista global de entidades ordenada por el campo time.
• Contiene todas las entidades agendadas a algún evento fijo.
• Se insertan elementos con el procedimiento cause.
• Para tomar la entidad que se debe procesar, se utiliza calendar top.
Esta función deja la entidad a procesar en la variable global current. El
calendario se crea con el procedimiento make sim.
27
Ejecutivo
• Algoritmo que corre una simulación.
• Debe ser implementado por el usuario.
procedimiento run.
Por convención se utiliza el
• Ejecuta las fases A (avance del tiempo), B (ejecución de los eventos
fijos) y C (ejecución de los eventos condicionados).
28
Estructura general del programa
{bound events}
{conditional events}
procedure run;
procedure initialize;
procedure report;
begin
...
initialize;
run;
report;
...
end.
29
Preguntas
1. Plantear las principales semejanzas y diferencias en el tratamiento de los
conceptos de SED en EOSimulator y Pascal SIM.
2. Enumerar ventajas y desventajas de ambas bibliotecas.
30
Descargar