Пример #1
0
        //Boton
        private void btnSimular_Click(object sender, EventArgs e)
        {
            dataGridView1.Rows.Clear();

            TablaBase genTabla = new TablaBase();

            //Variables
            double tiempoArmazon;
            double limiteSuperiorMotor;
            double limiteInferiorMotor;
            double mediaRuedas;
            double desviacion;
            double tiempoEnsamblajeAM;
            double tiempoEnsamblajeRuedas;

            //En caso de ser True, utiliza los valores oringinales del ejercicio
            if (chkValOriginales.Checked)
            {
                tiempoArmazon          = Convert.ToDouble(10.00001);
                limiteSuperiorMotor    = Convert.ToDouble(40);
                limiteInferiorMotor    = Convert.ToDouble(30);
                mediaRuedas            = Convert.ToDouble(70);
                desviacion             = Convert.ToDouble(8);
                tiempoEnsamblajeAM     = Convert.ToDouble(10);
                tiempoEnsamblajeRuedas = Convert.ToDouble(5);
            }
            else
            {
                tiempoArmazon          = Convert.ToDouble(txtLlegadaArmazon.Text) + 0.00002;
                limiteSuperiorMotor    = Convert.ToDouble(txtLimiteMaximo.Text);
                limiteInferiorMotor    = Convert.ToDouble(txtLimiteInferior.Text);
                mediaRuedas            = Convert.ToDouble(txtMediaRuedas.Text);
                desviacion             = Convert.ToDouble(txtDesviacionRuedas.Text);
                tiempoEnsamblajeAM     = Convert.ToDouble(txtEnsamblajeAM.Text) + 0.00001;
                tiempoEnsamblajeRuedas = Convert.ToDouble(txtEnsamblajeRuedas.Text) + 0.00003;
            }


            double[,] vs = genTabla.generarVector();


            for (int i = 0; i < Convert.ToInt32(txtCantidadSim.Text); i++)
            {
                genTabla.generarTabla(vs, tiempoArmazon, limiteSuperiorMotor, limiteInferiorMotor, mediaRuedas, desviacion, tiempoEnsamblajeAM, tiempoEnsamblajeRuedas, 20, 320.2, 366.9, 416.47);

                if (i == 0 || ((i + 1) >= Convert.ToInt32(txtDesde.Text) && i < Convert.ToInt32(txtHasta.Text)))
                {
                    Herramientas.matrizAGrid2(vs, dataGridView1, 4);
                    Herramientas.setearTipoEstado(dataGridView1);
                    Herramientas.setearEvento(dataGridView1);
                }


                /*
                 * for (int z = 0; z < vs.GetLength(0); z++)
                 * {
                 *  for (int j = 0; j < vs.GetLength(1); j++)
                 *  {
                 *      Console.Write(vs[z, j] + "\t");
                 *  }
                 *  Console.WriteLine();
                 *
                 * }
                 *
                 * Console.WriteLine();
                 * Console.WriteLine();
                 * Console.WriteLine();
                 */
            }

            //Se muestra la ultima fila
            Herramientas.matrizAGrid2(vs, dataGridView1, 4);
            Herramientas.setearEvento(dataGridView1);
            Herramientas.setearTipoEstado(dataGridView1);


            //Calculo los valores
            double[] valores = new double[2];
            valores = genTabla.calcularPorcentajes(dataGridView1);

            txtPorEnsamblej.Text  = Herramientas.TruncadoMarcelo(valores[0], 2).ToString() + "%";
            txtPorAreaRuedas.Text = Herramientas.TruncadoMarcelo(valores[1], 2).ToString() + "%";

            //Obtengo la cantidad de triciclos y la muestro
            txtCantTriciclos.Text = dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[28].Value.ToString();

            //Obtengo las colas maximas y las muestro
            txtCantMaxRuedas.Text  = dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[30].Value.ToString();
            txtCantMaxMotores.Text = dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[29].Value.ToString();
            txtCantMaxAM.Text      = dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[31].Value.ToString();
        }
