public Simulador() { reloj = new Reloj(); servidores = new List <IServiciable>(); colas = new List <IColeable>(); relojes = new List <Reloj>(); testers = new List <Tester>(); multiplexor = new Multiplexor(); clientesTotalSistema = 0; TiempoPromedioClientEnSistema = 0; tiempoEspera = 0; clientesActual = 0; simulaciones = 0; promedioDeCamiones = 0; }
public void simular(int cantidad) { // base de los siguientes metodos para simular, no se utiliza en realidad reloj = new Reloj(); string _evento = reloj.getEvento(); double _min = reloj.getHora(); int servicio = 0; double clientesTotalSistemaAntes = clientesTotalSistema; for (int j = 0; j < cantidad; j++) { servicio = multiplexor.hacerAlgo(_evento); bool flagComenzo = false; for (int i = 0; i < colas.Count; i++) { colas[i].hacerAlgo(reloj.getEvento(), reloj.getHora(), servicio); if (!flagComenzo) { if (colas[i].darProximaLlegada() != -1) { _min = colas[i].darProximaLlegada(); _evento = colas[i].darEvento(); flagComenzo = true; } } if (_min > colas[i].darProximaLlegada() && colas[i].darProximaLlegada() != -1) { _min = colas[i].darProximaLlegada(); _evento = colas[i].darEvento(); } } for (int i = 0; i < servidores.Count; i++) { servidores[i].hacerAlgo(reloj.getEvento(), reloj.getHora(), servicio); if (servidores[i].darProxFAT() != -1 && _min > servidores[i].darProxFAT()) { _min = servidores[i].darProxFAT(); _evento = servidores[i].darEvento(); } } for (int i = 0; i < servidores.Count; i++) { if (_evento == servidores[i].darEvento()) { if (servidores[i].sosUltimo()) { clientesActual -= 1; } } } for (int i = 0; i < colas.Count; i++) { if (_evento == colas[i].darEvento()) { if (colas[i].entradaSistema()) { clientesActual += 1; clientesTotalSistema += 1; } } } TiempoPromedioClientEnSistema = (TiempoPromedioClientEnSistema * clientesTotalSistemaAntes + (_min - reloj.getHora()) * clientesActual) / clientesTotalSistema; Tester tester = crearTester(servicio); testers.Add(tester); reloj.setEvento(_evento); reloj.setHora(_min); clientesTotalSistemaAntes = clientesTotalSistema; } simulaciones = cantidad; }
public void simularDia(double finDia, double comienzoDia) { // Se inicializa los valores de reloj y las banderas que controlan la simulacion del dia reloj = new Reloj(); reloj.setHora(comienzoDia); string _evento = reloj.getEvento(); double _min = reloj.getHora(); int servicio = 0; bool colasVacias = false; bool finSimulacionDia = false; bool libres = false; double clientesTotalSistemaAntes = clientesTotalSistema; // Se termina de simular el dia cuando haya terminado while ((!finSimulacionDia || !libres)) { simulaciones += 1; // comprueba si las termino el dia y comprueba si todas las colas estan vacias if (finSimulacionDia) { // comprueba si todas las colas estan vacias for (int i = 0; i < colas.Count; i++) { if (colas[i].tenesAlgo()) { colasVacias = false; break; } else { colasVacias = true; } } } // si estan todas las colas vacias comprueba si todos los servidores estan libres if (colasVacias) { for (int i = 0; i < servidores.Count; i++) { if (servidores[i].darEstado() == "0" || servidores[i].darEstado() == "2") { libres = true; } else { libres = false; break; } } } // si es el fin del dia, si no hay nadie en la colas y los servidores estan libres entonces que se corte la simulacion if (finSimulacionDia && libres) { break; } // se recalculan los valores de cantidad de clientes en el sistema for (int i = 0; i < servidores.Count; i++) { if (reloj.getEvento() == servidores[i].darEvento()) { if (servidores[i].sosUltimo()) { clientesActual -= 1; } } } // Agrega miembros a al sistema y al historico de clientes for (int i = 0; i < colas.Count; i++) { if (reloj.getEvento() == colas[i].darEvento()) { if (colas[i].entradaSistema()) { clientesActual += 1; clientesTotalSistema += 1; } } } // calcula el servicio segun el evento para agregarselo a una cola servicio = multiplexor.hacerAlgo(_evento); // flag comenzo permite inicializar la variable _min con algo distinto a -1 bool flagComenzo = false; // el metodo hacerAlgo es polimorfico en las diferentes realizaciones y su comportamiento depende de la hora y el evento // agregar un elemento en las colas en caso de que sea el evento y el servicio sean los adecuados for (int i = 0; i < colas.Count; i++) { colas[i].hacerAlgo(reloj.getEvento(), reloj.getHora(), servicio); // se calcula el tiempo mas chico para comparar, siempre cuando la cola sea la primera y que no sea el fin de simulacion if (!flagComenzo && !finSimulacionDia) { if (colas[i].darProximaLlegada() != -1) { _min = colas[i].darProximaLlegada(); _evento = colas[i].darEvento(); flagComenzo = true; } } // Se busca el tiempo mas chico y el evento asociaso a la cola if (_min > colas[i].darProximaLlegada() && colas[i].darProximaLlegada() != -1 && !finSimulacionDia) { _min = colas[i].darProximaLlegada(); _evento = colas[i].darEvento(); } } for (int i = 0; i < servidores.Count; i++) { // se utiliza el evento polimorfico de los servidores servidores[i].hacerAlgo(reloj.getEvento(), reloj.getHora(), servicio); // se busca el tiempo mas chico y el evento asociado if (!flagComenzo) { if (servidores[i].darProxFAT() != -1) { _min = servidores[i].darProxFAT(); _evento = servidores[i].darEvento(); flagComenzo = true; } } if (servidores[i].darProxFAT() != -1 && _min > servidores[i].darProxFAT()) { _min = servidores[i].darProxFAT(); _evento = servidores[i].darEvento(); } } // se calcula el promedio de clientes en el sistema if (clientesTotalSistema != 0) { TiempoPromedioClientEnSistema = (TiempoPromedioClientEnSistema * clientesTotalSistemaAntes + (_min - reloj.getHora()) * clientesActual) / clientesTotalSistema; } // los tester permiten guardar cualquier vector estado de cualquier simulacion Tester tester = crearTester(servicio); testers.Add(tester); reloj.setEvento(_evento); reloj.setHora(_min); clientesTotalSistemaAntes = clientesTotalSistema; //verifica si ocurrio el fin de dia y deja de llegar clientes if (reloj.getHora() >= finDia && !finSimulacionDia) { finSimulacionDia = true;; } } }