예제 #1
0
        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());
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
                }
            }
        }
예제 #4
0
        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);
        }