//________________________________________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;
                    }
                }
            }
        }
Esempio n. 2
0
        public Grafos()
        {
            InitializeComponent();

            //seteando configuraciones
            programa = Convert.ToInt16(ConfigurationManager.AppSettings["programa"]);
            NUM      = Convert.ToInt16(ConfigurationManager.AppSettings["num"]);

            //seteando valor en la clase busqueda
            busqueda.Programa = programa;
            busqueda.Num      = NUM;

            if (programa == 1)
            {
                //ocultando grid
                dg_robot.Visible = false;

                //creando instancia de clase GrafoCiudades
                GrafoCiudades ciudades = new GrafoCiudades();

                //inicializando el mapa en Madrid con zoom
                gm_ciudades.MapProvider      = GMap.NET.MapProviders.BingMapProvider.Instance;
                GMap.NET.GMaps.Instance.Mode = GMap.NET.AccessMode.ServerOnly;
                gm_ciudades.SetPositionByKeywords("Madrid,España");

                //llenando drop downs
                //ciudades de origen
                ArrayList ciudadList = new ArrayList();
                ciudadList.AddRange(ciudades.getCiudades());
                cb_origen.DataSource = ciudadList;

                //ciudades de destino
                ArrayList destinoList = new ArrayList();
                destinoList.AddRange(ciudades.getCiudades());
                cb_destino.DataSource = destinoList;
            }
            else if (programa == 2)
            {
                //ocultar mapa
                gm_ciudades.Visible = false;
                //llena el gridpanel la primera vez
                llenarGrafo();

                //llenando drop downs
                //nodos de origen
                ArrayList origen = new ArrayList();
                origen.Add("Selecciona");
                for (int i = 1; i <= NUM; i++)
                {
                    origen.Add(i);
                }
                cb_origen.DataSource = origen;

                //nodos de destino
                ArrayList destino = new ArrayList();
                destino.Add("Selecciona");
                for (int i = 1; i <= NUM; i++)
                {
                    destino.Add(i);
                }
                cb_destino.DataSource = destino;
            }

            //algoritmos de busqueda
            ArrayList algoritmos = new ArrayList();

            algoritmos.Add("Busqueda Profundidad");
            algoritmos.Add("Busqueda Amplitud");
            cb_algoritmo.DataSource = algoritmos;
        }
        //_______________________________________ 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;
        }