//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(); }
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; } }