Esempio n. 1
0
        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;
                }
            }
        }
Esempio n. 2
0
        public string ImprimeListas()
        {
            var str = $@"
Explorado:  [{ string.Join(", ", Explorado.Select(l => l.ToString())) }]
Borda:      [{ string.Join(", ", Borda.Select(b => b.Estado.ToString())) }]";

            return(str);
        }
Esempio n. 3
0
        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);
                    }
                }
            }
        }