示例#1
0
        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;
                }
            }
        }
示例#2
0
        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;
                }
            }
        }
示例#3
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;
                }
            }
        }
示例#4
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);
                    }
                }
            }
        }