private void button_iniciar_simulacion_Click(object sender, EventArgs e) { button_iniciar_simulacion.Enabled = false; progressBar1.Visible = true; button_cancelar.Visible = true; progressBar1.Value = 0; DSimulacionTest st = new DSimulacionTest(); st.multA = (int)numericUpDown_primera_etapa.Value; st.multB = (int)numericUpDown_segunda_etapa.Value; st.nSim = (int)numericUpDown_numero_de_simulaciones.Value; st.nInfectadosPorMillon = (double)numericUpDown_infectados_por_millon_supuesto.Value; st.listaDePersonas = new bool[st.multA * st.multB]; textBox1_resultado.Text = ""; backgroundWorker1.RunWorkerAsync(st); }
private double BackgroundProcess_Simulacion(BackgroundWorker bw, DoWorkEventArgs e) { //double result = 0; int progress; int sumaCompleta = 0; DSimulacionTest st = (DSimulacionTest)e.Argument; for (int i = 0; i < st.nSim; i++) { //Thread.Sleep(10); int numeroDeTest = IndividualSimulacion(st); sumaCompleta += numeroDeTest; progress = (int)((i * 100.0) / st.nSim); bw.ReportProgress(progress); if (bw.CancellationPending) { e.Cancel = true; return(0); } } return((sumaCompleta * 100.0) / st.nSim); }
/// <summary> /// Procesa una simulación, y devuelve el número de test que fueron necesarios /// </summary> /// <param name="st"></param> /// <returns></returns> private int IndividualSimulacion(DSimulacionTest st) { int res = 0; //Carga el arreglo de personas, con datos aleatorios int p = (int)(1000000.0 / st.nInfectadosPorMillon); for (int i = 0; i < st.multA; i++) { for (int j = 0; j < st.multB; j++) { st.listaDePersonas[i * st.multB + j] = rmd.Next(p) == 1;//También se puede poner "== 0", la idea es poner un número bajo que sea menor que p, donde p es probable que tome valores mayores a 1000, al menos que los infectados por millón tenga una cifra muy alta } } ////código auxiliar para contar la cantidad de infectados que produju la carga aleatoria //for (int i = 0; i < st.multA; i++) //{ // for (int j = 0; j < st.multB; j++) // { // if (st.listaDePersonas[i * st.multB + j]) // { // res++; // } // } //} //Test primera etapa //Se prueban todos los casos al mismo tiempo, con un solo test res = 1; bool q = false; for (int i = 0; i < st.multA; i++) { for (int j = 0; j < st.multB; j++) { if (st.listaDePersonas[i * st.multB + j]) { //Se encontró al menos un infectado q = true; break; } } if (q) { break; } } if (!q) { return(res); } //Test segunda etapa res += st.multA; for (int i = 0; i < st.multA; i++) { q = false; for (int j = 0; j < st.multB; j++) { if (st.listaDePersonas[i * st.multB + j]) { //Se encontró al menos un infectado q = true; break; } } if (q) { //Se tienen que realizar todos los test de la última etapa, para poder identificar los infectados res += st.multB; } } return(res); }