Пример #2
0
        public void generarTabla(double[,] vector, double tiempoArmazon, double limiteMaxMotor, double limiteMinMotor, double mediaRuedas, double desviacionEstRuedas, double tiempoEnsamblajeAM, double tiempoEnsamblajeRuedas, double tiempoInterrupcion, double t50, double t70, double t100)
        {
            GeneradorVariables generador = new GeneradorVariables();
            Random             rnd       = new Random();

            // El problema es este, nos olvidamos que primero tenemos que pasar la fila 2 al lugar de la 1 y despues copiarla
            //FILA ORIGEN -------FILA DESTINO
            if (vector[1, 0] != 0)
            {
                copiarFila(vector, 1, 0);
            }

            copiarFila(vector, 0, 1);

            double[] vectorMenor = buscarMenor(vector);

            double random = rnd.NextDouble();

            if (vector[0, 6] == random)
            {
                random = rnd.NextDouble();
            }

            //Obtengo el evento
            vector[1, 1] = vectorMenor[0];
            //Obtengo el reloj
            vector[1, 2] = vectorMenor[1];

            switch (vector[1, 1])
            {
            //Proxima Llegada armazon
            case 4:    //Ver casos especiales
                //Verifico si hay armazones en espera
                if (vector[0, 5] == 0)
                {
                    //Verifica Si el area de ensamblaje esta libre (0 es libre)
                    if (vector[0, 13] == 0)
                    {
                        //Verifica si hay motores (Si es diferente de 0 Hay)
                        if (vector[0, 9] != 0)
                        {
                            //Resto un motor
                            vector[1, 9] = vector[0, 9] - 1;
                            //Cambio el estado del area del ensamblaje
                            vector[1, 13] = Convert.ToDouble(1);
                            //Tiempo de ensamblaje
                            vector[1, 10] = tiempoEnsamblajeAM;
                            //Calculo tiempo proximo ensamblaje
                            vector[1, 11] = vector[1, 2] + vector[1, 10];
                            //Calculo el tiempo del proximo Armazon
                            vector[1, 4] = vector[1, 2] + tiempoArmazon;
                        }
                        else
                        {
                            //Agrego Stock de armazon
                            vector[1, 5] = vector[0, 5] + 1;
                            vector[1, 3] = 0;
                        }
                    }
                    //No esta libre el area de ensamblaje
                    else
                    {
                        //Agrego Stock de Armazon
                        vector[1, 5] = vector[0, 5] + 1;
                        vector[1, 3] = 0;
                    }
                }
                else
                {
                    vector[1, 3] = 0;
                }

                //Asigno el valor de inactividad del area Ensamblaje
                vector[1, 25] = tiempoInactividadE(vector);

                //Asigno el valor de inactividad del area Ruedas
                vector[1, 26] = tiempoInactividadAR(vector);

                //Asigno el valor de inactividad total
                vector[1, 27] = tiempoInactividadTotal(vector);

                //Asigno el valor de la Cola Maxima Motores
                vector[1, 29] = colaMaximaMotores(vector);

                //Asigno el valor de la Cola Maxima AM
                vector[1, 31] = colaMaximaAM(vector);

                //Asigno el valor de la Cola Maxima Ruedas
                vector[1, 30] = colaMaximaRuedas(vector);

                vector[1, 0] = vector[0, 0] + 1;


                break;

            //Proxima Llegada Motor
            case 8:
                //Agrego 5 motores al stock
                vector[1, 9] = vector[0, 9] + 5;

                //Verifico si el area ensamblaje esta libre y si disponemos de armazones
                int estado          = Convert.ToInt32(vector[0, 13]);
                int cantidadArmazon = Convert.ToInt32(vector[0, 5]);

                if (estado == 0 && cantidadArmazon > 0)
                {
                    //Asigno el estado ocupado
                    vector[1, 13] = 1;
                    //Asigno tiempo llegada E
                    vector[1, 10] = tiempoEnsamblajeAM;
                    //Calculo la Proxima llegada E
                    vector[1, 11] = vector[1, 2] + vector[1, 10];

                    //Calculo el proximo armazon
                    vector[1, 3] = tiempoArmazon;
                    vector[1, 4] = vector[1, 2] + tiempoArmazon;

                    //Resto los stock de Armazon y Motor
                    vector[1, 5] = vector[1, 5] - 1;
                    vector[1, 9] = vector[1, 9] - 1;
                }

                //Calculo la proxima llegada de motores

                int    limiteInf     = Convert.ToInt32(limiteMinMotor);
                int    limiteSup     = Convert.ToInt32(limiteMaxMotor);
                double tiempoLlegada = generador.Uniforme(limiteInf, limiteSup, random);

                //Asigno RND
                vector[1, 6] = random;
                //Asigno Tiempo Llegada
                vector[1, 7] = tiempoLlegada;
                //Asigno Proxima Llegada
                vector[1, 8] = tiempoLlegada + vector[1, 2];

                //Asigno el valor de inactividad del area Ensamblaje
                vector[1, 25] = tiempoInactividadE(vector);

                //Asigno el valor de inactividad del area Ruedas
                vector[1, 26] = tiempoInactividadAR(vector);

                //Asigno el valor de inactividad total
                vector[1, 27] = tiempoInactividadTotal(vector);

                //Asigno el valor de la Cola Maxima Motores
                vector[1, 29] = colaMaximaMotores(vector);

                //Asigno el valor de la Cola Maxima AM
                vector[1, 31] = colaMaximaAM(vector);

                //Asigno el valor de la Cola Maxima Ruedas
                vector[1, 30] = colaMaximaRuedas(vector);

                vector[1, 0] = vector[0, 0] + 1;

                break;

            //Fin area ensamblaje
            case 11:
                //Colocacion de Ruedas
                //Esta el area de ruedas libre?

                if (vector[0, 24] == 0 && vector[0, 21] >= 3)
                {
                    //Calcular Proximo Triciclo -- Tiempo de Reloj + 5 Minutos
                    vector[1, 23] = vector[1, 2] + tiempoEnsamblajeRuedas;
                    //Actualizar Stock de Ruedas -3
                    vector[1, 21] = vector[0, 21] - 3;
                    //Actualizar Fin_Area_Ruedas a Ocupado
                    vector[1, 24] = 1;
                }
                else
                {
                    //En caso de que el area de ruedas este ocupada sumamos un AM al Stock esperando la desocupacion
                    //Stock AM + 1
                    vector[1, 12] = vector[0, 12] + 1;
                }
                //Comienzo de Nuevo ensamblaje, verificamos que haya un Motor y un Armazon
                if (vector[0, 5] > 0 && vector[0, 9] > 0)
                {
                    //Calculamos el tiempo ensamblaje

                    //Calculamos la finalizacion del proximo ensamblaje
                    vector[1, 11] = vector[1, 2] + tiempoEnsamblajeAM;
                    //Cambiamos el estado del area de ensamblaje a Ocupado
                    vector[1, 13] = 1;

                    //Modificacion para intentar arreglar
                    vector[1, 5] = vector[0, 5] - 1;
                    vector[1, 3] = tiempoArmazon;
                    vector[1, 4] = vector[1, 2] + tiempoArmazon;
                }
                else
                {
                    //Cambiamos el estado del area de ensamblaje a libre
                    vector[1, 13] = 0;
                    vector[1, 11] = 0;
                }

                //Asigno el valor de inactividad del area Ensamblaje
                vector[1, 25] = tiempoInactividadE(vector);

                //Asigno el valor de inactividad del area Ruedas
                vector[1, 26] = tiempoInactividadAR(vector);

                //Asigno el valor de inactividad total
                vector[1, 27] = tiempoInactividadTotal(vector);

                //Asigno el valor de la Cola Maxima Motores
                vector[1, 29] = colaMaximaMotores(vector);

                //Asigno el valor de la Cola Maxima AM
                vector[1, 31] = colaMaximaAM(vector);

                //Asigno el valor de la Cola Maxima Ruedas
                vector[1, 30] = colaMaximaRuedas(vector);

                vector[1, 0] = vector[0, 0] + 1;

                break;


            //Evento inestabilidad
            case 14:
                vector[1, 16] = vector[0, 11] - vector[1, 2];
                vector[1, 11] = 0;
                vector[1, 15] = Herramientas.TruncadoMarcelo(vector[1, 2] + tiempoInterrupcion, 4);
                vector[1, 13] = 3;


                //Asigno el valor de inactividad del area Ensamblaje
                vector[1, 25] = tiempoInactividadE(vector);

                //Asigno el valor de inactividad del area Ruedas
                vector[1, 26] = tiempoInactividadAR(vector);

                //Asigno el valor de inactividad total
                vector[1, 27] = tiempoInactividadTotal(vector);

                //Asigno el valor de la Cola Maxima Motores
                vector[1, 29] = colaMaximaMotores(vector);

                //Asigno el valor de la Cola Maxima AM
                vector[1, 31] = colaMaximaAM(vector);

                //Asigno el valor de la Cola Maxima Ruedas
                vector[1, 30] = colaMaximaRuedas(vector);

                vector[1, 0] = vector[0, 0] + 1;


                break;


            //Evento de fin de purga
            case 15:
                vector[1, 11] = Herramientas.TruncadoMarcelo(vector[1, 2] + vector[0, 16], 4);
                vector[1, 16] = 0;
                vector[1, 14] = Herramientas.TruncadoMarcelo(vector[1, 2] + probabilidadPurga(t50, t70, t100), 4);
                vector[1, 15] = 0;
                vector[1, 13] = 1;


                //Asigno el valor de inactividad del area Ensamblaje
                vector[1, 25] = tiempoInactividadE(vector);

                //Asigno el valor de inactividad del area Ruedas
                vector[1, 26] = tiempoInactividadAR(vector);

                //Asigno el valor de inactividad total
                vector[1, 27] = tiempoInactividadTotal(vector);

                //Asigno el valor de la Cola Maxima Motores
                vector[1, 29] = colaMaximaMotores(vector);

                //Asigno el valor de la Cola Maxima AM
                vector[1, 31] = colaMaximaAM(vector);

                //Asigno el valor de la Cola Maxima Ruedas
                vector[1, 30] = colaMaximaRuedas(vector);

                vector[1, 0] = vector[0, 0] + 1;


                break;

            //Proxima llegada de ruedas
            case 20:
                if (nuevosRandom)
                {
                    vector[1, 17] = rnd.NextDouble();
                    vector[1, 18] = rnd.NextDouble();

                    nuevosRandom = !nuevosRandom;
                }
                else
                {
                    nuevosRandom = !nuevosRandom;
                }
                //Pide Ruedas
                vector[1, 19] = generador.Normal(vector[1, 17], vector[1, 18], mediaRuedas, desviacionEstRuedas);
                vector[1, 20] = vector[1, 2] + vector[1, 19];

                //Agregamos las ruedas que pedimos
                vector[1, 21] = vector[0, 21] + 20;

                //Verificamos si puede armar triciclos (Si fin_Area_Ruedas esta libre)
                if (vector[0, 24] == 0)
                {
                    //Esta libre y verificamos si hay conjuntos AM
                    if (vector[0, 12] != 0)
                    {
                        //Restamos las 3 ruedas
                        vector[1, 21] = vector[1, 21] - 3;
                        //Restamos un conjunto AM
                        vector[1, 12] = vector[0, 12] - 1;
                        //Cambiamos estado Fin_Area_Ruedas
                        vector[1, 24] = 1;
                        //Colocamos tiempo de ensamblaje ruedas
                        vector[1, 22] = tiempoEnsamblajeRuedas;
                        //Calculamos el fin del ensamblaje
                        vector[1, 23] = vector[1, 2] + vector[1, 22];
                    }
                }

                //Asigno el valor de inactividad del area Ensamblaje
                vector[1, 25] = tiempoInactividadE(vector);

                //Asigno el valor de inactividad del area Ruedas
                vector[1, 26] = tiempoInactividadAR(vector);

                //Asigno el valor de inactividad total
                vector[1, 27] = tiempoInactividadTotal(vector);

                //Asigno el valor de la Cola Maxima Motores
                vector[1, 29] = colaMaximaMotores(vector);

                //Asigno el valor de la Cola Maxima AM
                vector[1, 31] = colaMaximaAM(vector);

                //Asigno el valor de la Cola Maxima Ruedas
                vector[1, 30] = colaMaximaRuedas(vector);

                vector[1, 0] = vector[0, 0] + 1;
                break;

            //Fin Area Ruedas
            case 23:
                //Asigno estado libre al area de ruedas
                vector[1, 24] = 0;

                //Sumo 1 a la columna cantidad de triciclos
                vector[1, 28] = vector[1, 28] + 1;

                //Reviso si hay ruedas disponibles y AM disponibles
                if (vector[0, 21] >= 3 && vector[0, 12] > 0)
                {
                    //Resto la cantidad de ruedas utilizadas
                    vector[1, 21] = vector[0, 21] - 3;


                    //CAMBIO PARA EL TP 6 - POSIBLE ERROR NO CONTROLADO

                    if (vector[0, 21] >= 3)
                    {
                        //Asigno tiempo llegada
                        vector[1, 22] = tiempoEnsamblajeRuedas;

                        //Asigno proxima llegada
                        vector[1, 23] = tiempoEnsamblajeRuedas + vector[1, 2];
                    }

                    //Asigno estado ocupado al area de ruedas -- cambio xD
                    vector[1, 24] = 1;
                }

                /*otro cambio xd
                 * si mi estado actual es 0 (sin trabajar) no se cuando voy a largar el proximo triciclo
                 * por lo tanto dejo el valor en 0 para que no afecte a los tiempos de improductividad
                 * y se calcule correctamente el tiempo de inactividad del area de ruedas*/
                if (vector[1, 24] == 0)
                {
                    vector[1, 23] = 0;
                }


                //Asigno el valor de inactividad del area Ensamblaje
                vector[1, 25] = tiempoInactividadE(vector);

                //Asigno el valor de inactividad del area Ruedas
                vector[1, 26] = tiempoInactividadAR(vector);

                //Asigno el valor de inactividad total
                vector[1, 27] = tiempoInactividadTotal(vector);

                //Asigno el valor de la Cola Maxima Motores
                vector[1, 29] = colaMaximaMotores(vector);

                //Asigno el valor de la Cola Maxima AM
                vector[1, 31] = colaMaximaAM(vector);

                //Asigno el valor de la Cola Maxima Ruedas
                vector[1, 30] = colaMaximaRuedas(vector);

                vector[1, 0] = vector[0, 0] + 1;

                break;

            //Evento de inicialización
            default:

                //Genero la fila 0, de la inicialización
                for (int i = 0; i < vector.GetLength(1); i++)
                {
                    vector[0, i] = 0;
                }
                vector[0, 0]  = 1;
                vector[0, 3]  = tiempoArmazon;
                vector[0, 4]  = vector[0, 3] + vector[0, 2];
                vector[0, 6]  = rnd.NextDouble();
                vector[0, 7]  = generador.Uniforme(Convert.ToInt32(limiteMinMotor), Convert.ToInt32(limiteMaxMotor), vector[0, 6]);
                vector[0, 8]  = vector[0, 2] + vector[0, 7];
                vector[0, 14] = vector[0, 2] + probabilidadPurga(t50, t70, t100);
                vector[0, 17] = rnd.NextDouble();
                vector[0, 18] = rnd.NextDouble();
                nuevosRandom  = !nuevosRandom;
                vector[0, 19] = generador.Normal(vector[0, 17], vector[0, 18], mediaRuedas, desviacionEstRuedas);
                vector[0, 20] = vector[0, 2] + vector[0, 19];

                break;
            }
        }