//________________________________________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; } } } }
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; }