예제 #1
0
        public static Move AlfaBeta(ContextMakao stanje, int dubina, int alfa, int beta)
        {
            if (stop)
            {
                return(null);
            }
            if (stanje == null)
            {
                return(null);
            }
            List <Move> potezi = stanje.GetListaMogucihPoteza();


            if (TranspozicionaTabela.Sadrzi(stanje))
            {
                HashElement tmp = TranspozicionaTabela.VratiEl(stanje);
                if (tmp.Dubina >= dubina)
                {
                    return(tmp.Nabolji);
                }
                else
                {
                    potezi.Insert(0, tmp.Nabolji);
                }
            }

            if (TranspozicionaTabela.Sadrzi(stanje) && TranspozicionaTabela.VratiEl(stanje).Dubina < dubina)
            {
                Move najbolji = TranspozicionaTabela.VratiEl(stanje).Nabolji;
            }


            if (dubina == 0 || potezi.Count == 0)
            {
                Move pom = new Move();
                pom.Value         = stanje.Evaluate();
                pom.NarednoStanje = null;
                //Careful we still don't know what move is the best

                return(pom);
            }
            else if (stanje.NaPotezu == 1) //komp
            {
                Move temp = new Move();
                temp.Value = Int32.MinValue;
                int alfa1 = Int32.MinValue;
                foreach (var sledecciPotez in potezi)
                {
                    if (TranspozicionaTabela.Sadrzi(stanje))
                    {
                        alfa1 = TranspozicionaTabela.VratiEl(stanje).Alfa;
                    }


                    Move b = AlfaBeta(sledecciPotez.NarednoStanje, dubina - 1, alfa1, beta);
                    if (b.Value > temp.Value)
                    {
                        temp       = sledecciPotez;
                        temp.Value = b.Value;
                    }
                    if (alfa1 < temp.Value)
                    {
                        alfa1 = temp.Value;
                    }
                    if (beta <= alfa1)
                    {
                        break;
                    }
                }

                if (TranspozicionaTabela.Sadrzi(stanje))
                {
                    HashElement pom = TranspozicionaTabela.VratiEl(stanje);
                    if (pom.Dubina <= dubina)
                    {
                        pom.Alfa    = alfa1;
                        pom.Dubina  = dubina;
                        pom.Nabolji = temp;
                        pom.Beta    = beta;
                        pom.Flag    = 0;
                    }
                }
                else
                {
                    HashElement pom = new HashElement
                    {
                        Alfa    = alfa1,
                        Dubina  = dubina,
                        Nabolji = temp,
                        Beta    = beta,
                        Flag    = 0
                    };
                    TranspozicionaTabela.Add(stanje, pom);
                }
                return(temp);
            }
            else
            {
                if (TranspozicionaTabela.Sadrzi(stanje))
                {
                    HashElement el = TranspozicionaTabela.VratiEl(stanje);
                    if (el.Dubina >= dubina)
                    {
                        return(el.Nabolji);
                    }
                }
                Move temp = new Move();
                temp.Value = Int32.MaxValue;
                int beta1 = Int32.MaxValue;
                foreach (var sledeciPotez in potezi)
                {
                    if (TranspozicionaTabela.Sadrzi(stanje))
                    {
                        beta1 = TranspozicionaTabela.VratiEl(stanje).Beta;
                    }

                    Move b = AlfaBeta(sledeciPotez.NarednoStanje, dubina - 1, alfa, beta1);
                    if (b.Value < temp.Value)
                    {
                        temp       = sledeciPotez;
                        temp.Value = b.Value;
                    }
                    if (beta1 > temp.Value)
                    {
                        beta1 = temp.Value;
                    }
                    if (beta1 <= alfa)
                    {
                        break;
                    }
                }

                if (TranspozicionaTabela.Sadrzi(stanje))
                {
                    HashElement tmp = TranspozicionaTabela.VratiEl(stanje);
                    if (tmp.Dubina <= dubina)
                    {
                        tmp.Alfa    = alfa;
                        tmp.Beta    = dubina;
                        tmp.Nabolji = temp;
                        tmp.Beta    = beta1;
                        tmp.Flag    = 0;
                    }
                }
                else
                {
                    HashElement pom = new HashElement
                    {
                        Nabolji = temp,
                        Alfa    = alfa,
                        Beta    = beta1,
                        Flag    = 0,
                        Dubina  = dubina
                    };
                    TranspozicionaTabela.Add(stanje, pom);
                }
                return(temp);
            }
        }
예제 #2
0
        private Potez AlphaBeta(int[,] polje, int depth, int alpha, int beta, int max)
        {
            string kljuc = TranspozicionaTabela.Hash(polje);
            Unos   unos  = TranspozicionaTabela.DajUnos(kljuc);

            if (unos != null)
            {
                if (unos.Dubina == depth)
                {
                    return(unos.NajboljiPotez);
                }
            }

            //Stopwatch sw = new Stopwatch();
            // sw.Start();
            var c = ListaMogucihPoteza(polje);

            //sw.Stop();
            //_kreiranjeListePoteza += sw.Elapsed.TotalSeconds;
            if (depth == 0 || c.Count == 0)
            {
                int ca = Evaluacija(polje);
                return(new Potez()
                {
                    Value = ca
                });
            }

            Potez najbolji = new Potez();

            if (max == 1)
            {
                najbolji.Value = int.MinValue;
                foreach (var p in c)
                {
                    polje[p.Pozicija.X, p.Pozicija.Y] = p.PostavljenaFigura.ReprezentacijaBrojem();
                    p.PostavljenaFigura.Iskoriscena   = true;

                    Potez tmp = AlphaBeta(polje, depth - 1, alpha, beta, 0);

                    polje[p.Pozicija.X, p.Pozicija.Y] = -1;
                    p.PostavljenaFigura.Iskoriscena   = false;

                    p.Value = tmp.Value;
                    if (p.Value > najbolji.Value)
                    {
                        najbolji = p;
                    }

                    alpha = Math.Max(alpha, najbolji.Value);

                    if (alpha >= beta)
                    {
                        break;
                    }
                }
            }
            else
            {
                najbolji.Value = int.MaxValue;
                foreach (var p in c)
                {
                    polje[p.Pozicija.X, p.Pozicija.Y] = p.PostavljenaFigura.ReprezentacijaBrojem();
                    p.PostavljenaFigura.Iskoriscena   = true;
                    Potez tmp = AlphaBeta(polje, depth - 1, alpha, beta, 1);

                    polje[p.Pozicija.X, p.Pozicija.Y] = -1;
                    p.PostavljenaFigura.Iskoriscena   = false;
                    p.Value = tmp.Value;
                    if (p.Value < najbolji.Value)
                    {
                        najbolji = p;
                    }

                    beta = Math.Min(beta, najbolji.Value);

                    if (alpha >= beta)
                    {
                        break;
                    }
                }
            }

            Unos tmpUnos = TranspozicionaTabela.DajUnos(kljuc);

            if (tmpUnos == null)
            {
                tmpUnos = new Unos()
                {
                    Alfa = alpha, Beta = beta, Dubina = depth, NajboljiPotez = najbolji
                };
                TranspozicionaTabela.DodajUnos(kljuc, tmpUnos);
            }
            else
            {
                tmpUnos.Dubina        = depth;
                tmpUnos.Alfa          = alpha;
                tmpUnos.Beta          = beta;
                tmpUnos.NajboljiPotez = najbolji;
            }

            return(najbolji);
        }