PRÁCTICA Nº 4: 1 sesión

(S4: 5, 20, 21, 29 y 30 de abril de 2004)

Simulación de colas

0. Objetivo

El objetivo de esta práctica es implementar y utilizar el tipo abstracto de datos "Cola" mediante las clases de C++. Para ello se va a modelizar el sistema de colas de un establecimiento de alimentación y obtener unos datos estadísticos.

1. iNTRODUCCIÓN

El caso más simple de simulación de un sistema de colas consiste en un sistema con un único servidor o caja que atiende una única cola. Posteriormente se puede extender a escenarios más complicados con n servidores o cajas y sus correspondientes colas de clientes.

El establecimiento que se quiere simular está en funcionamiento durante 8 horas ininterrumpidas.

Los clientes llegan a intervalos de tiempo aleatorio, según una distribución exponencial, f(x)= λe-λx para x>=0, de media λ=50 segundos. Si U es un nϊmero aleatorio uniforme en el intervalo (0, 1), entonces se puede obtener una variable aleatoria distribuida exponencialmente X=-ln(1-U)/ λ. A continuaciσn se facilita la función que devuelve la hora(segundo) de llegada del siguiente cliente:

Cola::Valor ColaClientes::LlegadaSiguiente(Cola::Valor tiempo_actual)

{

Cola::Valor x, r;

r = rand();

x = -log(1 - (r/Cola::Valor(RAND_MAX))) / LLEGADA;

x = tiempo_actual + (LLEGADA * exp(-LLEGADA * x));

return x;

}

Hay clientes que rehusan ponerse a la cola cuando esta es demasiado larga con la siguiente probabilidad:

Pr(rehuse)= 0, si m<=5 (siendo m el número de clientes en la cola)

0’5, en otro caso

El tiempo empleado por el servidor o caja en atender al cliente también varía según una distribución exponencial de media λ2=60 segundos, como se ha visto anteriormente.

Los datos de la simulación que interesa conocer de la cola de clientes son: clientes perdidos, tamaño medio y máximo de la cola durante la simulación, y el tiempo medio de espera para clientes en la cola. Y del servidor o caja: el número total de clientes atendidos, el tiempo medio de atención por cliente y el porcentaje de ocupación.

 

2. Realización de la práctica

Se precisa implementar tres clases en C++, la clase que permite representar el TAD cola visto en clase, la clase cola de clientes y la clase servidor o caja.

Implementación de la clase Cola

La clase cola se implementa con la siguiente interfaz:

class Cola

{

public:

//Tipo de datos de los elementos de la cola

typedef double Valor;

//constructor

Cola (void);

bool ColaVacia (void);

bool Encolar (Valor);

bool Desencolar (Valor &);

bool PrimeroCola (Valor &);

private:

...

};

Implementación de la clase Cola de Clientes

La clase cola de clientes que se implementa contiene un objeto de tipo ‘Cola’ y las variables necesarias para el cálculo de las estadísticas de la simulación de la cola de clientes.

class ColaClientes

{

public:

//Constructor

ColaClientes::ColaClientes(void);

//Indica si la cola está vacia

bool ColaVacia(void);

//Entra un nuevo cliente y se coloca en la cola

void Entrar(Cola::Valor);

//Sale cliente de la cola

void Salir(Cola::Valor);

//Guarda cuando llegará el siguiente cliente

void Siguiente(Cola::Valor);

//Comprueba si ha llegado un cliente

bool LlegaCliente(Cola::Valor);

//Muestra las estadísticas de la cola de clientes

void Estadisticas(Cola::Valor);

private:

Cola::Cola cola; //Objeto tipo cola

// Variables para el cálculo de las estadísticas de la cola de clientes

int longitud, // nº de clientes que hacen cola en un momento dado

tam_max_cola, // longitud máxima que ha alcanzado la cola

total_clientes, //nº total de clientes que se han acercado al establecimiento

clientes_perdidos; //nº de clientes que han rehusado hacer cola

Cola::Valor llega_en, //cuando llegará el próximo cliente

tiempo_ult_suceso, //momento en el que se realizó una entrada o una salida

tiempo_total_espera, //tiempo total que han esperado los clientes

tiempo_max_espera, //tiempo máximo que ha esperado un cliente

tam_total_cola; //Sirve para calcular el tamaño medio de cola. Es la suma

//acumulada de los productos de los tamaños de la cola por la cantidad de

//tiempo que la cola tuvo ese tamaño

//Devuelve true si el cliente rehusa ponerse a la cola

bool Rehusa();

};

