public static Dictionary <string, string> busquedaAAsterisco(Dictionary <string, List <Tuple <string, int> > > grafo, double limite_de_costo, List <Node> nodos, string str_nodo_inicial, string str_nodo_final) { Dictionary <string, string> resultado = new Dictionary <string, string>(); PriorityQueue <double, ArbolNario <string> > cola = new PriorityQueue <double, ArbolNario <string> >(); List <ArbolNario <string> > nodos_expandidos = new List <ArbolNario <string> >(); List <double> costos_exedidos_del_limite = new List <double>(); double f; string str_res = ""; Dictionary <string, double> distancias = calcularDistancias(nodos, getNodoFromList(nodos, str_nodo_final)); cola.Add(new KeyValuePair <double, ArbolNario <string> >(distancias[str_nodo_inicial], new ArbolNario <string>(str_nodo_inicial))); while (!cola.IsEmpty) { ArbolNario <string> nodo = cola.DequeueValue(); if (esMeta(nodo, str_nodo_final)) { str_res += nodo.Dato; resultado.Add("ruta", getStringReverse(getRuta(nodo))); resultado.Add("nodos_visitados", str_res); return(resultado); } // Marcamos como visitado nodos_expandidos.Add(nodo); str_res += nodo.Dato; // Expandimos foreach (Tuple <string, int> vecino in grafo[nodo.Dato]) { ArbolNario <string> nodo_vecino = new ArbolNario <string>(vecino.Item1); nodo.addChild(nodo_vecino); nodo_vecino.CostoRuta += nodo.CostoRuta + vecino.Item2; if (!contieneNodo(nodos_expandidos, nodo_vecino)) { f = TruncateDecimal(nodo_vecino.CostoRuta + distancias[nodo_vecino.Dato], 4); if (f <= limite_de_costo) { cola.Add(new KeyValuePair <double, ArbolNario <string> >(f, nodo_vecino)); } else { costos_exedidos_del_limite.Add(f); } } } } resultado.Add("ruta", "No hay camino."); resultado.Add("nodos_visitados", "No hay camino."); resultado.Add("nuevo_limite_de_costo", getMinimoFromList(costos_exedidos_del_limite).ToString()); return(resultado); }
public static Dictionary <string, string> busquedaPreferentePorAmplitud(Dictionary <string, List <Tuple <string, int> > > grafo, string str_nodo_inicial, string str_nodo_final) { Dictionary <string, string> resultado = new Dictionary <string, string>(); Queue <ArbolNario <string> > cola = new Queue <ArbolNario <string> >(); List <ArbolNario <string> > nodos_expandidos = new List <ArbolNario <string> >(); ArbolNario <string> nodo; string str_res = ""; nodo = new ArbolNario <string>(str_nodo_inicial); cola.Enqueue(nodo); nodos_expandidos.Add(nodo); while (cola.Count != 0) { nodo = cola.Dequeue(); if (esMeta(nodo, str_nodo_final)) { str_res += nodo.Dato; resultado.Add("ruta", getStringReverse(getRuta(nodo))); resultado.Add("nodos_visitados", str_res); return(resultado); } // Marcamos como visitado str_res += nodo.Dato; // Expandimos foreach (Tuple <string, int> vecino in grafo[nodo.Dato]) { ArbolNario <string> nodo_vecino = new ArbolNario <string>(vecino.Item1); nodo.addChild(nodo_vecino); if (!contieneNodo(nodos_expandidos, nodo_vecino)) { cola.Enqueue(nodo_vecino); nodos_expandidos.Add(nodo_vecino); } } } resultado.Add("ruta", "No hay camino."); resultado.Add("nodos_visitados", "No hay camino."); return(resultado); }
public static Dictionary <string, string> busquedaAvara(Dictionary <string, List <Tuple <string, int> > > grafo, List <Node> nodos, string str_nodo_inicial, string str_nodo_final) { Dictionary <string, string> resultado = new Dictionary <string, string>(); PriorityQueue <double, ArbolNario <string> > cola = new PriorityQueue <double, ArbolNario <string> >(); List <ArbolNario <string> > nodos_expandidos = new List <ArbolNario <string> >(); string str_res = ""; Dictionary <string, double> distancias = calcularDistancias(nodos, getNodoFromList(nodos, str_nodo_final)); cola.Add(new KeyValuePair <double, ArbolNario <string> >(distancias[str_nodo_inicial], new ArbolNario <string>(str_nodo_inicial))); while (!cola.IsEmpty) { ArbolNario <string> nodo = cola.DequeueValue(); if (esMeta(nodo, str_nodo_final)) { str_res += nodo.Dato; resultado.Add("ruta", getStringReverse(getRuta(nodo))); resultado.Add("nodos_visitados", str_res); return(resultado); } // Marcamos como visitado nodos_expandidos.Add(nodo); str_res += nodo.Dato; // Expandimos foreach (Tuple <string, int> vecino in grafo[nodo.Dato]) { ArbolNario <string> nodo_vecino = new ArbolNario <string>(vecino.Item1); nodo.addChild(nodo_vecino); if (!contieneNodo(nodos_expandidos, nodo_vecino)) { cola.Add(new KeyValuePair <double, ArbolNario <string> >(distancias[nodo_vecino.Dato], nodo_vecino)); } } } resultado.Add("ruta", "No hay camino."); resultado.Add("nodos_visitados", "No hay camino."); return(resultado); }
public static Dictionary <string, string> busquedaPorCostoUniforme(Dictionary <string, List <Tuple <string, int> > > grafo, string str_nodo_inicial, string str_nodo_final) { Dictionary <string, string> resultado = new Dictionary <string, string>(); PriorityQueue <int, ArbolNario <string> > cola = new PriorityQueue <int, ArbolNario <string> >(); List <ArbolNario <string> > nodos_expandidos = new List <ArbolNario <string> >(); string str_res = ""; cola.Add(new KeyValuePair <int, ArbolNario <string> >(0, new ArbolNario <string>(str_nodo_inicial))); while (!cola.IsEmpty) { ArbolNario <string> nodo = cola.DequeueValue(); if (esMeta(nodo, str_nodo_final)) { str_res += nodo.Dato; resultado.Add("ruta", getStringReverse(getRuta(nodo))); resultado.Add("nodos_visitados", str_res); return(resultado); } // Marcamos como visitado nodos_expandidos.Add(nodo); str_res += nodo.Dato; // Expandimos foreach (Tuple <string, int> vecino in grafo[nodo.Dato]) { ArbolNario <string> nodo_vecino = new ArbolNario <string>(vecino.Item1); nodo.addChild(nodo_vecino); nodo_vecino.CostoRuta = nodo.CostoRuta + vecino.Item2; if (!contieneNodo(nodos_expandidos, nodo_vecino)) { cola.Add(new KeyValuePair <int, ArbolNario <string> >(nodo_vecino.CostoRuta, nodo_vecino)); } } } resultado.Add("ruta", "No hay camino."); resultado.Add("nodos_visitados", "No hay camino."); return(resultado); }