public List <Nodo> Ejecutar(Nodo inicio, Nodo final, Grafo grafoActual) { List <List <double> > heuristicas = new List <List <double> >(); bool encontrado; foreach (Nodo n in grafoActual.GetListaNodos()) { n.SetDistDesdeInicio(Double.PositiveInfinity); n.SetPredecesor(null); } List <Nodo> camino = new List <Nodo>(); encontrado = false; double g; double gNuevo; List <Nodo> caminoAux = new List <Nodo>(); heuristicas = grafoActual.getHeurtistica(); List <Nodo> abiertos = new List <Nodo>(); inicio.SetDistDesdeInicio(0); abiertos.Add(inicio); List <Nodo> cerrados = new List <Nodo>(); while (abiertos.Count > 0) { Nodo minimo = getMinF(abiertos, grafoActual, final, heuristicas); cerrados.Add(minimo); abiertos.Remove(minimo); if (minimo.Equals(final)) { encontrado = true; break; } else { List <Nodo> vecinos = minimo.GetAdyacentes; int i = 0; while (i < vecinos.Count) { g = vecinos[i].GetDistDesdeInicio(); gNuevo = minimo.GetDistDesdeInicio() + (grafoActual.GetLadoPorNodos(minimo, vecinos[i]).GetPesoLado()); if (!cerrados.Contains(vecinos[i]) && !abiertos.Contains(vecinos[i])) { abiertos.Add(vecinos[i]); vecinos[i].SetDistDesdeInicio(gNuevo); vecinos[i].SetPredecesor(minimo); } else { if (gNuevo < g) { vecinos[i].SetDistDesdeInicio(gNuevo); vecinos[i].SetPredecesor(minimo); if (cerrados.Contains(vecinos[i])) { cerrados.Remove(vecinos[i]); abiertos.Add(vecinos[i]); } } } i = i + 1; } } } if (!inicio.Equals(final)) { actual = final; while (!(actual.GetPredecesor() == null)) { caminoAux.Add(actual); actual = actual.GetPredecesor(); } caminoAux.Add(inicio); } else { caminoAux.Add(inicio); } for (int i = 0; i < caminoAux.Count; i = i + 1) { camino.Add(caminoAux[caminoAux.Count - 1 - i]); } return(camino); }
public void SetSucesor(Nodo nodoSucesor) => this.sucesor = nodoSucesor;
public void SetPredecesor(Nodo nodoPredecesor) => predecesor = nodoPredecesor;
public bool EsAdyacente(Nodo nodoExistente) => GetAdyacentes.Contains(nodoExistente);
public void EliminarAdyacente(Nodo nodoExistente) => GetAdyacentes.Remove(nodoExistente);
public void AgregarAdyacente(Nodo nuevoNodo) => GetAdyacentes.Add(nuevoNodo);