public static Nodo ConstruirArbolDeUnaLista(List <String> ListaStr, List <Rectangulo> listaPiezas) { Stack <Nodo> nodoPila = new Stack <Nodo>(); for (int i = 0; i < ListaStr.Count; ++i) { int n = -1; // Si el gen es una pieza, entonces la apilamos if (Utilitarios.EsPieza(ListaStr[i], out n)) { // El segundo parámetro de la pila es el id de la pieza empezando desde 0 (es por ello que restamos 1) // Por ejemplo, si es la pieza 3, entonces queremos apilar la pieza en la posición 2 ApilarPieza(nodoPila, n - 1, ListaStr[i].Substring(ListaStr[i].Length - 1, 1), listaPiezas); } else // Si es un operador, desapilamos los dos últimos bloques y operamos { if (nodoPila.Count < 2) { int a = 1; } DesapilaOperadorYApilaBloque(nodoPila, ListaStr[i]); } } // En este momento, en la pila solo hay un elemento y sería el árbol construido return(nodoPila.Pop()); }
public static String RotarPiezaAleatorio(String pieza, System.Random rnd) { // Si no es pieza devolvemos el operador tal cual int n; if (!Utilitarios.EsPieza(pieza, out n)) { return(pieza); } String rotacion = Utilitarios.ObtenerRotacion(pieza); // Cambiar el sentido, con 50% de probabilidad if (rnd.Next(1, 3) == 1) { rotacion = Utilitarios.CambiarSentido(rotacion); } return(Utilitarios.ObtenerPieza(pieza) + rotacion); }
private void SepararPiezasYOperadores(Cromosoma progenitor, out List <String> listaPiezas, out List <String> listaOperadores) { listaPiezas = new List <String>(); listaOperadores = new List <String>(); int n; foreach (String gen in progenitor.ListaGenes) { // Si es una pieza if (Utilitarios.EsPieza(gen, out n)) { // Agrega dicho gen a la lista de piezas listaPiezas.Add(gen); // Agregar un espacio (cadena vacía) a la lista de operadores listaOperadores.Add(""); } else { // Agregar un operador a la lista de operadores listaOperadores.Add(gen); } } }
public bool Mutacion(Cromosoma cromosoma, System.Random rnd) { List <String> listaGenes = cromosoma.ListaGenes; // Escoger 2 diferentes posiciones de genes aleatorios int posGen1 = rnd.Next(0, listaGenes.Count - 1); int posGen2 = rnd.Next(posGen1 + 1, listaGenes.Count); // Ahora, revisamos que son // Si ambos genes son piezas, podemos intercambiarlos sin problemas if (Utilitarios.EsPieza(listaGenes[posGen1]) && Utilitarios.EsPieza(listaGenes[posGen2])) { String aux = listaGenes[posGen1]; listaGenes[posGen1] = listaGenes[posGen2]; listaGenes[posGen2] = aux; } else if (!Utilitarios.EsPieza(listaGenes[posGen1])) { String aux = listaGenes[posGen1]; listaGenes[posGen1] = listaGenes[posGen2]; listaGenes[posGen2] = aux; } // Si el gen1 es pieza y el gen2 es un operador else if (Utilitarios.EsPieza(listaGenes[posGen1]) && !Utilitarios.EsPieza(listaGenes[posGen2])) { int cantOperadores = 0; int cantPiezas = 0; // Debemos verificar que cada posición entre los genes p1 y p2 verifica que No <= Np - 3 for (int i = 0; i < listaGenes.Count; ++i) { if (Utilitarios.EsPieza(listaGenes[i])) { ++cantPiezas; } else { ++cantOperadores; } if (i >= posGen1 && i <= posGen2) { if (!(cantOperadores <= cantPiezas - 3)) { return(false); } } } // Si se cumple la condición, entonces el intrecambio es posible String aux = listaGenes[posGen1]; listaGenes[posGen1] = listaGenes[posGen2]; listaGenes[posGen2] = aux; } listaGenes[posGen1] = Utilitarios.RotarPiezaAleatorio(listaGenes[posGen1], rnd); listaGenes[posGen2] = Utilitarios.RotarPiezaAleatorio(listaGenes[posGen2], rnd); cromosoma.ListaGenes = listaGenes; return(true); }