private void agregarFilaResumen(VectorEstado simulacionFinal) { string formatoDecimal = "0.0000"; string formatoTimeSpan = @"hh\:mm\:ss"; var fila = simulacionesResumenDataTable.NewRow(); fila["Numero Simulacion"] = simulacionFinal.numeroEvento; fila["Tiempo Promedio Libre Coccion"] = simulacionFinal.tiempoPromedioLibreCocineros.ToString(formatoTimeSpan); fila["Tiempo Promedio Libre Delivery"] = simulacionFinal.tiempoPromedioLibreDelivery.ToString(formatoTimeSpan); fila["Ventas Perdidas Promedio Por Dia"] = simulacionFinal.promedioPedidosPerdidos.ToString(formatoDecimal); fila["Ventas con Entrega Gratuita Por Dia"] = simulacionFinal.cantidadPedidosCeroIngresos; fila["Valor de los Ingresos"] = simulacionFinal.ingresosGeneradosTotal.ToString(formatoDecimal); fila["Valor de las Ventas Perdidas"] = simulacionFinal.montoPedidosPerdidos.ToString(formatoDecimal); fila["Ingreso Promedio Diario"] = simulacionFinal.ingresoPromedioDiario.ToString(formatoDecimal); fila["Desvío Ingreso Diario"] = Math.Sqrt(simulacionFinal.ingresoDesvioDiario).ToString(formatoDecimal); fila["Numero Maximo de Ventas Perdidas"] = simulacionFinal.maximoVentasPerdidas; fila["Tiempo Promedio en Cola"] = simulacionFinal.promedioTiempoClientesEnCola.ToString(formatoTimeSpan); fila["Tiempo de Entrega de Pedidos Promedio Desde Creacion"] = simulacionFinal.promedioTiempoEntregaDesdePedido.ToString(formatoTimeSpan); fila["Probabilidad ingreso < 250"] = simulacionFinal.probabilidadIngresoMenosDe250.ToString(formatoDecimal); fila["Probabilidad pedidos caidos o gratis"] = simulacionFinal.probabilidadPedidosCaidosOGratis.ToString(formatoDecimal); simulacionesResumenDataTable.Rows.Add(fila); }
private void mostrarVectorResultado() { VectorEstado simulacionFinal = calcularPromedioSimulacionDiaria(); agregarFilaResumen(simulacionFinal); grdResultados.DataSource = simulacionesResumenDataTable; }
private void agregarSimulacion(VectorEstado ultimaSimulacion) { ultimaSimulacion.numeroEvento = resultados.Count; ultimaSimulacion.maximoVentasPerdidas = ultimaSimulacion.cantidadPedidosPerdidos; ultimaSimulacion.promedioPedidosPerdidos = ultimaSimulacion.cantidadPedidosPerdidos; calcularPromedioSimulacionDiaria(); grdResultados.DataSource = null; int cantidadPedidosCaidosOAbandonados = ultimaSimulacion.pedidosAbandonados + ultimaSimulacion.cantidadPedidosCeroIngresos; if (cantidadPedidosCaidosOAbandonados >= 5) { ultimaSimulacion.probabilidadPedidosCaidosOGratis = 1; } agregarFilaResumen(ultimaSimulacion); grdResultados.DataSource = simulacionesResumenDataTable; }
private void agregarDatosDGVFunciones(VectorEstado actual) { int numeroSim = actual.NumeroSimulacion; String reloj = Math.Round(actual.Reloj, 2).ToString(); int personasEnColaSala = actual.PersonasEnColaSala; double porcPersonasNoEntraron = Math.Round(((double)personasEnColaSala / ((double)actual.EntradasVendidas)) * 100, 2); double tiempoOcupacionBoletero = Math.Round(actual.TiempoOcupacionBoletero, 2); double entradasVendidas = actual.EntradasVendidas; double entradasAnticipadas = actual.EntradasAnticipadas; String porcentajeOcupacion = Math.Round((((double)actual.TiempoOcupacionBoletero / actual.Reloj) * 100), 2).ToString(); acumPersonasNoEntraron += personasEnColaSala; acumuladorEntradasAnticipadas += actual.EntradasAnticipadas; acumuladorEntradasVendidas += actual.EntradasVendidas; acumReloj += Math.Round(actual.Reloj, 2); acumTiempoBoletero += Math.Round(actual.TiempoOcupacionBoletero, 2); double acumPorcPersonasNoEntraron = Math.Round((acumPersonasNoEntraron / acumuladorEntradasVendidas) * 100, 2); double acumdescuento15 = Math.Round((acumuladorEntradasAnticipadas * 0.15 / acumuladorEntradasVendidas) * 100, 2); double acPorcTiempoBoletero = Math.Round((acumTiempoBoletero / acumReloj) * 100, 2); double descuento15 = Math.Round((entradasAnticipadas * 0.15 / entradasVendidas) * 100, 2); string salaLlena; if (actual.ButacasOcupadas == tamSala) { salaLlena = "Si"; acumSalasLlenas += 1; } else { salaLlena = "No"; } double porcSalasLlenas = Math.Round((acumSalasLlenas / actual.NumeroSimulacion) * 100, 2); double promEntradasVendidas = Math.Round((acumuladorEntradasVendidas / actual.NumeroSimulacion), 2); double porcEntradasAnticipadas = Math.Round((entradasAnticipadas / entradasVendidas) * 100, 2); double porcTotalEntradasAnticipadas = Math.Round((acumuladorEntradasAnticipadas / acumuladorEntradasVendidas) * 100, 2); dgvFunciones.Rows.Add(numeroSim, reloj, tiempoOcupacionBoletero, acumTiempoBoletero, acumReloj, acPorcTiempoBoletero.ToString() + "%", salaLlena, acumSalasLlenas, porcSalasLlenas.ToString() + "%", entradasVendidas, acumuladorEntradasVendidas, promEntradasVendidas, entradasAnticipadas, porcEntradasAnticipadas.ToString() + "%", acumuladorEntradasAnticipadas, porcTotalEntradasAnticipadas.ToString() + "%", porcPersonasNoEntraron.ToString() + "%", acumPorcPersonasNoEntraron.ToString() + "%", descuento15.ToString() + "%", acumdescuento15.ToString() + "%"); }
private void btnSimular_Click(object sender, EventArgs e) { if (validarCampos()) { btnMostrarLlenado.Enabled = btnMostrarVaciado.Enabled = true; dgvFuncion.Rows.Clear(); limpiarClientes(); dgvFunciones.Rows.Clear(); if (frmRKVaciado != null) { frmRKVaciado.Close(); } resetearAcumuladores(); frmRKLlenado = new frmRungeKutta(h, alfa, desb1, desb2, desb3); tiemposLlenado = frmRKLlenado.rungeKuttaGraficoLlenado(); frmRKVaciado = new frmRungeKutta(h, alfa, desb1, desb2, desb3); for (int i = 0; i < numSim; i++) { anterior = new VectorEstado(); actual = new VectorEstado(); actual.Reloj = 0; actual.Evento = "inicio_simulacion"; actual.Boletero = new Boletero(); actual.Boleteria = new Queue <Cliente>(); actual.Entrada = new Queue <Cliente>(); Cliente clienteAtendido = new Cliente(0, false); Cliente entrante = new Cliente(0, false); empezoPelicula = false; empezoSimulacion = false; ingresoLlegadaEntrada = false; ingresoASala = false; List <Cliente> clientes = new List <Cliente>(); while (actual.ButacasOcupadas < tamSala && !(actual.PersonasEnColaSala == 0 && empezoPelicula) || actual.Boletero.Estado == "ocupado") { anterior = actual; actual = new VectorEstado(); copiarAnterior(); buscarEvento(); switch (actual.Evento) { case "inicio_simulacion": resetearCampos(); actual.ButacasOcupadas = 0; actual.NumeroSimulacion = i + 1; actual.PersonasEnColaSala = 0; actual.TiempoOcupacionBoletero = 0; actual.RndLlegadaCompra = random.NextDouble(); actual.LlegadaCompra = aleatorioU(desdeTiempoLlegadaCompra, hastaTiempoLlegadaCompra, actual.RndLlegadaCompra); actual.ProximaLlegadaCompra = actual.Reloj + actual.LlegadaCompra; empezoSimulacion = true; actual.EstadoPortero = "libre"; break; case "llegada_compra": resetearCampos(); if (empezoPelicula) { break; } actual.RndLlegadaCompra = random.NextDouble(); actual.LlegadaCompra = aleatorioU(desdeTiempoLlegadaCompra, hastaTiempoLlegadaCompra, actual.RndLlegadaCompra); actual.ProximaLlegadaCompra = actual.Reloj + actual.LlegadaCompra; actual.RndNumeroCompra = random.NextDouble(); actual.NumeroCompra = aleatorioInt(desdeEntradasComprar, hastaEntradasComprar, actual.RndNumeroCompra); Cliente nuevo = new Cliente(actual.NumeroCompra, false); nuevo.Nombre = "Cliente" + (clientes.Count + 1); clientes.Add(nuevo); for (int m = 0; m < actual.NumeroCompra - 1; m++) { Cliente nuevoAcompañante = new Cliente(actual.NumeroCompra, false); nuevoAcompañante.Nombre = "Cliente" + (clientes.Count + 1); clientes.Add(nuevoAcompañante); nuevo.Acompañantes.Add(nuevoAcompañante); } if (actual.Boletero.Estado == "ocupado") { actual.Boleteria.Enqueue(nuevo); } else { clienteAtendido = nuevo; clienteAtendido.Estado = "comprando"; foreach (Cliente acompañante in clienteAtendido.Acompañantes) { acompañante.Estado = "acomp_" + clienteAtendido.Nombre; } actual.Boletero.Estado = "ocupado"; actual.Boletero.InicioOcupacion = actual.Reloj; actual.RndFinCompra = random.NextDouble(); actual.FinCompra = aleatorioU(desdeTiempoCompra, hastaTiempoCompra, actual.RndFinCompra); actual.ProximoFinCompra = actual.Reloj + actual.FinCompra; } break; case "llegada_entrada_anticipada": resetearCampos(); if (empezoPelicula) { break; } actual.RndLlegadaEntrada = random.NextDouble(); actual.LlegadaEntrada = aleatorioU(desdeTiempoLlegadaAnticipada, hastaTiempoLlegadaAnticipada, actual.RndLlegadaEntrada); actual.ProximaLlegadaEntrada = actual.Reloj + actual.LlegadaEntrada; actual.RndNumeroEntrada = random.NextDouble(); actual.NumeroEntrada = aleatorioInt(desdeEntradasAnticipadas, hastaEntradasAnticipadas, actual.RndNumeroEntrada); if (actual.PersonasEnColaSala == 0 && ingresoASala && actual.EstadoPortero != "interrumpido") { actual.RndFinEntrada = random.NextDouble(); actual.FinEntrada = aleatorioU(desdeTiempoEntradaSala, hastaTiempoEntradaSala, actual.RndFinEntrada); actual.ProximoFinEntrada = actual.Reloj + actual.FinEntrada; } actual.PersonasEnColaSala += actual.NumeroEntrada; actual.EntradasVendidas += actual.NumeroEntrada; actual.EntradasAnticipadas += actual.NumeroEntrada; for (int j = 0; j < actual.NumeroEntrada; j++) { Cliente nuevoAnticipada = new Cliente(actual.NumeroCompra, true); nuevoAnticipada.Nombre = "Cliente" + (clientes.Count + 1); actual.Entrada.Enqueue(nuevoAnticipada); clientes.Add(nuevoAnticipada); } break; case "fin_compra": resetearCampos(); if (actual.PersonasEnColaSala == 0 && ingresoASala && actual.EstadoPortero != "interrumpido") { actual.RndFinEntrada = random.NextDouble(); actual.FinEntrada = aleatorioU(desdeTiempoEntradaSala, hastaTiempoEntradaSala, actual.RndFinEntrada); actual.ProximoFinEntrada = actual.Reloj + actual.FinEntrada; } actual.PersonasEnColaSala += clienteAtendido.NumeroEntradas; actual.EntradasVendidas += clienteAtendido.NumeroEntradas; clienteAtendido.Estado = "esperando_entrar"; actual.Entrada.Enqueue(clienteAtendido); foreach (Cliente acompañante in clienteAtendido.Acompañantes) { acompañante.Estado = "esperando_entrar"; actual.Entrada.Enqueue(acompañante); } actual.TiempoOcupacionBoletero += actual.Reloj - actual.Boletero.InicioOcupacion; //si hay gente en la cola de la boleteria, y no empezó la pelicula, se toma a un cliente y se hace un nuevo fin compra if (actual.Boleteria.Count != 0 && !empezoPelicula) { clienteAtendido = actual.Boleteria.Dequeue(); clienteAtendido.Estado = "comprando"; foreach (Cliente acompañante in clienteAtendido.Acompañantes) { acompañante.Estado = "acomp_" + clienteAtendido.Nombre; } actual.RndFinCompra = random.NextDouble(); actual.FinCompra = aleatorioU(desdeTiempoCompra, hastaTiempoCompra, actual.RndFinCompra); actual.ProximoFinCompra = actual.Reloj + actual.FinCompra; actual.Boletero.InicioOcupacion = actual.Reloj; } else // si no, el boletero queda libre { actual.Boletero.Estado = "libre"; actual.ProximoFinCompra = -1; } break; case "fin_entrada": resetearCampos(); if (actual.ButacasOcupadas < tamSala && actual.PersonasEnColaSala > 0) { entrante.Estado = ""; actual.ButacasOcupadas += 1; entrante = actual.Entrada.Dequeue(); entrante.Estado = "entrando"; actual.PersonasEnColaSala = actual.Entrada.Count; actual.RndFinEntrada = random.NextDouble(); actual.FinEntrada = aleatorioU(desdeTiempoEntradaSala, hastaTiempoEntradaSala, actual.RndFinEntrada); actual.ProximoFinEntrada = actual.Reloj + actual.FinEntrada; actual.EstadoPortero = "ocupado"; actual.LlegadasPortero++; } else { actual.EstadoPortero = "libre"; actual.ProximoFinEntrada = -1; } break; case "inicio_llegada_con_entrada": resetearCampos(); actual.RndLlegadaEntrada = random.NextDouble(); actual.LlegadaEntrada = aleatorioU(desdeTiempoLlegadaAnticipada, hastaTiempoLlegadaAnticipada, actual.RndLlegadaEntrada); actual.ProximaLlegadaEntrada = actual.Reloj + actual.LlegadaEntrada; ingresoLlegadaEntrada = true; break; case "inicio_ingreso_sala": resetearCampos(); actual.RndInterrupcion = random.NextDouble(); actual.PuntoDesborde = desborde(actual.RndInterrupcion); actual.TiempoInterrupcion = getTiempoInterrupcion(actual.PuntoDesborde); actual.ProximaInterrupcion = actual.Reloj + actual.TiempoInterrupcion; if (actual.PersonasEnColaSala > 0) { actual.RndFinEntrada = random.NextDouble(); actual.FinEntrada = aleatorioU(desdeTiempoEntradaSala, hastaTiempoEntradaSala, actual.RndFinEntrada); actual.ProximoFinEntrada = actual.Reloj + actual.FinEntrada; entrante = actual.Entrada.Dequeue(); entrante.Estado = "entrando"; actual.EstadoPortero = "ocupado"; actual.LlegadasPortero++; } ingresoASala = true; break; case "inicio_pelicula": resetearCampos(); actual.ProximaLlegadaCompra = -1; actual.ProximaLlegadaEntrada = -1; empezoPelicula = true; foreach (Cliente cliente in actual.Boleteria) { cliente.Estado = ""; foreach (Cliente acompañante in cliente.Acompañantes) { acompañante.Estado = ""; } } break; case "inicio_interrupcion": resetearCampos(); if (actual.NumeroSimulacion == simMostrar) { actual.TiempoFinInterrupcion = frmRKVaciado.rungeKuttaGraficoVaciado(actual.LlegadasPortero); } else { actual.TiempoFinInterrupcion = frmRKVaciado.rungeKuttaVaciado(actual.LlegadasPortero); } actual.ProximoFinInterrupcion = actual.Reloj + actual.TiempoFinInterrupcion; if (actual.EstadoPortero == "ocupado") { actual.TiempoRestanteEntrada = actual.ProximoFinEntrada - actual.Reloj; } actual.ProximoFinEntrada = -1; actual.ProximaInterrupcion = -1; actual.PuntoDesborde = -1; actual.EstadoPortero = "interrumpido"; actual.LlegadasPortero = 0; break; case "fin_interrupcion": resetearCampos(); actual.RndInterrupcion = random.NextDouble(); actual.PuntoDesborde = desborde(actual.RndInterrupcion); actual.TiempoInterrupcion = getTiempoInterrupcion(actual.PuntoDesborde); actual.ProximaInterrupcion = actual.Reloj + actual.TiempoInterrupcion; actual.ProximoFinEntrada = actual.Reloj + actual.TiempoRestanteEntrada; actual.TiempoRestanteEntrada = 0; actual.ProximoFinInterrupcion = -1; actual.EstadoPortero = "ocupado"; break; } if (actual.NumeroSimulacion == simMostrar) { agregarDatosDGV(actual); agregarClientesDGV(clientes); } } agregarDatosDGVFunciones(actual); } } }
private void agregarDatosDGV(VectorEstado actual) { String numeroSim = actual.NumeroSimulacion.ToString(); double reloj = Math.Round(actual.Reloj, 2); String evento = actual.Evento; String personasEnColaBoletaria = actual.Boleteria.Count.ToString(); String personasEnColaSala = actual.PersonasEnColaSala.ToString(); String butacasOcupadas = actual.ButacasOcupadas.ToString(); String tiempoOcupacionBoletero = Math.Round(actual.TiempoOcupacionBoletero, 2).ToString(); String estadoBoletero = actual.Boletero.Estado; String entradasVendidas = actual.EntradasVendidas.ToString(); String entradasAnticipadas = actual.EntradasAnticipadas.ToString(); String porcentajeOcupacion = Math.Round((((double)actual.TiempoOcupacionBoletero / actual.Reloj) * 100), 2).ToString(); String rndLlegadaCompra, llegadaCompra, rndNumeroCompra, numeroCompra, rndLlegadaEntrada, llegadaEntrada, rndNumeroEntrada, numeroEntrada, rndFinCompra, finCompra, rndFinEntrada, finEntrada, salaLlena, proximaLlegadaEntrada, proximoFinCompra, proximoFinEntrada, proximaLlegadaCompra, tiempoRestanteEntrada, rndProximaInterrupcion, puntoDesborde, tiempoInterrupcion, tiempoFinInterrupcion , proximoFinInterrupcion, proximaInterrupcion, llegadasPortero; rndLlegadaCompra = llegadaCompra = rndNumeroCompra = numeroCompra = rndLlegadaEntrada = llegadaEntrada = rndNumeroEntrada = numeroEntrada = rndFinCompra = finCompra = rndFinEntrada = finEntrada = proximaLlegadaEntrada = proximoFinCompra = proximaLlegadaCompra = proximoFinEntrada = tiempoRestanteEntrada = rndProximaInterrupcion = puntoDesborde = tiempoInterrupcion = tiempoFinInterrupcion = proximoFinInterrupcion = proximaInterrupcion = llegadasPortero = ""; if (actual.RndLlegadaCompra != -1) { rndLlegadaCompra = Math.Round(actual.RndLlegadaCompra, 2).ToString(); } if (actual.LlegadaCompra != -1) { llegadaCompra = Math.Round(actual.RndLlegadaCompra, 2).ToString(); } if (actual.RndNumeroCompra != -1) { rndNumeroCompra = Math.Round(actual.RndNumeroCompra, 2).ToString(); } if (actual.NumeroCompra != -1) { numeroCompra = actual.NumeroCompra.ToString(); } if (actual.RndLlegadaEntrada != -1) { rndLlegadaEntrada = Math.Round(actual.RndLlegadaEntrada, 2).ToString(); } if (actual.LlegadaEntrada != -1) { llegadaEntrada = Math.Round(actual.LlegadaEntrada, 2).ToString(); } if (actual.RndNumeroEntrada != -1) { rndNumeroEntrada = Math.Round(actual.RndNumeroEntrada, 2).ToString(); } if (actual.NumeroEntrada != -1) { numeroEntrada = actual.NumeroEntrada.ToString(); } if (actual.RndFinCompra != -1) { rndFinCompra = Math.Round(actual.RndFinCompra, 2).ToString(); } if (actual.FinCompra != -1) { finCompra = Math.Round(actual.FinCompra, 2).ToString(); } if (actual.RndFinEntrada != -1) { rndFinEntrada = Math.Round(actual.RndFinEntrada, 2).ToString(); } if (actual.FinEntrada != -1) { finEntrada = Math.Round(actual.FinEntrada, 2).ToString(); } if (actual.ProximaLlegadaCompra != -1) { proximaLlegadaCompra = Math.Round(actual.ProximaLlegadaCompra, 2).ToString(); } if (actual.ProximaLlegadaEntrada > 0) { proximaLlegadaEntrada = Math.Round(actual.ProximaLlegadaEntrada, 2).ToString(); } if (actual.ProximoFinCompra > 0) { proximoFinCompra = Math.Round(actual.ProximoFinCompra, 2).ToString(); } if (actual.ProximoFinEntrada > 0) { proximoFinEntrada = Math.Round(actual.ProximoFinEntrada, 2).ToString(); } if (actual.TiempoRestanteEntrada > 0) { tiempoRestanteEntrada = Math.Round(actual.TiempoRestanteEntrada, 2).ToString(); } if (actual.RndInterrupcion != -1) { rndProximaInterrupcion = Math.Round(actual.RndInterrupcion, 2).ToString(); } if (actual.PuntoDesborde > 0) { puntoDesborde = actual.PuntoDesborde.ToString(); } if (actual.TiempoInterrupcion != -1) { tiempoInterrupcion = Math.Round(actual.TiempoInterrupcion, 2).ToString(); } if (actual.TiempoFinInterrupcion != -1) { tiempoFinInterrupcion = Math.Round(actual.TiempoFinInterrupcion, 2).ToString(); } if (actual.ProximoFinInterrupcion > 0) { proximoFinInterrupcion = Math.Round(actual.ProximoFinInterrupcion, 2).ToString(); } if (actual.ProximaInterrupcion > 0) { proximaInterrupcion = Math.Round(actual.ProximaInterrupcion, 2).ToString(); } if (actual.LlegadasPortero > 0) { llegadasPortero = actual.LlegadasPortero.ToString(); } if (actual.ButacasOcupadas == tamSala) { salaLlena = "Si"; } else { salaLlena = "No"; } dgvFuncion.Rows.Add(numeroSim, evento, reloj, rndLlegadaCompra, llegadaCompra, proximaLlegadaCompra, rndNumeroCompra, numeroCompra, rndLlegadaEntrada, llegadaEntrada, proximaLlegadaEntrada, rndNumeroEntrada, numeroEntrada, estadoBoletero, rndFinCompra, finCompra, proximoFinCompra, rndFinEntrada, finEntrada, tiempoRestanteEntrada, proximoFinEntrada, rndProximaInterrupcion, puntoDesborde , tiempoInterrupcion, proximaInterrupcion, llegadasPortero, tiempoFinInterrupcion, proximoFinInterrupcion, personasEnColaBoletaria, actual.EstadoPortero, personasEnColaSala, entradasVendidas, actual.ButacasOcupadas, salaLlena, tiempoOcupacionBoletero, porcentajeOcupacion, entradasAnticipadas); }
private VectorEstado calcularPromedioSimulacionDiaria() { double tiempoLibreCocineros = 0d; double tiempoLibreDelivery = 0d; int pedidosPerdidos = 0; int pedidosConCeroIngresos = 0; double montoPedidosPerdidos = 0; int maxVentasPerdidas = 0; double tiempoEnColas = 0d; double tiempoEntregaDesdePedido = 0d; double ingresoConMenosDe250 = 0; double valorIngresos = 0; double ingresoDiarioPromedio = 0; double ingresoDiarioDesvio = 0; int cantidadSimulacionesCon5PedidosCaidosOAbandonados = 0; foreach (var simulacionIndividual in resultados) { tiempoLibreCocineros += simulacionIndividual.cocineros.Sum(x => x.tiempoLibre.TotalMinutes) / (double)simulacionIndividual.cocineros.Count; tiempoLibreDelivery += simulacionIndividual.delivery.tiempoLibre.TotalMinutes; pedidosPerdidos += simulacionIndividual.cantidadPedidosPerdidos; pedidosConCeroIngresos += simulacionIndividual.cantidadPedidosCeroIngresos; montoPedidosPerdidos += simulacionIndividual.montoPedidosPerdidos; if (simulacionIndividual.cantidadPedidosPerdidos > maxVentasPerdidas) { maxVentasPerdidas = simulacionIndividual.cantidadPedidosPerdidos; } tiempoEnColas += simulacionIndividual.promedioTiempoClientesEnCola.TotalMinutes; tiempoEntregaDesdePedido += simulacionIndividual.promedioTiempoEntregaDesdePedido.TotalMinutes; ingresoConMenosDe250 += simulacionIndividual.probabilidadIngresoMenosDe250; int cantidadPedidosCaidosOAbandonados = simulacionIndividual.pedidosAbandonados + simulacionIndividual.cantidadPedidosCeroIngresos; if (cantidadPedidosCaidosOAbandonados >= 5) { cantidadSimulacionesCon5PedidosCaidosOAbandonados++; } valorIngresos += simulacionIndividual.ingresosGeneradosTotal; ingresoDiarioPromedio += simulacionIndividual.ingresoPromedioDiario; ingresoDiarioDesvio += simulacionIndividual.ingresoDesvioDiario; } VectorEstado resultadoSimulacionTotal = new VectorEstado(); resultadoSimulacionTotal.tiempoPromedioLibreCocineros = TimeSpan.FromMinutes(tiempoLibreCocineros / (double)resultados.Count); resultadoSimulacionTotal.tiempoPromedioLibreDelivery = TimeSpan.FromMinutes(tiempoLibreDelivery / (double)resultados.Count); resultadoSimulacionTotal.promedioPedidosPerdidos = pedidosPerdidos / (double)resultados.Count; resultadoSimulacionTotal.cantidadPedidosCeroIngresos = pedidosConCeroIngresos; resultadoSimulacionTotal.montoPedidosPerdidos = montoPedidosPerdidos; resultadoSimulacionTotal.maximoVentasPerdidas = maxVentasPerdidas; resultadoSimulacionTotal.promedioTiempoClientesEnCola = TimeSpan.FromMinutes(tiempoEnColas / (double)resultados.Count); resultadoSimulacionTotal.promedioTiempoEntregaDesdePedido = TimeSpan.FromMinutes(tiempoEntregaDesdePedido / (double)resultados.Count); resultadoSimulacionTotal.probabilidadIngresoMenosDe250 = ingresoConMenosDe250 / (double)resultados.Count; resultadoSimulacionTotal.probabilidadPedidosCaidosOGratis = cantidadSimulacionesCon5PedidosCaidosOAbandonados / (double)resultados.Count; resultadoSimulacionTotal.ingresosGeneradosTotal = valorIngresos; resultadoSimulacionTotal.ingresoPromedioDiario = ingresoDiarioPromedio / (double)resultados.Count; resultadoSimulacionTotal.ingresoDesvioDiario = ingresoDiarioDesvio / (double)resultados.Count; return(resultadoSimulacionTotal); }
private void btnIniciarSimulacion_Click(object sender, EventArgs e) { tomarDatos(); reiniciarTabla(ref simulacionDiariaDataTable); actual = new VectorEstado(); anterior = new VectorEstado(); generarEventoInicial(); TimeSpan tiempoProximoEvento; string evento = anterior.evento; Pedido pedidoAux; while (evento != EVENTO_FIN_DE_SIMULACION) { actual.productoPedido = ""; evento = getProximoEvento(out tiempoProximoEvento, out pedidoAux); actual.numeroEvento = anterior.numeroEvento + 1; actual.reloj = tiempoProximoEvento; if (evento != EVENTO_FIN_DE_SIMULACION) { actualizarTiempoLibreServidores(); } verificarPedidosExcedidos(); switch (evento) { case EVENTO_LLEGADA_DE_PEDIDO: simularLlegadaDePedido(); break; case EVENTO_PEDIDO_FINALIZADO: simularPedidoFinalizado(pedidoAux); break; case EVENTO_ENTREGA_DE_PEDIDO: simularEntregaDePedido(); break; case EVENTO_FIN_DE_SIMULACION: actual.evento = evento; actual.reloj = anterior.reloj; break; default: break; } getPromediosPuntoB(); // **NOTA: copio los datos de esta manera para trabajar con solo los 2 vectores en memoria y operar con el actual anterior.clonar(actual); agregarFila(actual, ref simulacionDiariaDataTable); } mostrarEstadisticas(); resultados.Add(actual); agregarSimulacion(actual); }
private void agregarFila(VectorEstado actual, ref DataTable tabla) { string formatoDecimal = "0.0000"; string formatoTimeSpan = @"hh\:mm\:ss"; var fila = tabla.NewRow(); fila["Numero Evento"] = actual.numeroEvento; fila["Evento"] = actual.evento; fila["Reloj"] = actual.reloj.ToString(formatoTimeSpan); fila["Tiempo entre llegadas"] = actual.tiempoEntreLlegada.ToString(formatoTimeSpan); fila["Proxima Llegada"] = actual.momentoProximaLlegada.ToString(formatoTimeSpan); fila["Cola Pedidos"] = actual.longitudColaPedido; fila["Producto Pedido"] = actual.productoPedido; fila["Tiempo de proceso servidor 1"] = actual.cocineros[2].tiempoProceso.ToString(formatoTimeSpan); fila["Momento Fin Proceso servidor 1"] = actual.cocineros[2].finProceso().ToString(formatoTimeSpan); fila["Estado Servidor 1"] = actual.cocineros[2].estadoServidor.ToString(); fila["Tiempo de proceso servidor 2"] = actual.cocineros[1].tiempoProceso.ToString(formatoTimeSpan); fila["Momento Fin Proceso servidor 2"] = actual.cocineros[1].finProceso().ToString(formatoTimeSpan); fila["Estado Servidor 2"] = actual.cocineros[1].estadoServidor.ToString(); fila["Tiempo de proceso servidor 3"] = actual.cocineros[0].tiempoProceso.ToString(formatoTimeSpan); fila["Momento Fin Proceso servidor 3"] = actual.cocineros[0].finProceso().ToString(formatoTimeSpan); fila["Estado Servidor 3"] = actual.cocineros[0].estadoServidor.ToString(); fila["Cola Delivery"] = actual.longitudColaDelivery; fila["Tiempo Entrega"] = actual.delivery.tiempoProceso.ToString(formatoTimeSpan); fila["Momento Entrega"] = actual.delivery.finProceso().ToString(formatoTimeSpan); fila["Estado Delivery"] = actual.delivery.estadoServidor.ToString(); fila["Cantidad Sandwiches"] = actual.sandwichPreparados; fila["Cantidad Pizzas"] = actual.pizzasPreparadas; fila["Cantidad Empanadas"] = actual.empanadasPreparadas; fila["Cantidad Lomitos"] = actual.lomitosPreparados; fila["Cantidad Hamburguesas"] = actual.hamburguesasPreparados; fila["Tiempo Libre Cocinero 1"] = actual.cocineros[2].tiempoLibre.ToString(formatoTimeSpan); fila["Tiempo Libre Cocinero 2"] = actual.cocineros[1].tiempoLibre.ToString(formatoTimeSpan); fila["Tiempo Libre Cocinero 3"] = actual.cocineros[0].tiempoLibre.ToString(formatoTimeSpan); fila["Tiempo Entre Llegadas Promedio"] = actual.tiempoEntreLlegadasPromedio.ToString(formatoTimeSpan); fila["Tiempo Entre Llegadas Desviacion"] = TimeSpan.FromMinutes(Math.Sqrt(actual.tiempoEntreLlegadasDesviacion.TotalMinutes)).ToString(formatoTimeSpan); fila["Tiempo Preparación Sandwich Promedio"] = actual.tiempoPreparacionDeSandwichPromedio.ToString(formatoTimeSpan); fila["Tiempo Preparación Sandwich Desviacion"] = TimeSpan.FromMinutes(Math.Sqrt(actual.tiempoSandwichPreparadosDesviacion)).ToString(formatoTimeSpan); fila["Tiempo Preparación Pizza Promedio"] = actual.tiempoPreparacionDePizzaPromedio.ToString(formatoTimeSpan); fila["Tiempo Preparación Pizza Desviacion"] = TimeSpan.FromMinutes(Math.Sqrt(actual.tiempoCoccionPizzaDesviacion)).ToString(formatoTimeSpan); fila["Tiempo Cocción Empanadas Promedio"] = actual.tiempoCoccionEmpanadasPromedio.ToString(formatoTimeSpan); fila["Tiempo Cocción Empanadas Desviacion"] = TimeSpan.FromMinutes(Math.Sqrt(actual.tiempoCoccionEmpanadasDesviacion)).ToString(formatoTimeSpan); fila["Tiempo de Entrega de Pedidos Promedio"] = actual.tiempoEntregaPromedio.ToString(formatoTimeSpan); fila["Tiempo de Entrega de Pedidos Desviacion"] = TimeSpan.FromMinutes(Math.Sqrt(actual.tiempoEntregaDesviacion.TotalMinutes)).ToString(formatoTimeSpan); fila["Probabilidad ingreso < 250"] = actual.probabilidadIngresoMenosDe250.ToString(formatoDecimal); fila["Probabilidad pedidos caidos o gratis"] = actual.probabilidadPedidosCaidosOGratis.ToString(formatoDecimal); tabla.Rows.Add(fila); }
private void btnSimular_Click(object sender, EventArgs e) { dgvFuncion.Rows.Clear(); limpiarClientes(); dgvFunciones.Rows.Clear(); resetearAcumuladores(); if (validarCampos()) { for (int i = 0; i < numSim; i++) { anterior = new VectorEstado(); actual = new VectorEstado(); actual.Reloj = 0; actual.Evento = "inicio_simulacion"; actual.Boletero = new Boletero(); actual.Boleteria = new Queue <Cliente>(); actual.Entrada = new Queue <Cliente>(); Cliente clienteAtendido = new Cliente(0, false); Cliente entrante = new Cliente(0, false); empezoPelicula = false; empezoSimulacion = false; ingresoLlegadaEntrada = false; ingresoASala = false; List <Cliente> clientes = new List <Cliente>(); while (actual.ButacasOcupadas < tamSala && !(actual.PersonasEnColaSala == 0 && empezoPelicula) || actual.Boletero.Estado == "ocupado") { anterior = actual; actual = new VectorEstado(); copiarAnterior(); buscarEvento(); switch (actual.Evento) { case "inicio_simulacion": resetearCampos(); actual.ButacasOcupadas = 0; actual.NumeroSimulacion = i + 1; actual.PersonasEnColaSala = 0; actual.TiempoOcupacionBoletero = 0; actual.RndLlegadaCompra = random.NextDouble(); actual.LlegadaCompra = aleatorioU(desdeTiempoLlegadaCompra, hastaTiempoLlegadaCompra, actual.RndLlegadaCompra); actual.ProximaLlegadaCompra = actual.Reloj + actual.LlegadaCompra; empezoSimulacion = true; break; case "llegada_compra": resetearCampos(); if (empezoPelicula) { break; } actual.RndLlegadaCompra = random.NextDouble(); actual.LlegadaCompra = aleatorioU(desdeTiempoLlegadaCompra, hastaTiempoLlegadaCompra, actual.RndLlegadaCompra); actual.ProximaLlegadaCompra = actual.Reloj + actual.LlegadaCompra; actual.RndNumeroCompra = random.NextDouble(); actual.NumeroCompra = aleatorioInt(desdeEntradasComprar, hastaEntradasComprar, actual.RndNumeroCompra); Cliente nuevo = new Cliente(actual.NumeroCompra, false); nuevo.Nombre = "Cliente" + (clientes.Count + 1); clientes.Add(nuevo); for (int m = 0; m < actual.NumeroCompra - 1; m++) { Cliente nuevoAcompañante = new Cliente(actual.NumeroCompra, false); nuevoAcompañante.Nombre = "Cliente" + (clientes.Count + 1); clientes.Add(nuevoAcompañante); nuevo.Acompañantes.Add(nuevoAcompañante); } if (actual.Boletero.Estado == "ocupado") { actual.Boleteria.Enqueue(nuevo); } else { clienteAtendido = nuevo; clienteAtendido.Estado = "comprando"; foreach (Cliente acompañante in clienteAtendido.Acompañantes) { acompañante.Estado = "acomp_" + clienteAtendido.Nombre; } actual.Boletero.Estado = "ocupado"; actual.Boletero.InicioOcupacion = actual.Reloj; actual.RndFinCompra = random.NextDouble(); actual.FinCompra = aleatorioU(desdeTiempoCompra, hastaTiempoCompra, actual.RndFinCompra); actual.ProximoFinCompra = actual.Reloj + actual.FinCompra; } break; case "llegada_entrada_anticipada": resetearCampos(); if (empezoPelicula) { break; } actual.RndLlegadaEntrada = random.NextDouble(); actual.LlegadaEntrada = aleatorioU(desdeTiempoLlegadaAnticipada, hastaTiempoLlegadaAnticipada, actual.RndLlegadaEntrada); actual.ProximaLlegadaEntrada = actual.Reloj + actual.LlegadaEntrada; actual.RndNumeroEntrada = random.NextDouble(); actual.NumeroEntrada = aleatorioInt(desdeEntradasAnticipadas, hastaEntradasAnticipadas, actual.RndNumeroEntrada); if (actual.PersonasEnColaSala == 0 && ingresoASala) { actual.RndFinEntrada = random.NextDouble(); actual.FinEntrada = aleatorioU(desdeTiempoEntradaSala, hastaTiempoEntradaSala, actual.RndFinEntrada); actual.ProximoFinEntrada = actual.Reloj + actual.FinEntrada; } actual.PersonasEnColaSala += actual.NumeroEntrada; actual.EntradasVendidas += actual.NumeroEntrada; actual.EntradasAnticipadas += actual.NumeroEntrada; for (int j = 0; j < actual.NumeroEntrada; j++) { Cliente nuevoAnticipada = new Cliente(actual.NumeroCompra, true); nuevoAnticipada.Nombre = "Cliente" + (clientes.Count + 1); actual.Entrada.Enqueue(nuevoAnticipada); clientes.Add(nuevoAnticipada); } break; case "fin_compra": resetearCampos(); if (actual.PersonasEnColaSala == 0 && ingresoASala) { actual.RndFinEntrada = random.NextDouble(); actual.FinEntrada = aleatorioU(desdeTiempoEntradaSala, hastaTiempoEntradaSala, actual.RndFinEntrada); actual.ProximoFinEntrada = actual.Reloj + actual.FinEntrada; } actual.PersonasEnColaSala += clienteAtendido.NumeroEntradas; actual.EntradasVendidas += clienteAtendido.NumeroEntradas; clienteAtendido.Estado = "esperando_entrar"; actual.Entrada.Enqueue(clienteAtendido); foreach (Cliente acompañante in clienteAtendido.Acompañantes) { acompañante.Estado = "esperando_entrar"; actual.Entrada.Enqueue(acompañante); } actual.TiempoOcupacionBoletero += actual.Reloj - actual.Boletero.InicioOcupacion; if (actual.Boleteria.Count != 0 && !empezoPelicula) { clienteAtendido = actual.Boleteria.Dequeue(); clienteAtendido.Estado = "comprando"; foreach (Cliente acompañante in clienteAtendido.Acompañantes) { acompañante.Estado = "acomp_" + clienteAtendido.Nombre; } actual.RndFinCompra = random.NextDouble(); actual.FinCompra = aleatorioU(desdeTiempoCompra, hastaTiempoCompra, actual.RndFinCompra); actual.ProximoFinCompra = actual.Reloj + actual.FinCompra; actual.Boletero.InicioOcupacion = actual.Reloj; } else { actual.Boletero.Estado = "libre"; actual.ProximoFinCompra = -1; } break; case "fin_entrada": resetearCampos(); if (actual.ButacasOcupadas < tamSala && actual.PersonasEnColaSala > 0) { entrante.Estado = ""; actual.ButacasOcupadas += 1; entrante = actual.Entrada.Dequeue(); entrante.Estado = "entrando"; actual.PersonasEnColaSala = actual.Entrada.Count; actual.RndFinEntrada = random.NextDouble(); actual.FinEntrada = aleatorioU(desdeTiempoEntradaSala, hastaTiempoEntradaSala, actual.RndFinEntrada); actual.ProximoFinEntrada = actual.Reloj + actual.FinEntrada; } else { actual.ProximoFinEntrada = -1; } break; case "inicio_llegada_con_entrada": resetearCampos(); actual.RndLlegadaEntrada = random.NextDouble(); actual.LlegadaEntrada = aleatorioU(desdeTiempoLlegadaAnticipada, hastaTiempoLlegadaAnticipada, actual.RndLlegadaEntrada); actual.ProximaLlegadaEntrada = actual.Reloj + actual.LlegadaEntrada; ingresoLlegadaEntrada = true; break; case "inicio_ingreso_sala": resetearCampos(); if (actual.PersonasEnColaSala > 0) { actual.RndFinEntrada = random.NextDouble(); actual.FinEntrada = aleatorioU(desdeTiempoEntradaSala, hastaTiempoEntradaSala, actual.RndFinEntrada); actual.ProximoFinEntrada = actual.Reloj + actual.FinEntrada; entrante = actual.Entrada.Dequeue(); entrante.Estado = "entrando"; } ingresoASala = true; break; case "inicio_pelicula": resetearCampos(); actual.ProximaLlegadaCompra = -1; actual.ProximaLlegadaEntrada = -1; empezoPelicula = true; foreach (Cliente cliente in actual.Boleteria) { cliente.Estado = ""; foreach (Cliente acompañante in cliente.Acompañantes) { acompañante.Estado = ""; } } break; } if (actual.NumeroSimulacion == simMostrar) { agregarDatosDGV(actual); agregarClientesDGV(clientes); } } agregarDatosDGVFunciones(actual); } } }