De estos métodos se proporcionará al alumno ‘Siguiente’ y ‘Rehusa’;

Implementación de la clase Servidor

La clase servidor o caja que se implementa recoge los datos necesarios para el cálculo de las estadísticas de la simulación del servidor o caja.

class Servidor

{

public:

//Tipo de datos de los elementos de la cola

typedef double Valor;

//constructor

Servidor (void);

//El servidor atiende al cliente

void AtenderCliente(Servidor::Valor);

//Indica si el servidor está libre u ocupado

bool Ocupado(Servidor::Valor);

//Muestra las estadísticas del servidor

void Estadisticas(Servidor::Valor, Servidor::Valor);

private:

// Variables para el cálculo de las estadísticas del servidor

int clientes_atendidos; // número de clientes atendidos por el servidor

Servidor::Valor ocupado_hasta, // cuando está libre el servidor

tiempo_total_atencion; //tiempo total que el servidor pasa atendiendo clientes

//Simula cuanto tardará el servidor en atender al cliente

Servidor::Valor DisponibleEn(Servidor::Valor tiempo_actual);

};

De estos métodos se proporcionará al alumno el método privado ‘DisponibleEn’

 

Implementación del programa

Se propone escribir un programa que simule un sistema con un servidor y una cola de clientes.

El proceso consiste, básicamente, en los siguientes pasos:

1.- Se simula la hora de llegada del primer cliente.

2.- Mientras el reloj de la simulación marque una hora inferior a la de cierre:

a.- Se incrementa el reloj

b.- Si llega un cliente (la hora actual es mayor que la hora en la que se preveía su llegada) se pone a la cola guardando la hora de entrada y se simula la hora de llegada del siguiente cliente.

c.- Si el servidor no está ocupado (la hora actual es menor que la hora hasta la que está ocupado) y la cola no está vacía se saca un cliente de la cola, el servidor pasa a estar ocupado atendiéndolo y se simula la hora de salida.

3.- Finalmente se muestran las estadísticas de la cola de clientes y del servidor.

Una posible salida por pantalla del programa es:

ESTADÍSTICAS DE CLIENTES

Clientes perdidos: 193

Tamaño máximo de cola: 10

Tamaño medio de cola: 1.00323

Tiempo máximo de espera(seg.): 357

ESTADÍSTICAS DEL SERVIDOR

Clientes atendidos: 935

Tiempo medio de atención(seg.): 30.1524

Ocupación servidor(%): 97.774

 

3. Entrega

En esta práctica, habrá que entregar una documentación de programa completa, el código del programa principal(##simulacion.cpp) y la implementación de las clases ‘Cola’ (##cola.h y ##cola.cpp), ‘ColaClientes’ (##colaclientes.h y ##colaclientes.cpp) y ‘Servidor’ (##servidor.h y ##servidor.cpp).

La entrega puede realizarse por e-mail a la dirección del profesor encargado del grupo o en disquete al iniciar la siguiente sesión de prácticas, pero siempre ANTES de empezar la siguiente sesión de prácticas.

Cualquier práctica entregada fuera de plazo no será admitida para su corrección.

 

 

ENTREGA DE PROGRAMAS:
Al comenzar la sesión 5 de prácticas (26 , 27, 28 de abril y 6, 7 de mayo de 2004)