static void Main(string[] args) { string rutaArchivo = ConfigurationManager.AppSettings["RutaArchivoDijkstra"].ToString(); string nombreArchivo = ConfigurationManager.AppSettings["NombreArchivoDijkstra"].ToString(); TipoAlgoritmo eTipoAlgoritmo = (TipoAlgoritmo)Convert.ToInt32(ConfigurationManager.AppSettings["TipoAlgoritmo"].ToString()); EntContenedor oEntContenedor = new ManejadorArchivo(rutaArchivo, nombreArchivo).LecturaArchivo(); if (oEntContenedor.eTipoError == TipoError.SinError) { oEntContenedor = new ManejadorDijkstra().AplicaAlgoritmo(oEntContenedor, eTipoAlgoritmo); if (oEntContenedor.eTipoError == TipoError.SinError) { for (int i = 0; i < oEntContenedor.lstResultados.Count - 1; i++) { Console.WriteLine(oEntContenedor.lstResultados[i]); } } else { Console.WriteLine(oEntContenedor.eTipoError.ToString() + ": \n" + oEntContenedor.mensajeError); } } else { Console.WriteLine(oEntContenedor.eTipoError.ToString() + ": \n" + oEntContenedor.mensajeError); } Console.ReadLine(); }
public EntContenedor AplicaAlgoritmo(EntContenedor oEntContenedor, TipoAlgoritmo eTipoAlgoritmo) { string camino = string.Empty; string nodoHijo = string.Empty; string nodoPadre = string.Empty; int aux = 0; try { for (int i = 0; i < oEntContenedor.lstEntNodo.Count; i++) { EntNodo oEntNodo = oEntContenedor.lstEntNodo[i]; if (i == 0) { oEntNodo.esSeleccionado = true; oEntNodo.nodoPrevio = oEntNodo.nombreNodo; nodoHijo = oEntNodo.nombreNodo; nodoPadre = oEntNodo.nombreNodo; if (eTipoAlgoritmo == TipoAlgoritmo.Greedy) { oEntContenedor.lstEntNodo = this.ActualizaVertices(oEntContenedor.lstEntNodo, oEntNodo.idNodo); } oEntContenedor.lstResultados.Add(this.CreaResultado(aux, nodoPadre)); } if (oEntNodo.nombreNodo == nodoHijo) { oEntNodo.esSeleccionado = true; oEntNodo.nodoPrevio = nodoPadre; oEntNodo.peso = aux; oEntNodo.lstEntVertice = this.OrdenaLista(oEntNodo.lstEntVertice); for (int j = 0; j < oEntNodo.lstEntVertice.Count; j++) { EntVertice oEntVertice = oEntNodo.lstEntVertice[j]; if (j == 0) { i = oEntVertice.idNodo - 2; aux = oEntNodo.peso + oEntVertice.peso; nodoHijo = oEntVertice.nombreNodo; } oEntContenedor.lstEntNodo = this.ActualizaVertices(oEntContenedor.lstEntNodo, oEntVertice.idNodo); } nodoPadre = oEntNodo.nombreNodo; if (eTipoAlgoritmo == TipoAlgoritmo.Greedy) { oEntContenedor.lstEntNodo = this.ActualizaVerticesHijos(oEntContenedor.lstEntNodo, oEntNodo); } oEntContenedor.lstResultados.Add(this.CreaResultado(aux, nodoPadre)); } } } catch (Exception ex) { oEntContenedor.mensajeError = ex.Message; oEntContenedor.eTipoError = TipoError.Error; } return(oEntContenedor); }
public BuscaBidirecional(ProblemaMapa problema, TipoAlgoritmo a1 = TipoAlgoritmo.BuscaEmLargura, TipoAlgoritmo a2 = TipoAlgoritmo.BuscaEmLargura) { Problema = problema; var inverso = new ProblemaMapa { Mapa = problema.Mapa, Inicial = problema.Destino, Destino = problema.Inicial }; this.a1 = a1 == TipoAlgoritmo.BuscaEmLargura ? new BuscaEmLargura <Local>(problema) as IAlgoritmo <Local> : new BuscaEmProfundidadeComVisitados <Local>(problema); this.a2 = a2 == TipoAlgoritmo.BuscaEmProfundidade ? new BuscaEmLargura <Local>(inverso) as IAlgoritmo <Local> : new BuscaEmProfundidadeComVisitados <Local>(inverso); }
static IAlgoritmo <T> InstanciaAlgoritmo <T>(IProblema <T> problema, Dictionary <string, string> dict) { var a = dict.GetValueOrDefault("a", "bfs"); switch (a) { case "bfs": return(new BuscaEmLargura <T>(problema)); case "dfs": return(new BuscaEmProfundidade <T>(problema, dict.GetIntOrDefault("l", null))); case "dfsv": return(new BuscaEmProfundidadeComVisitados <T>(problema, dict.GetIntOrDefault("l", null))); case "idfs": return(new BuscaAprofundamentoIterativo <T>(problema)); case "bb": #region Busca Bidirecional if (!(problema is ProblemaMapa)) { throw new ArgumentException("Problema não suportado por Busca Bidirecional."); } TipoAlgoritmo a1 = TipoAlgoritmo.BuscaEmLargura, a2 = TipoAlgoritmo.BuscaEmLargura; switch (dict.GetValueOrDefault("a1", "bfs")) { case "bfs": a1 = TipoAlgoritmo.BuscaEmLargura; break; case "dfs": a1 = TipoAlgoritmo.BuscaEmProfundidade; break; default: throw new ArgumentException("Algoritmo inválido para Busca Bidirecional."); } switch (dict.GetValueOrDefault("a2", "bfs")) { case "bfs": a2 = TipoAlgoritmo.BuscaEmLargura; break; case "dfs": a2 = TipoAlgoritmo.BuscaEmProfundidade; break; default: throw new ArgumentException("Algoritmo inválido para Busca Bidirecional."); } return(new BuscaBidirecional(problema as ProblemaMapa, a1, a2) as IAlgoritmo <T>); #endregion case "bcu": return(new BuscaCustoUniforme <T>(problema)); case "bgl": { if (problema is IProblemaHeuristica <T> p) { return(new BuscaGulosa <T>(p)); } throw new ArgumentException("Tipo de problema não suportado por Busca Gulosa."); } case "ba*": { if (problema is IProblemaHeuristica <T> p) { return(new BuscaAEsrela <T>(p)); } throw new ArgumentException("Tipo de problema não suportado Busca A*."); } default: throw new ArgumentException("Algoritmo inválido."); } }