public override void Expande() { var no = borda.Dequeue(); Explorado.Add(no.Estado); var resultados = Problema.Acoes(no.Estado) .Where(e => !Explorado.Contains(e.Resultado) && !borda.Any(b => b.Estado.Equals(e.Resultado))) .Select(a => a.Resultado); foreach (var resultado in resultados) { var filho = new No <T> { Pai = no, Estado = resultado, Profundidade = no.Profundidade + 1 }; borda.Enqueue(filho); if (Problema.TestaObjetivo(resultado)) { Objetivo = filho; return; } } }
public string ImprimeListas() { var str = $@" Explorado: [{ string.Join(", ", Explorado.Select(l => l.ToString())) }] Borda: [{ string.Join(", ", Borda.Select(b => b.Estado.ToString())) }]"; return(str); }
public override void Expande() { var pai = borda.OrderBy(n => n.Custo).FirstOrDefault(); if (Problema.TestaObjetivo(pai.Estado)) { Objetivo = pai; return; } borda.Remove(pai); Explorado.Add(pai.Estado); var acoes = Problema.Acoes(pai.Estado); foreach (var a in acoes) { var no = new No <T> { Pai = pai, Estado = a.Resultado, Custo = pai.Custo + (a.Custo ?? throw new InvalidOperationException("Foi encontrada uma ação com custo nulo. Impossível continuar.")) }; if (!Explorado.Contains(no.Estado) && !Borda.Any(n => n.Estado.Equals(no.Estado))) { borda.Add(no); } else { var old = borda.SingleOrDefault(n => n.Estado.Equals(no.Estado)); if (no.Custo < old?.Custo) { borda.Remove(old); borda.Add(no); } } } }