public void Expande() { var no = borda.Pop(); if (no.Estado.Equals(Objetivo)) { Objetivo = no; return; } if (no.Profundidade >= limite) { return; } var resultados = Problema.Acoes(no.Estado) .Where(a => !borda.Any(b => b.Estado.Equals(a.Resultado))) .Select(a => a.Resultado); foreach (var resultado in resultados) { var filho = new No <T> { Pai = no, Estado = resultado, Profundidade = no.Profundidade + 1 }; borda.Push(filho); if (Problema.TestaObjetivo(resultado)) { Objetivo = filho; return; } } }
public void Expande() { var pai = borda.OrderBy(n => problema.ValorHeuristica(n.Estado)).First(); borda.Remove(pai); var acoes = Problema.Acoes(pai.Estado).Where(a => !Borda.Any(n => a.Resultado.Equals(n.Estado))); foreach (var acao in acoes) { var no = new No <T> { Estado = acao.Resultado, Pai = pai, }; borda.Add(no); if (Problema.TestaObjetivo(no.Estado)) { Objetivo = no; return; } } }
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 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); } } } }