private void agregarDatosDGV(VectorEstado actual) { String rndLlegadaCliente, tiempoLlegadaCliente, proximaLlegadaCliente, rndServir, tiempoServir, proximoFinServir, tiempoLavado, tiempoRestanteLavado, proximoFinLavado, rndCantVasos, cantVasos, tiempoRecoger, tiempoRestanteRecoger, proximoFinRecoger, tiempoConsumo; rndLlegadaCliente = tiempoLlegadaCliente = proximaLlegadaCliente = rndServir = tiempoServir = proximoFinServir = tiempoLavado = tiempoRestanteLavado = proximoFinLavado = rndCantVasos = cantVasos = tiempoRecoger = tiempoRestanteRecoger = proximoFinRecoger = tiempoConsumo = ""; if (actual.RndLlegadaCliente > 0) { rndLlegadaCliente = Math.Round(actual.RndLlegadaCliente, 2).ToString(); } if (actual.TiempoLlegadaCliente > 0) { tiempoLlegadaCliente = Math.Round(actual.TiempoLlegadaCliente, 2).ToString(); } if (actual.ProximaLlegadaCliente > 0) { proximaLlegadaCliente = Math.Round(actual.ProximaLlegadaCliente, 2).ToString(); } if (actual.RndServir > 0) { rndServir = Math.Round(actual.RndServir, 2).ToString(); } if (actual.TiempoServir > 0) { tiempoServir = Math.Round(actual.TiempoServir, 2).ToString(); } if (actual.ProximoFinServir > 0) { proximoFinServir = Math.Round(actual.ProximoFinServir, 2).ToString(); } if (actual.TiempoLavado > 0) { tiempoLavado = Math.Round(actual.TiempoLavado, 2).ToString(); } if (actual.TiempoRestanteLavado > 0) { tiempoRestanteLavado = Math.Round(actual.TiempoRestanteLavado, 2).ToString(); } if (actual.ProximoFinLavado > 0) { proximoFinLavado = Math.Round(actual.ProximoFinLavado, 2).ToString(); } if (actual.RndCantVasos > 0) { rndCantVasos = Math.Round(actual.RndCantVasos, 2).ToString(); } if (actual.CantVasos > 0) { cantVasos = actual.CantVasos.ToString(); } if (actual.TiempoRecoger > 0) { tiempoRecoger = Math.Round(actual.TiempoRecoger, 2).ToString(); } if (actual.TiempoRestanteRecoger > 0) { tiempoRestanteRecoger = Math.Round(actual.TiempoRestanteRecoger, 2).ToString(); } if (actual.ProximoFinRecoger > 0) { proximoFinRecoger = Math.Round(actual.ProximoFinRecoger, 2).ToString(); } if (actual.TiempoConsumo > 0) { tiempoConsumo = Math.Round(actual.TiempoConsumo, 2).ToString(); } dgvTabla.Rows.Add(actual.Evento, Math.Round(actual.Reloj, 2), rndLlegadaCliente, tiempoLlegadaCliente, proximaLlegadaCliente, rndServir, tiempoServir, proximoFinServir, tiempoLavado, tiempoRestanteLavado, proximoFinLavado, rndCantVasos, cantVasos, tiempoRecoger, tiempoRestanteRecoger, proximoFinRecoger, tiempoConsumo, actual.Cantinero.Estado, actual.Clientes.Count, actual.CantVasosLimpios, actual.CantVasosSucios, actual.CantClientesSeVanSinConsumir, Math.Round(actual.EsperaMaximaCliente, 2), actual.CantClientesConsumieron, Math.Round(actual.Cantinero.TiempoTrabajando, 2), Math.Round(actual.Cantinero.TiempoSirviendo, 2), Math.Round(actual.Cantinero.TiempoLavando, 2), Math.Round(actual.Cantinero.TiempoRecogiendo, 2), actual.Cantinero.getPorcentajeTiempoSirviendo(), actual.Cantinero.getPorcentajeTiempoLavando(), actual.Cantinero.getPorcentajeTiempoRecogiendo()); }
private void btnSimular_Click(object sender, EventArgs e) { if (validarCampos()) { btnRungeKutta.Enabled = true; dgvTabla.Rows.Clear(); limpiarClientes(); clientes = new List <Cliente>(); anterior = new VectorEstado(); actual = new VectorEstado(); if (frmRKConsumo != null) { frmRKConsumo.Close(); } frmRKConsumo = new frmRungeKutta(pasoH, capacidadVaso); double tiempoConsumo = frmRKConsumo.rungeKuttaConsumoCargaDGV(0); Cliente atendido = new Cliente("", "", -1); actual.Evento = "inicializacion"; actual.Reloj = minutosDesdeAbrio; actual.Cantinero = new Cantinero(); actual.Clientes = new Queue <Cliente>(); actual.CantVasosLimpios = 4; actual.RndLlegadaCliente = random.NextDouble(); actual.TiempoLlegadaCliente = aleatorioExpN(cantMediaClientes, actual.RndLlegadaCliente); actual.ProximaLlegadaCliente = actual.Reloj + actual.TiempoLlegadaCliente; actual.RndCantVasos = random.NextDouble(); actual.CantVasos = aleatorioInt2(1, 10, actual.RndCantVasos); actual.TiempoRecoger = tiempoRecoger(actual.CantVasos); actual.ProximoFinRecoger = actual.Reloj + actual.TiempoRecoger; actual.Cantinero.Estado = "Recogiendo"; if (actual.Reloj >= mostrarDesdeMinuto && actual.Reloj <= mostrarDesdeMinuto + cantidadMinutosAMostrar) { agregarDatosDGV(actual); } do { anterior = actual; actual = new VectorEstado(); copiarAnterior(); buscarEvento(); switch (actual.Evento) { case "llegada_cliente": resetearCampos(); calcularTiemposYPorcentajes(actual.Cantinero); actual.RndLlegadaCliente = random.NextDouble(); actual.TiempoLlegadaCliente = aleatorioExpN(cantMediaClientes, actual.RndLlegadaCliente); actual.ProximaLlegadaCliente = actual.Reloj + actual.TiempoLlegadaCliente; if (actual.Clientes.Count == 0) { int numeroCliente = clientes.Count + 1; Cliente cliente = new Cliente("Cliente " + numeroCliente, "EA", actual.Reloj); clientes.Add(cliente); actual.Clientes.Enqueue(cliente); if (anterior.Cantinero.Estado != "Sirviendo") { if (actual.CantVasosLimpios >= 1) { if (anterior.Cantinero.Estado == "Lavando") { actual.TiempoRestanteLavado = anterior.ProximoFinLavado - actual.Reloj; actual.ProximoFinLavado = -1; } if (anterior.Cantinero.Estado == "Recogiendo") { actual.TiempoRestanteRecoger = anterior.ProximoFinRecoger - actual.Reloj; actual.ProximoFinRecoger = -1; } atendido = actual.Clientes.Dequeue(); atendido.Estado = "SA"; actual.Cantinero.Estado = "Sirviendo"; actual.CantVasosLimpios = anterior.CantVasosLimpios - 1; actual.RndServir = random.NextDouble(); actual.TiempoServir = aleatorioU(demoraServirDesde, demoraServirHasta, actual.RndServir); actual.ProximoFinServir = actual.Reloj + actual.TiempoServir; } else { if (actual.CantVasosSucios >= 1) { if (anterior.Cantinero.Estado == "Lavando") { break; } actual.TiempoLavado = demoraLavar; actual.ProximoFinLavado = actual.Reloj + actual.TiempoLavado; actual.Cantinero.Estado = "Lavando"; } else { if (anterior.Cantinero.Estado == "Recogiendo") { break; } actual.RndCantVasos = random.NextDouble(); actual.CantVasos = aleatorioInt2(1, 10, actual.RndCantVasos); actual.TiempoRecoger = tiempoRecoger(actual.CantVasos); actual.ProximoFinRecoger = actual.Reloj + actual.TiempoRecoger; actual.Cantinero.Estado = "Recogiendo"; } } } else { break; } } else { actual.CantClientesSeVanSinConsumir = anterior.CantClientesSeVanSinConsumir + 1; break; } break; case "fin_servir": resetearCampos(); calcularTiemposYPorcentajes(actual.Cantinero); actual.TiempoConsumo = tiempoConsumo; actual.ProximoFinServir = -1; atendido.HoraLlegada = -1; atendido.Estado = "Cons"; atendido.FinConsumo = actual.Reloj + actual.TiempoConsumo; if (actual.Clientes.Count > 0) { if (actual.CantVasosLimpios >= 1) { atendido = actual.Clientes.Dequeue(); atendido.Estado = "SA"; double espera = actual.Reloj - atendido.HoraLlegada; if (espera > anterior.EsperaMaximaCliente) { actual.EsperaMaximaCliente = espera; } atendido.HoraLlegada = -1; actual.Cantinero.Estado = "Sirviendo"; actual.CantVasosLimpios = anterior.CantVasosLimpios - 1; actual.RndServir = random.NextDouble(); actual.TiempoServir = aleatorioU(demoraServirDesde, demoraServirHasta, actual.RndServir); actual.ProximoFinServir = actual.Reloj + actual.TiempoServir; } else { if (actual.CantVasosSucios >= 1) { if (anterior.TiempoRestanteLavado > 0) { actual.ProximoFinLavado = actual.Reloj + anterior.TiempoRestanteLavado; actual.Cantinero.Estado = "Lavando"; actual.TiempoRestanteLavado = -1; break; } actual.TiempoLavado = demoraLavar; actual.ProximoFinLavado = actual.Reloj + actual.TiempoLavado; actual.Cantinero.Estado = "Lavando"; } else { if (anterior.TiempoRestanteRecoger > 0) { actual.ProximoFinRecoger = actual.Reloj + anterior.TiempoRestanteRecoger; actual.Cantinero.Estado = "Recogiendo"; actual.TiempoRestanteRecoger = -1; break; } actual.RndCantVasos = random.NextDouble(); actual.CantVasos = aleatorioInt2(1, 10, actual.RndCantVasos); actual.TiempoRecoger = tiempoRecoger(actual.CantVasos); actual.ProximoFinRecoger = actual.Reloj + actual.TiempoRecoger; actual.Cantinero.Estado = "Recogiendo"; } } } else { if (actual.CantVasosSucios >= 1) { if (anterior.TiempoRestanteLavado > 0) { actual.ProximoFinLavado = actual.Reloj + anterior.TiempoRestanteLavado; actual.Cantinero.Estado = "Lavando"; actual.TiempoRestanteLavado = -1; break; } actual.TiempoLavado = demoraLavar; actual.ProximoFinLavado = actual.Reloj + actual.TiempoLavado; actual.Cantinero.Estado = "Lavando"; } else { if (anterior.TiempoRestanteRecoger > 0) { actual.ProximoFinRecoger = actual.Reloj + anterior.TiempoRestanteRecoger; actual.Cantinero.Estado = "Recogiendo"; actual.TiempoRestanteRecoger = -1; break; } actual.RndCantVasos = random.NextDouble(); actual.CantVasos = aleatorioInt2(1, 10, actual.RndCantVasos); actual.TiempoRecoger = tiempoRecoger(actual.CantVasos); actual.ProximoFinRecoger = actual.Reloj + actual.TiempoRecoger; actual.Cantinero.Estado = "Recogiendo"; } } break; case "fin_lavado": resetearCampos(); calcularTiemposYPorcentajes(actual.Cantinero); actual.ProximoFinLavado = -1; actual.CantVasosLimpios = anterior.CantVasosLimpios + 1; actual.CantVasosSucios = anterior.CantVasosSucios - 1; if (actual.Clientes.Count > 0) { atendido = actual.Clientes.Dequeue(); atendido.Estado = "SA"; double espera = actual.Reloj - atendido.HoraLlegada; if (espera > anterior.EsperaMaximaCliente) { actual.EsperaMaximaCliente = espera; } atendido.HoraLlegada = -1; actual.Cantinero.Estado = "Sirviendo"; actual.CantVasosLimpios = actual.CantVasosLimpios - 1; actual.RndServir = random.NextDouble(); actual.TiempoServir = aleatorioU(demoraServirDesde, demoraServirHasta, actual.RndServir); actual.ProximoFinServir = actual.Reloj + actual.TiempoServir; } else { if (actual.CantVasosSucios >= 1) { actual.TiempoLavado = demoraLavar; actual.ProximoFinLavado = actual.Reloj + actual.TiempoLavado; actual.Cantinero.Estado = "Lavando"; } else { actual.RndCantVasos = random.NextDouble(); actual.CantVasos = aleatorioInt2(1, 10, actual.RndCantVasos); actual.TiempoRecoger = tiempoRecoger(actual.CantVasos); actual.ProximoFinRecoger = actual.Reloj + actual.TiempoRecoger; actual.Cantinero.Estado = "Recogiendo"; } } break; case "fin_recoger": resetearCampos(); calcularTiemposYPorcentajes(actual.Cantinero); actual.CantVasosSucios = anterior.CantVasosSucios + anterior.CantVasos; actual.CantVasos = -1; actual.ProximoFinRecoger = -1; if (actual.Clientes.Count > 0) { if (actual.CantVasosLimpios >= 1) { atendido = actual.Clientes.Dequeue(); atendido.Estado = "SA"; double espera = actual.Reloj - atendido.HoraLlegada; if (espera > anterior.EsperaMaximaCliente) { actual.EsperaMaximaCliente = espera; } atendido.HoraLlegada = -1; actual.Cantinero.Estado = "Sirviendo"; actual.CantVasosLimpios = anterior.CantVasosLimpios - 1; actual.RndServir = random.NextDouble(); actual.TiempoServir = aleatorioU(demoraServirDesde, demoraServirHasta, actual.RndServir); actual.ProximoFinServir = actual.Reloj + actual.TiempoServir; } else { actual.TiempoLavado = demoraLavar; actual.ProximoFinLavado = actual.Reloj + actual.TiempoLavado; actual.Cantinero.Estado = "Lavando"; } } else { actual.TiempoLavado = demoraLavar; actual.ProximoFinLavado = actual.Reloj + actual.TiempoLavado; actual.Cantinero.Estado = "Lavando"; } break; case "fin_consumo": resetearCampos(); calcularTiemposYPorcentajes(actual.Cantinero); actual.CantClientesConsumieron = anterior.CantClientesConsumieron + 1; menorFinConsumo.Estado = ""; menorFinConsumo.HoraLlegada = -1; menorFinConsumo.FinConsumo = -1; break; } if (actual.Reloj >= mostrarDesdeMinuto && actual.Reloj <= mostrarDesdeMinuto + cantidadMinutosAMostrar) { agregarDatosDGV(actual); agregarClientesDGV(clientes); } } while (actual.Reloj <= minutosDesdeAbrio + minutosASimular); if (cantidadMinutosAMostrar + mostrarDesdeMinuto < minutosASimular) { agregarDatosDGV(actual); agregarClientesDGV(clientes); } } }