public int?iteracion(Dato datos, formHome home) { if (home.Iteracion < datos.Iteraciones) { home.toolStripBtnNextStep.Enabled = false; home.stStripLblIteration.Text = "Iteracion " + (home.Iteracion + 1) + "/" + home.stStripProgBarIteration.Maximum; Application.DoEvents(); algoritmo.torneo(home); algoritmo.cruce(datos.ProbCruce, home); algoritmo.mutacion(datos.ProbMutacion, home); algoritmo.evaluar(home, false); algoritmo.mejor(home); algoritmo.nacimiento(home); home.toolStripBtnNextStep.Enabled = true; home.stStripProgBarIteration.PerformStep(); } else { return(algoritmo.apto(home)); } home.Iteracion++; return(null); }
public void abrirTablero(formHome home) { formTablero tablero = new formTablero((home.individuoBindingSource.Current as Individuo).Num); tablero.Reinas = (home.individuoBindingSource.Current as Individuo).Reinas; tablero.ShowDialog(home); }
public void evaluar(formHome home, bool isAll) { List <Individuo> aux = isAll ? _Individuos : _Hijos; home.stStripProgBarStep.Value = 0; home.stStripProgBarStep.Maximum = _Individuos.Count; foreach (var individuo in aux) { home.stStripLblStep.Text = "Evaluando individuo " + individuo.Num + "/" + _Individuos.Count; Application.DoEvents(); for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { if (i == j) { continue; } if (Math.Abs(individuo.Reinas[i] - individuo.Reinas[j]) == Math.Abs(i - j)) { individuo.colision(); } } } home.stStripProgBarStep.PerformStep(); } actualizar(home); }
public void torneo(formHome home) { int potencial1, potencial2; int?usado = null; home.stStripProgBarStep.Value = 0; home.stStripProgBarStep.Maximum = 2; for (int i = 0; i < 2; i++) { home.stStripLblStep.Text = "Obteniendo padre " + (i + 1) + "/2"; Application.DoEvents(); do { potencial1 = new Random().Next(0, _Individuos.Count); potencial2 = new Random().Next(0, _Individuos.Count); } while (potencial2 == potencial1 || potencial1 == usado || potencial2 == usado); if (_Individuos[potencial1].Fitness <= _Individuos[potencial2].Fitness) { usado = potencial1; _Padres.Add(_Individuos[potencial1].Clone() as Individuo); } else { usado = potencial2; _Padres.Add(_Individuos[potencial2].Clone() as Individuo); } home.stStripProgBarStep.PerformStep(); } }
public void llenarPoblacion(int poblacion, formHome home) { List <int> reinas = new List <int>(8); home.stStripProgBarStep.Value = 0; home.stStripProgBarStep.Maximum = poblacion; for (int i = 0; i < poblacion; i++) { home.stStripLblStep.Text = "Individuo " + (i + 1) + "/" + poblacion; Application.DoEvents(); reinas.Clear(); for (int j = 0; j < 8; j++) { int pos; do { pos = new Random().Next(1, 9); } while (reinas.Contains(pos)); reinas.Add(pos); } Individuo individuo = new Individuo(); individuo.iniciar(reinas, i); _Individuos.Add(individuo); home.stStripProgBarStep.PerformStep(); } actualizar(home); }
public void mutacion(decimal pMutacion, formHome home) { home.stStripProgBarStep.Value = 0; home.stStripProgBarStep.Maximum = 2; decimal pm = (decimal) new Random().NextDouble(); if (pm <= pMutacion) { int pos1, pos2; pos1 = new Random().Next(0, 8); do { pos2 = new Random().Next(0, 8); } while (pos2 == pos1); for (int i = 0; i < 2; i++) { home.stStripLblStep.Text = "Mutando hijo " + (i + 1) + "/2"; Application.DoEvents(); List <int> posReinas = _Hijos[i].Reinas; int val1 = posReinas[pos1]; posReinas[pos1] = posReinas[pos2]; posReinas[pos2] = val1; home.stStripProgBarStep.PerformStep(); } } }
public void cruce(decimal pCruce, formHome home) { home.stStripProgBarStep.Value = 0; home.stStripProgBarStep.Maximum = 2; decimal pc = (decimal) new Random().NextDouble(); if (pc <= pCruce) { int pos = new Random().Next(0, 8); List <int> posHijo = new List <int>(8); for (int i = 0; i < 2; i++) { home.stStripLblStep.Text = "Obteniendo hijo " + (i + 1) + "/2"; Application.DoEvents(); int aux = pos; posHijo.Clear(); posHijo.AddRange(_Padres[i].Reinas.GetRange(0, pos)); for (int j = 0; j < 8 && aux < 8; j++) { switch (i) { case 0: if (!posHijo.Contains(_Padres[i + 1].Reinas[j])) { posHijo.Add(_Padres[i + 1].Reinas[j]); aux++; } break; case 1: if (!posHijo.Contains(_Padres[i - 1].Reinas[j])) { posHijo.Add(_Padres[i - 1].Reinas[j]); aux++; } break; } } Individuo individuo = new Individuo(); individuo.iniciar(posHijo, i); _Hijos.Add(individuo); home.stStripProgBarStep.PerformStep(); } } else { foreach (var individuo in _Padres) { _Hijos.Add(individuo.Clone() as Individuo); home.stStripProgBarStep.PerformStep(); } } }
private void BtnEnter_Click(object sender, EventArgs e) { ControllerFunction controller = new ControllerFunction(); formHome home = new formHome(); home.Dato = controller.datos(Convert.ToInt32(poblacionNumUD.Value), Convert.ToInt32(iteracionesNumUD.Value), Convert.ToDecimal(probCruceNumUD.Value), Convert.ToDecimal(probMutacionNumUD.Value)); Hide(); home.ShowDialog(this); Show(); }
public void pasos(Dato datos, formHome home) { home.stStripProgBarIteration.Value = 0; home.stStripProgBarIteration.Maximum = datos.Iteraciones; Algoritmo_Genetico algoritmo = new Algoritmo_Genetico(); algoritmo.llenarPoblacion(datos.Poblacion, home); algoritmo.evaluar(home, true); home.Paso = 1; home.Iteracion = 0; }
public int?paso(Dato datos, formHome home) { if (home.Iteracion < datos.Iteraciones) { switch (home.Paso) { case 1: home.toolStripBtnNextIteration.Enabled = false; home.stStripLblIteration.Text = "Iteracion " + (home.Iteracion + 1) + "/" + home.stStripProgBarIteration.Maximum; algoritmo.torneo(home); home.Paso++; break; case 2: algoritmo.cruce(datos.ProbCruce, home); home.Paso++; break; case 3: algoritmo.mutacion(datos.ProbMutacion, home); home.Paso++; break; case 4: algoritmo.evaluar(home, false); home.Paso++; break; case 5: algoritmo.mejor(home); home.Paso++; break; case 6: algoritmo.nacimiento(home); home.toolStripBtnNextIteration.Enabled = true; home.Paso = 1; home.Iteracion++; Application.DoEvents(); home.stStripProgBarIteration.PerformStep(); break; } } else { return(algoritmo.apto(home)); } return(null); }
public int apto(formHome home) { int apto = 0; foreach (var individuo in _Individuos) { if (!(_Individuos[apto].Fitness < individuo.Fitness)) { apto = individuo.Num - 1; } } return(apto); }
public void nacimiento(formHome home) { home.stStripProgBarStep.Value = 0; home.stStripProgBarStep.Maximum = 2; for (int i = 0; i < 2; i++) { home.stStripLblStep.Text = "Cambiando individuo " + (i + 1) + "/2"; Application.DoEvents(); _Mejores[i].igualar(_Padres[i].Num); _Individuos[_Individuos.IndexOf(_Individuos.FirstOrDefault(x => x.Num == _Padres[i].Num))] = _Mejores[i]; home.stStripProgBarStep.PerformStep(); } _Hijos.Clear(); _Padres.Clear(); _Mejores.Clear(); }
public void mejor(formHome home) { home.stStripProgBarStep.Value = 0; home.stStripProgBarStep.Maximum = 2; List <Individuo> aux = new List <Individuo>(); aux.AddRange(_Padres); aux.AddRange(_Hijos); int?usado = null; int sel; for (int i = 0; i < 2; i++) { home.stStripLblStep.Text = "Calculando al mejor " + (i + 1) + "/2"; Application.DoEvents(); sel = 0; for (int j = 0; j < 4; j++) { for (int k = 0; k < 4; k++) { if (j != k && k != usado && sel != k) { if (!(aux[sel].Fitness <= aux[k].Fitness)) { sel = k; } } } } usado = sel; _Mejores.Add(aux[(int)usado].Clone() as Individuo); home.stStripProgBarStep.PerformStep(); } }
public int completo(Dato datos, formHome home) { home.stStripProgBarIteration.Value = 0; home.stStripProgBarIteration.Maximum = datos.Iteraciones; algoritmo.llenarPoblacion(datos.Poblacion, home); algoritmo.evaluar(home, true); for (int i = 0; i < datos.Iteraciones; i++) { home.stStripLblIteration.Text = "Iteracion " + (i + 1) + "/" + home.stStripProgBarIteration.Maximum; Application.DoEvents(); algoritmo.torneo(home); algoritmo.cruce(datos.ProbCruce, home); algoritmo.mutacion(datos.ProbMutacion, home); algoritmo.evaluar(home, false); algoritmo.mejor(home); algoritmo.nacimiento(home); home.stStripProgBarIteration.PerformStep(); } return(algoritmo.apto(home)); }
public void actualizar(formHome home) { home.individuoBindingSource.DataSource = _Individuos; home.individuoDataGridView.Update(); home.individuoDataGridView.Refresh(); }