public void TestLevel4() { var choosenState = AlphaBetaSearch.DoSearch(_state, 4); Console.WriteLine(choosenState.ToString()); Assert.AreEqual(true, true); }
public PhutballMoveScore Search(IFieldsGraph fieldsGraph) { if (_alphaBetaSearchDepth.SearchDepth == 0) { return(PhutballMoveScore.Empty()); } var actualGraph = (IFieldsGraph)fieldsGraph.Clone(); var performMoves = new PerformMoves(actualGraph, _playersState); var visitedNodes = new VisitedNodesCounter <JumpNode>(); _alphaBetaSearch = new AlphaBetaSearch <JumpNode>( new WhiteStoneToCurrentPlayerBorderDistance(_playersState, actualGraph, _alphaBetaSearchDepth.DistanceToBorderWeight) .Add(new BlackStoneToTargetBorderCount(_playersState, actualGraph, _alphaBetaSearchDepth.BlackStonesToBorderWeight)) , _alphaBetaSearchDepth, new PerformMovesNodeVisitor(performMoves).FollowedBy(visitedNodes) ); var movesTree = _movesFactory(actualGraph); _alphaBetaSearch.Run(movesTree); var result = new CompositeMove(); _alphaBetaSearch.BestMove.Move.MovesFromRoot.CollectToPlayerSwitch(result); return(new PhutballMoveScore(result, _alphaBetaSearch.BestMove.Score) { CuttoffsCount = _alphaBetaSearch.CuttoffsCount, VisitedNodesCount = visitedNodes.Count }); }
static void RunSingleTurn3() { var statsCollector = new GameClientStatsCollector(); var evaluator = new Evaluator(0.876, 0.000, 0.137, 0.625, 1.000, 0.289, 0.696, 0.000, 0.522); AlphaBetaSearchGameClient absGameClient = new AlphaBetaSearchGameClient(evaluator, 7, statsCollector, true, true, runParallel: true); Player player = new Player("AlphaBetaSearch", () => absGameClient); var gameClient = player.CreateGameClient.Invoke(); var b = "....." + ".Ko.." + ".o..." + "....." + "..k.."; IEnumerable <Card> cards = new List <Card>() { Card.Elephant, Card.Monkey, Card.Cobra, Card.Frog, Card.Horse }; var cardNumbers = new[] { 0, 1, 2, 3, 4 }; Game game = new Game(player, null, GameUtil.ParseGameState(b, cards, 0, cardNumbers)); Turn turn = gameClient.GetTurn(game); game.PlayTurn(turn); Console.Out.WriteLine($"Score: {absGameClient.GameResult:0.000000}"); Console.Out.WriteLine(AlphaBetaSearch.GetStats()); Console.Out.WriteLine(statsCollector.GetReport()); Console.Out.WriteLine(turn); Console.Out.WriteLine(game.ToString()); }
static void RunSingleTurn() { var statsCollector = new GameClientStatsCollector(); //var evaluator = new Evaluator(1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0); var evaluator = new Evaluator(0.654, 1.000, 0.125, 0.674, 0.241, 0.346, 0.867, 0.554, 0.338); AlphaBetaSearchGameClient absGameClient = new AlphaBetaSearchGameClient(evaluator, 6, statsCollector, true, true, runParallel: true); Player player1 = new Player("AlphaBetaSearch", () => absGameClient); Player player2 = new Player("MovePawnsToBase", () => new MovePawnsToBaseGameClient()); var gameClient = player1.CreateGameClient.Invoke(); var b = "OOK.O" + "...O." + "....." + ".o..." + "o.koo"; IEnumerable <Card> cards = new List <Card>() { Card.Boar, Card.Ox, Card.Tiger, Card.Dragon, Card.Eel }; var cardNumbers = new[] { 0, 1, 2, 3, 4 }; Turn turn = gameClient.GetTurn(new Game(player1, player2, GameUtil.ParseGameState(b, cards, 0, cardNumbers))); Console.Out.WriteLine($"Score: {absGameClient.GameResult:0.000000}"); Console.Out.WriteLine(AlphaBetaSearch.GetStats()); Console.Out.WriteLine(statsCollector.GetReport()); }
static void RunSingleTurn5() { var statsCollector = new GameClientStatsCollector(); var evaluator = new Evaluator(0.353, 0.000, 0.030, 1.000, 0.406, 0.111, 0.103, 0.000, 0.389); AlphaBetaSearchGameClient absGameClient = new AlphaBetaSearchGameClient(evaluator, 7, statsCollector, true, true, runParallel: false); Player player = new Player("AlphaBetaSearch", () => absGameClient); var gameClient = player.CreateGameClient.Invoke(); var b = "...O." + ".k..." + "...K." + "....." + "o...o"; IEnumerable <Card> cards = new List <Card>() { Card.Eel, Card.Boar, Card.Crane, Card.Rabbit, Card.Frog }; var cardNumbers = new[] { 0, 1, 2, 3, 4 }; Game game = new Game(player, null, GameUtil.ParseGameState(b, cards, 0, cardNumbers)); Turn turn = gameClient.GetTurn(game); game.PlayTurn(turn); Console.Out.WriteLine($"Score: {absGameClient.GameResult:0.000000}"); Console.Out.WriteLine(AlphaBetaSearch.GetStats()); Console.Out.WriteLine(statsCollector.GetReport()); Console.Out.WriteLine(turn); Console.Out.WriteLine(game.ToString()); }
static void RunSingleTurn4() { var statsCollector = new GameClientStatsCollector(); var evaluator = new Evaluator(1.000, 0.000, 0.043, 0.829, 0.654, 0.082, 0.797, 0.000, 0.437); AlphaBetaSearchGameClient absGameClient = new AlphaBetaSearchGameClient(evaluator, 6, statsCollector, true, true, runParallel: true); Player player = new Player("AlphaBetaSearch", () => absGameClient); var gameClient = player.CreateGameClient.Invoke(); var b = ".O.OO" + "k...K" + "..o.." + "....." + ".o..o"; IEnumerable <Card> cards = new List <Card>() { Card.Dragon, Card.Rooster, Card.Goose, Card.Frog, Card.Mantis }; var cardNumbers = new[] { 0, 1, 2, 3, 4 }; Game game = new Game(player, null, GameUtil.ParseGameState(b, cards, 0, cardNumbers)); Turn turn = gameClient.GetTurn(game); game.PlayTurn(turn); Console.Out.WriteLine($"Score: {absGameClient.GameResult:0.000000}"); Console.Out.WriteLine(AlphaBetaSearch.GetStats()); Console.Out.WriteLine(statsCollector.GetReport()); Console.Out.WriteLine(turn); Console.Out.WriteLine(game.ToString()); }
public PhutballMoveScore Search(IFieldsGraph fieldsGraph) { if(_alphaBetaSearchDepth.SearchDepth == 0) { return PhutballMoveScore.Empty(); } var actualGraph = (IFieldsGraph)fieldsGraph.Clone(); var performMoves = new PerformMoves(actualGraph, _playersState); var visitedNodes = new VisitedNodesCounter<JumpNode>(); _alphaBetaSearch = new AlphaBetaSearch<JumpNode>( new WhiteStoneToCurrentPlayerBorderDistance(_playersState, actualGraph, _alphaBetaSearchDepth.DistanceToBorderWeight) .Add(new BlackStoneToTargetBorderCount(_playersState, actualGraph, _alphaBetaSearchDepth.BlackStonesToBorderWeight)) , _alphaBetaSearchDepth, new PerformMovesNodeVisitor(performMoves).FollowedBy(visitedNodes) ); var movesTree = _movesFactory(actualGraph); _alphaBetaSearch.Run(movesTree); var result = new CompositeMove(); _alphaBetaSearch.BestMove.Move.MovesFromRoot.CollectToPlayerSwitch(result); return new PhutballMoveScore(result, _alphaBetaSearch.BestMove.Score) { CuttoffsCount = _alphaBetaSearch.CuttoffsCount, VisitedNodesCount = visitedNodes.Count }; }
public void Run() { Console.WriteLine(CurrentState.ToString()); while (true) { if (TestWin()) { return; } Console.WriteLine(SelectTargetString); Console.WriteLine(XyPositionString); var fromX = Convert.ToInt16(Console.ReadKey().KeyChar.ToString()); var fromY = Convert.ToInt16(Console.ReadKey().KeyChar.ToString()); Console.WriteLine(SelecttargetLocationString); Console.WriteLine(XyPositionString); var toX = Convert.ToInt16(Console.ReadKey().KeyChar.ToString()); var toY = Convert.ToInt16(Console.ReadKey().KeyChar.ToString()); var moveStatus = this.HandleUserMove(CurrentState, fromX, fromY, toX, toY); if (moveStatus == Move.MoveStatus.NoError) { Console.WriteLine(CurrentState); if (TestWin()) { return; } Console.WriteLine("Now it's Computer's turn... "); CurrentState = (AlphaBetaSearch.DoSearch(CurrentState, 1)); } Console.Clear(); Console.WriteLine(CurrentState.ToString()); } }
public void testAlphaBetaDecision() { AlphaBetaSearch <TicTacToeState, XYLocation, string> search = AlphaBetaSearch <TicTacToeState, XYLocation, string> .createFor(game); search.makeDecision(state); int expandedNodes = search.getMetrics().getInt(MinimaxSearch <TicTacToeState, XYLocation, string> .METRICS_NODES_EXPANDED); Assert.AreEqual(30709, expandedNodes); }
public void GetUniqueIdentifier_should_returnDifferentValueForDifferentInTurnPlayer_2() { var b = ".OK.." + "...O." + ".o..O" + "....." + "o.k.."; AlphaBetaSearch.GetUniqueIdentifier(GameUtil.ParseGameState(b, inTurnPlayerIndex: 0)).Should().NotBe(AlphaBetaSearch.GetUniqueIdentifier(GameUtil.ParseGameState(b, inTurnPlayerIndex: 1))); }
public HexCoordinate GetNextPlay(Andantino state) { // The first 2 turns do not matter, just return one action if (state.Turn <= 2) { return(state.GetValidPlacements()[0]); } PreviousSearchResults = AlphaBetaSearch.GetBestPlay(state, 4000L); return(PreviousSearchResults.BestMove); }
private void Start() { End.SetActive(false); game = new Awale(); //minimaxSearch = MinimaxSearch<State, int, int>.createFor(game); alphabetaSearch = AlphaBetaSearch <StateAwale, int, int> .createFor(game); CurrentState = game.getInitialState(); CheckisTerminal(); }
public void AI() { Console.WriteLine("__________________________AI STARTS_____________________________"); var(bestScore, bestMove) = true ? IterativeDeepening.Start() : AlphaBetaSearch.NegaMax(2, Const.MIN_VALUE, Const.MAX_VALUE); if (bestMove == null) { Console.WriteLine("STALEMATE"); GameStatus = Const.GAME_OVER; return; } Console.WriteLine(bestMove.ToString() + "\t-->\t" + bestScore); MakeMove(bestMove); }
public void GetUniqueIdentifier_should_returnDifferentValuesForDifferentCards() { var b = "OOKOO" + "....." + "....." + "....." + "ookoo"; var cards = new[] { Card.Boar, Card.Cobra, Card.Dragon, Card.Eel, Card.Frog }; var cardNumbers1 = new[] { 0, 1, 2, 3, 4 }; var cardNumbers2 = new[] { 0, 1, 2, 4, 3 }; AlphaBetaSearch.GetUniqueIdentifier(GameUtil.ParseGameState(b, cards, 0, cardNumbers1)).Should().NotBe(AlphaBetaSearch.GetUniqueIdentifier(GameUtil.ParseGameState(b, cards, 0, cardNumbers2))); }
public void GetGameResult_RegressionTest2() { var b = "OOK.O" + "...O." + "....." + ".o..." + "o.koo"; var cards = new[] { Card.Boar, Card.Ox, Card.Tiger, Card.Dragon, Card.Eel }; var cardNumbers = new[] { 0, 1, 2, 3, 4 }; var game = GameUtil.ParseGame(b, cards, 0, cardNumbers); var tup = new AlphaBetaSearch(game, 6, new Evaluator(1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0), true, true, true).GetGameResult(); tup.Item1.Should().BeApproximately(-0.192021, 0.000001); }
public void GetGameResult_Should_CapturePawn() { var b = "OOK.O" + "....." + "....." + "o..O." + ".okoo"; var cards = new[] { Card.Frog, Card.Rabbit, Card.Monkey, Card.Tiger, Card.Boar }; var cardNumbers = new[] { 0, 1, 2, 3, 4 }; var game = GameUtil.ParseGame(b, cards, 0, cardNumbers); var tup = new AlphaBetaSearch(game, 1, new Evaluator(1, 0, 0, 0, 0, 0, 0, 0, 0)).GetGameResult(); tup.Item1.Should().Be(0.25); // +1/4 in material }
public void GetGameResult_Should_ReturnLosingWhenOpponentInDirectWinningPosition() { var b = "OO.OO" + "....." + "..K.." + "....." + "ookoo"; var cards = new[] { Card.Boar, Card.Dragon, Card.Eel, Card.Tiger, Card.Frog }; var cardNumbers = new[] { 0, 1, 2, 3, 4 }; var game = GameUtil.ParseGame(b, cards, 0, cardNumbers); var tup = new AlphaBetaSearch(game, 2, new IndifferentEvaluator()).GetGameResult(); tup.Item1.Should().Be(AlphaBetaSearch.GameResultLosing); }
public void GetGameResult_Should_ReturnUndecidedWhenNotInDirectWinningPosition() { var b = "OOK.O" + "....." + "..O.." + "....." + "ookoo"; var cards = new[] { Card.Boar, Card.Dragon, Card.Eel, Card.Rooster, Card.Frog }; var cardNumbers = new[] { 0, 1, 2, 3, 4 }; var game = GameUtil.ParseGame(b, cards, 1, cardNumbers); var tup = new AlphaBetaSearch(game, 1, new IndifferentEvaluator()).GetGameResult(); tup.Item1.Should().Be(0); // value from indifferent evaluator }
public void GetUniqueIdentifier_should_returnSameValueForMirroredBoards_3() { var b1 = "....K" + "O...O" + "....." + "....." + "oo..k"; var b2 = "K...." + "O...O" + "....." + "....." + "k..oo"; AlphaBetaSearch.GetUniqueIdentifier(GameUtil.ParseGameState(b1)).Should().Be(AlphaBetaSearch.GetUniqueIdentifier(GameUtil.ParseGameState(b2))); }
public void GetGameResult_Should_ReturnLosingWhenOpponentInTwoStepWinningPosition() { // opponent winning in two steps: play Monkey, moving pawn to (2,2), then Tiger to capture base. var b = "OO.OO" + "...K." + "....." + "....." + "ok.oo"; var cards = new[] { Card.Frog, Card.Rabbit, Card.Monkey, Card.Tiger, Card.Eel }; var cardNumbers = new[] { 0, 1, 2, 3, 4 }; var game = GameUtil.ParseGame(b, cards, 0, cardNumbers); var tup = new AlphaBetaSearch(game, 4, new IndifferentEvaluator()).GetGameResult(); tup.Item1.Should().Be(AlphaBetaSearch.GameResultLosing); }
public void GetUniqueIdentifier_should_returnDifferentValueForBoardsWithPawnRemoved() { var b1 = "OOKOO" + "....." + "....." + "....." + "ookoo"; var b2 = "OOKOO" + "....." + "....." + "....." + "ook.o"; AlphaBetaSearch.GetUniqueIdentifier(GameUtil.ParseGameState(b1)).Should().NotBe(AlphaBetaSearch.GetUniqueIdentifier(GameUtil.ParseGameState(b2))); }
public void SetupGame(int nb) { End.SetActive(false); allumettesTxt.text = ""; IATxt.text = ""; game = new Nim(nb); //minimaxSearch = MinimaxSearch<List<int>, int, int>.createFor(game); alphabetaSearch = AlphaBetaSearch <NimState, int, int> .createFor(game); CurrentState = game.getInitialState(); allumettesTxt.text = "Allumettes restantes : " + CurrentState.allumettes.ToString(); CheckisTerminal(); }
public void GetUniqueIdentifier_should_returnDifferentValueForBoardsWithPawnsInDIfferentPositions2() { var b1 = "OO..." + "..K.." + "...o." + ".o..." + "..k.o"; var b2 = "OO..." + "..K.." + "...o." + "..o.." + "..k.o"; AlphaBetaSearch.GetUniqueIdentifier(GameUtil.ParseGameState(b1)).Should().NotBe(AlphaBetaSearch.GetUniqueIdentifier(GameUtil.ParseGameState(b2))); }
public void GetGameResult_Should_ReturnWinningWhenInDirectWinningPosition_North() { var b = "OOK.O" + "....." + "..O.." + "....." + "ookoo"; var cards = new[] { Card.Boar, Card.Dragon, Card.Eel, Card.Tiger, Card.Frog }; var cardNumbers = new[] { 0, 1, 2, 3, 4 }; var game = GameUtil.ParseGame(b, cards, 1, cardNumbers); var tup = new AlphaBetaSearch(game, 1, new IndifferentEvaluator()).GetGameResult(); tup.Item1.Should().Be(AlphaBetaSearch.GameResultWinning); tup.Item2.Where(kvp => kvp.Value == AlphaBetaSearch.GameResultWinning).Select(kvp => kvp.Key).Should() .Contain(new Turn(game.InTurnPlayer, Card.Tiger, 1, PieceType.Pawn, new Vector(2, 2), new Vector(0, -2))); }
private void Start() { Nim game = new Nim(Matches); MinimaxSearch <NimState, int, int> minimaxSearch = MinimaxSearch <NimState, int, int> .createFor(game); AlphaBetaSearch <NimState, int, int> alphabetaSearch = AlphaBetaSearch <NimState, int, int> .createFor(game); NimState state = game.getInitialState(); int action1 = -1; int action2 = -1; action1 = minimaxSearch.makeDecision(state); action2 = alphabetaSearch.makeDecision(state); Debug.Log("Chosen action is " + action1 + " and node minimax " + minimaxSearch.getMetrics()); Debug.Log("Chosen action is " + action2 + " and node alphabeta " + alphabetaSearch.getMetrics()); }
public void GetUniqueIdentifier_should_returnSameValuesForSameCardsInDifferentOrder() { var b = "O.KOO" + "....." + ".O..." + "..oo." + "..koo"; var cards = new[] { Card.Boar, Card.Cobra, Card.Dragon, Card.Eel, Card.Frog }; var cardNumbers1 = new[] { 0, 1, 2, 3, 4 }; var cardNumbers2 = new[] { 1, 0, 2, 3, 4 }; var cardNumbers3 = new[] { 0, 1, 3, 2, 4 }; var cardNumbers4 = new[] { 1, 0, 3, 2, 4 }; AlphaBetaSearch.GetUniqueIdentifier(GameUtil.ParseGameState(b, cards, 0, cardNumbers1)).Should().Be(AlphaBetaSearch.GetUniqueIdentifier(GameUtil.ParseGameState(b, cards, 0, cardNumbers2))); AlphaBetaSearch.GetUniqueIdentifier(GameUtil.ParseGameState(b, cards, 0, cardNumbers1)).Should().Be(AlphaBetaSearch.GetUniqueIdentifier(GameUtil.ParseGameState(b, cards, 0, cardNumbers3))); AlphaBetaSearch.GetUniqueIdentifier(GameUtil.ParseGameState(b, cards, 0, cardNumbers1)).Should().Be(AlphaBetaSearch.GetUniqueIdentifier(GameUtil.ParseGameState(b, cards, 0, cardNumbers4))); }
static void startAlphaBetaDemo() { System.Console.WriteLine("ALPHA BETA DEMO\n"); TicTacToeGame game = new TicTacToeGame(); TicTacToeState currState = game.GetInitialState(); IAdversarialSearch <TicTacToeState, XYLocation> search = AlphaBetaSearch <TicTacToeState, XYLocation, string> .createFor(game); while (!(game.IsTerminal(currState))) { System.Console.WriteLine(game.GetPlayer(currState) + " playing ... "); XYLocation action = search.makeDecision(currState); currState = game.GetResult(currState, action); System.Console.WriteLine(currState); } System.Console.WriteLine("ALPHA BETA DEMO done"); }
public void GetGameResult_Should_ReturnWinningWhenInTwoStepWinningPosition() { // winning in two steps: play Monkey, moving pawn to (2,2), then Tiger to capture base. var b = "OO.OO" + "...K." + "....." + "....." + "ookoo"; var cards = new[] { Card.Boar, Card.Dragon, Card.Monkey, Card.Tiger, Card.Frog }; var cardNumbers = new[] { 0, 1, 2, 3, 4 }; var game = GameUtil.ParseGame(b, cards, 1, cardNumbers); var tup = new AlphaBetaSearch(game, 3, new IndifferentEvaluator()).GetGameResult(); tup.Item1.Should().Be(AlphaBetaSearch.GameResultWinning); tup.Item2.Single(kvp => kvp.Value == AlphaBetaSearch.GameResultWinning).Key.Should() .Be(new Turn(game.InTurnPlayer, Card.Monkey, 0, PieceType.Pawn, new Vector(3, 3), new Vector(-1, -1))); }
public void GetGameResult_Should_ReturnUndecidedWhenOpponentNotInDirectWinningPosition() { var b = "OOK.O" + "....." + "..O.." + ".o..." + "o.koo"; var cards = new[] { Card.Boar, Card.Elephant, Card.Eel, Card.Tiger, Card.Frog }; var cardNumbers = new[] { 0, 1, 2, 3, 4 }; var game = GameUtil.ParseGame(b, cards, 0, cardNumbers); var tup = new AlphaBetaSearch(game, 2, new IndifferentEvaluator()).GetGameResult(); tup.Item1.Should().Be(0); // undecided // After the new rule, there are in fact multiple moves to take that lead to undecided in 2. // due to the nature of the ABS algorithm, not all branches will be explored, so a contains() check won't work. // tup.Item2.Single(kvp => kvp.Value == 0).Key.Should().Be(new Turn(game.InTurnPlayer, Card.Elephant, 1, PieceType.Pawn, new Vector(1, 1), new Vector(1, 1))); }
public void TestMovePieceSimple() { var states = new State(); states = PieceMove.MovePiece(states, 7, 7, 4, 7);//user Debug.WriteLine(states.ToString()); //states = PieceMove.MovePiece(states, 1, 2, 1, 9);//com states = (AlphaBetaSearch.DoSearch(states, 1)); Debug.WriteLine(states.ToString()); states = PieceMove.MovePiece(states, 0, 9, 1, 9);//user Debug.WriteLine(states.ToString()); Assert.AreEqual(30, states.GetPieceList().Count); var piece = PieceFactory.GetPiece(23, 1, 9); Assert.AreEqual(typeof(Rook), piece.GetType()); }
private void Start() { TTT game = new TTT(); MinimaxSearch <StateTTT, int, int> minimaxSearch = MinimaxSearch <StateTTT, int, int> .createFor(game); AlphaBetaSearch <StateTTT, int, int> alphabetaSearch = AlphaBetaSearch <StateTTT, int, int> .createFor(game); StateTTT state = game.getInitialState(); int action1 = -100000; int action2 = -100000; action1 = minimaxSearch.makeDecision(state); action2 = alphabetaSearch.makeDecision(state); Debug.Log("Chosen action is " + action1 + " and node minimax " + minimaxSearch.getMetrics()); Debug.Log("Chosen action is " + action2 + " and node alphabeta " + alphabetaSearch.getMetrics()); }