/// <summary> /// Returns the amount of wins the challenger got (from 100) /// </summary> private static int CalculateChallengerWinsFrom100(IMoveDecisionMaker best, IMoveDecisionMaker challenger) { int challengerWins = 0; Parallel.For(0, 200, (i) => { var state = new SimulationState(SimulationHelpers.GetRandomPieces(i / 2), 0); state.ActivePlayer = i % 2; state.Fidelity = SimulationFidelity.NoPiecePlacing; //TODO: May need a cheaper placement engine var runner = new SimulationRunner(state, new PlayerDecisionMaker(best, null), new PlayerDecisionMaker(challenger, null)); while (!state.GameHasEnded) { runner.PerformNextStep(); } if (state.WinningPlayer == 1) { Interlocked.Increment(ref challengerWins); } }); return(challengerWins); }
private void Evaluate() { Console.WriteLine($"Evaluating vs " + _opp.Name); var players = new IMoveDecisionMaker[] { _ai, _opp }; //Play X games (even amount), each player gets to start on each of the boards once for (var game = 0; game < 4; game++) { var state = new SimulationState(SimulationHelpers.GetRandomPieces(game / 2), 0); state.Fidelity = SimulationFidelity.NoPiecePlacing; state.ActivePlayer = game % 2; while (!state.GameHasEnded) { players[state.ActivePlayer].MakeMove(state); } Console.WriteLine($"Game {game}. Winner {state.WinningPlayer}. Scores: {state.CalculatePlayerEndGameWorth(0)} / {state.CalculatePlayerEndGameWorth(1)}"); } }
public void CreateMoveMaker() { //TODO: Garbage generation here var moveMakers = new IMoveDecisionMaker[SimulationState.EndLocation]; for (var i = 0; i < SimulationState.EndLocation; i++) { var offset = i * 8; moveMakers[i] = new TuneableUtilityMoveMaker( Gene[offset + 0], Gene[offset + 1], Gene[offset + 2], Gene[offset + 3], Gene[offset + 4], Gene[offset + 5], Gene[offset + 6], Gene[offset + 7] ); } MoveMaker = new RangeSplitByBoardPositionDelegationMoveMaker(moveMakers); }
public MoveOnlyMonteCarloTreeSearchWithPreplacerMoveMaker(int iterations, IMoveDecisionMaker rolloutMoveMaker, PreplacerStrategy preplacer) : base(iterations, rolloutMoveMaker) { _preplacer = preplacer; }
public MonteCarloTreeSearchPlacementExpander(int iterations, IMoveDecisionMaker rolloutMoveMaker, IBoardEvaluator boardEvaluator, int maxChildrenPerPiece) : base(iterations, rolloutMoveMaker) { MaxChildrenPerPiece = maxChildrenPerPiece; BoardEvaluator = boardEvaluator; }
public MonteCarloTreeSearchMoveMaker(int iterations, IMoveDecisionMaker rolloutMoveMaker, IBoardEvaluator boardEvaluator, int maxChildrenPerPiece) { _mcts = new MonteCarloTreeSearchPlacementExpander(iterations, rolloutMoveMaker, boardEvaluator, maxChildrenPerPiece); }
protected BaseMoveOnlyMonteCarloTreeSearchMoveMaker(int iterations, IMoveDecisionMaker rolloutMoveMaker = null) { Mcts = new MonteCarloTreeSearch <SearchNode>(iterations, rolloutMoveMaker); }
public MoveOnlyMonteCarloTreeSearchMoveMaker(int iterations, IMoveDecisionMaker rolloutMoveMaker = null, bool useMinusOne = false, double progressiveBiasWeight = 0) : base(iterations, rolloutMoveMaker) { _useMinusOne = useMinusOne; _progressiveBiasWeight = progressiveBiasWeight; }
public PlayerDecisionMaker(IMoveDecisionMaker moveDecisionMaker, IPlacementDecisionMaker placementDecisionMaker) { MoveDecisionMaker = moveDecisionMaker; PlacementDecisionMaker = placementDecisionMaker; }
public MonteCarloTreeSearch(int iterations, IMoveDecisionMaker rolloutMoveMaker) { Iterations = iterations; RolloutMoveMaker = rolloutMoveMaker ?? new RandomMoveMaker(0); }