Exemple #1
0
        private RegResp calcularEstrella(int costo, Nodo nodo, string hasta, List <Nodo> lista)
        {
            lista.Add(nodo);
            if (nodo.nombre == hasta)
            {
                return(new RegResp(true, costo));
            }
            nodo.visitado = true;
            var     ramas = GetEnlaces(nodo);
            RegResp resp  = new RegResp(false, costo);

            if (ramas.Count == 0)
            {
                nodo.visitado = false;
                return(resp);
            }
            List <Nodo> listaMenor = null;
            var         mincosto   = int.MaxValue;

            foreach (var rama in ramas)
            {
                var listaNuevo = new List <Nodo>();
                //listaNuevo.Add(rama.NodoB);
                //var costoRama = rama.Peso;
                var irnodo  = nodo != rama.NodoA ? rama.NodoA : rama.NodoB;
                var curresp = calcularCosto(rama.Peso + irnodo.heuristica, irnodo, hasta, listaNuevo);
                if (curresp.enc && mincosto > curresp.costo)
                {
                    mincosto   = curresp.costo;
                    resp       = curresp;
                    listaMenor = listaNuevo;
                }
            }
            if (listaMenor != null)
            {
                lista.AddRange(listaMenor);
            }
            nodo.visitado = false;
            return(resp);
        }
Exemple #2
0
        private RegResp calcularCosto(int costo, Nodo nodo, string hasta, List <Nodo> lista)
        {
            lista.Add(nodo);
            if (nodo.nombre == hasta)                                          // Finaliza cuando encuentra el nodo final
            {
                return(new RegResp(true, costo));
            }
            nodo.visitado = true;                                              // Se marca el nodo para no visitarlo
            var     ramas = GetEnlaces(nodo);                                  // Se obtiene las ramas del nodo actual
            RegResp resp  = new RegResp(false, costo);

            if (ramas.Count == 0)                                              // Si el nodo no tiene ramas
            {                                                                  //    entonces se retorna
                nodo.visitado = false;                                         //    se retira la marca de visitados
                return(resp);
            }
            List <Nodo> listaMenor = null;                                      // Se empieza a buscar la rama de menor costo
            var         mincosto   = int.MaxValue;

            foreach (var rama in ramas)
            {
                var listaNuevo = new List <Nodo>();                            // Nueva lista de nodos interna
                var curresp    = calcularCosto(costo + rama.Peso,              // Se calcula el costo de la rama
                                               nodo != rama.NodoA ? rama.NodoA : rama.NodoB, hasta, listaNuevo);
                if (curresp.enc && mincosto > curresp.costo)                   // Si encontro el final y el costo es el menor entonces se guarda
                {
                    mincosto   = curresp.costo;
                    resp       = curresp;
                    listaMenor = listaNuevo;
                }
            }
            if (listaMenor != null)                                            // Se agrega la rama menor encontrada
            {
                lista.AddRange(listaMenor);
            }
            nodo.visitado = false;                                             // Se desmarca visitado
            return(resp);                                                      // Se retorna el encontrado y costo de la rama
        }