Ejemplo n.º 1
0
        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());
        }
Ejemplo n.º 2
0
        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);
                }
            }
        }