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); }
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 }