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); } }
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); }