Example #1
0
        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();
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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.");
            }
        }