예제 #1
0
        //________________________________________Busqueda por amplitud ________________________________________________________-
        public void busquedaAmplitud()
        {
            int        nodoActual;
            List <int> cerrados           = new List <int>();
            List <int> nodosSeleccionados = new List <int>();

            Dictionary <int, int> camino   = new Dictionary <int, int>();
            List <int>            abiertos = new List <int>();


            //creando instancias de grafos
            GrafoCiudades ciudades = new GrafoCiudades();
            GrafoRobot    robot    = new GrafoRobot();


            //abierto tiene el primer nodo que es el nodo origen
            abiertos.Add(nodoInicio);


            //este arreglo va guardando todos los nodos que se han ido agregando a abiertos
            //evita que se agreguen repetidos
            // se agrega el nodo origen
            nodosSeleccionados.Add(nodoInicio);


            //mientras haya nodos en abiertos haz el ciclo
            while (abiertos.Count() != 0)
            {
                //nodo actual sera ahora el primer nodo en el vector de la cola
                //es una cola first in first out
                nodoActual = abiertos.First();
                abiertos.Remove(abiertos.First());

                //--------------------si encontro el destino obten resultados --------------------------
                if (nodoActual == nodoFinal)
                {
                    textResult += "Algoritmo de Busqueda por Amplitud";

                    //obtener cerrados y camino para imprimir
                    obtenerResultados(nodoActual, abiertos, cerrados, camino);
                    break;
                }
                //--------------------si no ah encontrado el destino sigue buscando --------------------------
                else
                {
                    //el nodo abierto ahora pasa a cerrado
                    cerrados.Add(nodoActual);

                    //agregando adyacencias a abiertos
                    switch (programa)
                    {
                    case 1:
                        ciudades.GenerarSucesores(nodoActual, ref abiertos, ref nodosSeleccionados, ref camino);
                        break;

                    case 2:
                        robot.GenerarSucesores(nodoActual, ref abiertos, ref nodosSeleccionados, ref camino);
                        break;
                    }
                }
            }
        }
예제 #2
0
        //_______________________________________ Imprimir resultados para profundidad y amplitud ________________________________

        public void obtenerResultados(int nodoActual, List <int> abiertos, List <int> cerrados, Dictionary <int, int> camino)
        {
            int           iNodoInicial = nodoFinal;
            string        sNodoFinal   = "";
            string        sCamino      = "";
            GrafoCiudades ciudades     = new GrafoCiudades();
            GrafoRobot    robot        = new GrafoRobot();

            lcamino.Clear();

            //recorriendo la lista de abiertos
            textResult += "\r\n\r\nnodos en abiertos:\r\n\r\n";
            foreach (int nodoA in abiertos)
            {
                nodoActual = nodoA;
                switch (programa)
                {
                case 1:
                    textResult += ciudades.getCiudad(nodoActual) + ", ";
                    break;

                case 2:
                    textResult += nodoA.ToString() + ", ";
                    break;
                }
            }
            textResult += "\r\n\r\nnodos en cerrados : \r\n\r\n";
            //recorriendo la lista de cerrados
            foreach (int cerrado in cerrados)
            {
                switch (programa)
                {
                case 1:
                    textResult += ciudades.getCiudad(cerrado) + ", ";
                    break;

                case 2:
                    textResult += cerrado.ToString() + ", ";
                    break;
                }
            }
            //guardando el valor del nodo final
            switch (programa)
            {
            case 1:
                sNodoFinal = ciudades.getCiudad(nodoFinal);
                break;

            case 2:
                sNodoFinal = nodoFinal.ToString();
                break;
            }
            textResult += sNodoFinal;


            //camino
            textResult += "\r\n\r\nCamino : \r\n\r\n";
            sCamino     = sNodoFinal;
            lcamino.Add(sCamino);
            //recorriendo el diccionario para obtener el camino destino-origen
            while (iNodoInicial != nodoInicio)
            {
                switch (programa)
                {
                case 1:
                    sCamino = ciudades.getCiudad(camino[iNodoInicial]) + ", " + sCamino;
                    lcamino.Add(ciudades.getCiudad(camino[iNodoInicial]));     //agregando a la lista para la UI
                    break;

                case 2:
                    sCamino = camino[iNodoInicial].ToString() + ", " + sCamino;
                    lcamino.Add(camino[iNodoInicial].ToString());
                    break;
                }
                iNodoInicial = camino[iNodoInicial];
            }

            textResult += sCamino;
        }