Planteo del problema:
Este práctico tiene por objetivo mostrar la importancia de las colas en las Ciencias de la Computación y más precisamente en las simulaciones.
Las simulaciones permiten analizar situaciones de la realidad sin la necesidad de ejecutarlas realmente. Tiene el beneficio que su costo es muy inferior a hacer pruebas en la realidad.
Desarrollar un programa para la simulación de un cajero automático.
Se cuenta con la siguiente información:
- Llegan clientes a la puerta del cajero cada 2 ó 3 minutos.
- Cada cliente tarda entre 2 y 4 minutos para ser atendido.
Obtener la siguiente información:
1 - Cantidad de clientes que se atienden en 10 horas.
2 - Cantidad de clientes que hay en cola después de 10 horas.
3 - Hora de llegada del primer cliente que no es atendido luego de 10 horas (es decir la persona que está primera en la cola cuando se cumplen 10 horas)
#include <iostream> #include<cstdlib> #include<ctime> using namespace std; class Cola { private: class Nodo { public: int info; Nodo *sig; }; Nodo *raiz; Nodo *fondo; public: Cola(); ~Cola(); void insertar(int x); int extraer(); bool vacia(); int cantidad(); }; Cola::Cola() { raiz = NULL; fondo = NULL; } Cola::~Cola() { Nodo *reco = raiz; Nodo *bor; while (reco != NULL) { bor = reco; reco = reco->sig; delete bor; } } void Cola::insertar(int x) { Nodo *nuevo; nuevo = new Nodo(); nuevo->info = x; nuevo->sig = NULL; if (vacia()) { raiz = nuevo; fondo = nuevo; } else { fondo->sig = nuevo; fondo = nuevo; } } int Cola::extraer() { if (!vacia()) { int informacion = raiz->info; Nodo *bor = raiz; if (raiz == fondo) { raiz = NULL; fondo = NULL; } else { raiz = raiz->sig; } delete bor; return informacion; } else return -1; } bool Cola::vacia() { if (raiz == NULL) return true; else return false; } int Cola::cantidad() { Nodo *reco = raiz; int cant = 0; while (reco != NULL) { cant++; reco = reco->sig; } return cant; } class CajeroAutomatico { public: void simulacion(); }; void CajeroAutomatico::simulacion() { srand(time(NULL)); int estado = 0; int llegada = rand() % 2 + 2; int salida = -1; int cantAtendidas = 0; Cola *cola = new Cola(); for (int minuto = 0; minuto < 600; minuto++) { if (llegada == minuto) { if (estado == 0) { estado = 1; salida = minuto + 2 + rand() % 3; } else { cola->insertar(minuto); } llegada = minuto + 2 + rand() % 2; } if (salida == minuto) { estado = 0; cantAtendidas++; if (!cola->vacia()) { cola->extraer(); estado = 1; salida = minuto + 2 + rand() % 3; } } } cout <<"Atendidos:" <<cantAtendidas <<"\n"; cout <<"En cola:" <<cola->cantidad() <<"\n"; cout <<"Minuto llegada:" <<cola->extraer(); } int main() { CajeroAutomatico *cajero1 = new CajeroAutomatico(); cajero1->simulacion(); delete cajero1; return 0; }
Este proyecto lo puede descargar en un zip desde este enlace : ColaSimulacion1.zip
La clase Cola colabora con la clase CajeroAutomatico. En la clase Cola debemos definir como mínimo los métodos de insertar, extraer, vacía y cantidad.
El método donde implementamos la lógica es el de simulacion, veamos las distintas partes de dicho método:
srand(time(NULL)); int estado = 0; int llegada = rand() % 2 + 2; int salida = -1; int cantAtendidas = 0; Cola *cola = new Cola();
Iniciamos la semilla de valores aleatorios llamando a srand.
La variable estado almacena un cero si el cajero está libre y un uno cuando está ocupado.
La variable llegada almacena en que minuto llegará el próximo cliente (debemos generar un valor entre 2 y 3)
La variable salida almacenará en que minuto terminará el cliente de ser atendido (como al principio el cajero está vacío inicializamos esta variable con -1)
Llevamos un contador para saber la cantidad de personas atendidas (cantAtendidas)
Luego definimos y creamos un objeto de la clase Cola para poder almacenar las personas que llegan al cajero y se lo encuentran ocupado.
Disponemos un for que se repita 600 veces (600 minutos o lo que es lo mismo 10 horas)
for (int minuto = 0; minuto < 600; minuto++)
Dentro del for hay dos if fundamentales que verifican que sucede cuando llega una persona o cuando una persona se retira:
if (llegada == minuto) { ............ } if (salida == minuto) { ............ }
Cuando llega una persona al cajero primero verificamos si el cajero está desocupado:
if (llegada == minuto) { if (estado==0) {
Si está desocupado lo ocupamos cambiando el valor de la variable estado y generando en que minuto esta persona dejará el cajero (un valor aleatorio entre 2 y 4 minutos):
estado = 1; salida = minuto + 2 + rand() % 3;
Si el cajero está ocupado procedemos a cargar dicha persona en la cola (insertamos el minuto que llega):
else { cola->insertar(minuto); }
Luego generamos el próximo minuto que llegará otra persona:
llegada = minuto + 2 + rand() % 2;
El otro if importante es ver que sucede cuando sale la persona del cajero:
if (salida == minuto) {Si sale una persona del cajero cambiamos el valor de la variable estado, incrementamos en uno el contador cantAtendidos y si la cola no está vacía extraemos una persona, cambiamos a uno la variable estado y generamos en que minuto dejará esta persona el cajero:
estado = 0; cantAtendidas++; if (!cola->vacia()) { cola->extraer(); estado = 1; salida = minuto + 2 + rand() % 3; }
Fuera del for mostramos los tres resultados:
cout <<"Atendidos:" <<cantAtendidas <<"\n"; cout <<"En cola:" <<cola->cantidad() <<"\n"; cout <<"Minuto llegada:" <<cola->extraer();
Un supermercado tiene tres cajas para la atención de los clientes.
Las cajeras tardan entre 7 y 11 minutos para la atención de cada cliente.
Los clientes llegan a la zona de cajas cada 2 ó 3 minutos. (Cuando el cliente llega, si todas las cajas tienen 6 personas, el cliente se marcha del supermercado)
Cuando el cliente llega a la zona de cajas elige la caja con una cola menor.
Realizar una simulación durante 8 horas y obtener la siguiente información:
a - Cantidad de clientes atendidos por cada caja.
b - Cantidad de clientes que se marcharon sin hacer compras.
c - Tiempo promedio en cola.
#include <iostream> #include<cstdlib> #include<ctime> using namespace std; class Cola { private: class Nodo { public: int info; Nodo *sig; }; Nodo *raiz; Nodo *fondo; public: Cola(); ~Cola(); void insertar(int x); int extraer(); bool vacia(); int cantidad(); }; Cola::Cola() { raiz = NULL; fondo = NULL; } Cola::~Cola() { Nodo *reco = raiz; Nodo *bor; while (reco != NULL) { bor = reco; reco = reco->sig; delete bor; } } void Cola::insertar(int x) { Nodo *nuevo; nuevo = new Nodo(); nuevo->info = x; nuevo->sig = NULL; if (vacia()) { raiz = nuevo; fondo = nuevo; } else { fondo->sig = nuevo; fondo = nuevo; } } int Cola::extraer() { if (!vacia()) { int informacion = raiz->info; Nodo *bor = raiz; if (raiz == fondo) { raiz = NULL; fondo = NULL; } else { raiz = raiz->sig; } delete bor; return informacion; } else return -1; } bool Cola::vacia() { if (raiz == NULL) return true; else return false; } int Cola::cantidad() { Nodo *reco = raiz; int cant = 0; while (reco != NULL) { cant++; reco = reco->sig; } return cant; } class Supermercado { public: void simulacion(); }; void Supermercado::simulacion() { int estado1 = 0, estado2 = 0, estado3 = 0; int marchan = 0; int llegada = 2 + rand() % 2; int salida1 = -1, salida2 = -1, salida3 = -1; int cantAte1 = 0, cantAte2 = 0, cantAte3 = 0; int tiempoEnCola = 0; int cantidadEnCola = 0; Cola *cola1 = new Cola(); Cola *cola2 = new Cola(); Cola *cola3 = new Cola(); srand(time(NULL)); for (int minuto = 0; minuto < 600; minuto++) { if (llegada == minuto) { if (estado1 == 0) { estado1 = 1; salida1 = minuto + 7 + rand() % 5; } else { if (estado2 == 0) { estado2 = 1; salida2 = minuto + 7 + rand() % 5; } else { if (estado3 == 0) { estado3 = 1; salida3 = minuto + 7 + rand() % 5; } else { if (cola1->cantidad() == 6 && cola2->cantidad() == 6 && cola3->cantidad() == 6) { marchan++; } else { if (cola1->cantidad() <= cola2->cantidad() && cola1->cantidad() <= cola3->cantidad()) { cola1->insertar(minuto); } else { if (cola2->cantidad() <= cola3->cantidad()) { cola2->insertar(minuto); } else { cola3->insertar(minuto); } } } } } } llegada = minuto + 2 + rand() % 2; } if (salida1 == minuto) { cantAte1++; estado1 = 0; if (!cola1->vacia()) { estado1 = 1; int m = cola1->extraer(); salida1 = minuto + 7 + rand() % 5; tiempoEnCola = tiempoEnCola + (minuto - m); cantidadEnCola++; } } if (salida2 == minuto) { cantAte2++; estado2 = 0; if (!cola2->vacia()) { estado2 = 1; int m = cola2->extraer(); salida2 = minuto + 7 + rand() % 5; tiempoEnCola = tiempoEnCola + (minuto - m); cantidadEnCola++; } } if (salida3 == minuto) { cantAte3++; estado3 = 0; if (!cola3->vacia()) { estado3 = 1; int m = cola3->extraer(); salida3 = minuto + 7 + rand() % 5; tiempoEnCola = tiempoEnCola + (minuto - m); cantidadEnCola++; } } } cout <<"Clientes atendidos por caja: caja1=" <<cantAte1 <<" caja2=" <<cantAte2 <<" caja3=" <<cantAte3 <<"\n"; cout <<"Se marchan sin hacer compras:" <<marchan <<"\n"; if (cantidadEnCola>0) { int tiempoPromedio = tiempoEnCola / cantidadEnCola; cout <<"Tiempo promedio en cola:" <<tiempoPromedio <<"\n"; } } int main() { Supermercado *super1; super1 = new Supermercado(); super1->simulacion(); delete super1; return 0; }Este proyecto lo puede descargar en un zip desde este enlace :ColaSimulacion2.zip