private double RunTournament(double[] values) { DateTime startedTime = DateTime.Now; _learnedScores.FromResult(values); var stats = new Dictionary<string, TournamentPlayerStats>(); const int numPlayers = 2; int round = 0; var tournamentResult = new TournamentResult(); int challengerIndex = 0; while (round < _roundsToWinInTournament) { ++round; challengerIndex = (challengerIndex + 1) % numPlayers; var game = new Game.Game(_boardConstructor.ConstructBoard(), numPlayers) {Round = round}; var _improvedEMM_AIPlayer_normal = new ImprovedEMN(new GameScores()); var _improvedEMM_AIPlayer_expansion = new ImprovedEMN(_learnedScores); var players = new IPlayer[numPlayers]; players.Fill(_improvedEMM_AIPlayer_normal); players[challengerIndex] = _improvedEMM_AIPlayer_expansion; for (var j = 0; j < numPlayers; ++j) { var name = players[j].Name; if (!stats.ContainsKey(name)) { stats[name] = new TournamentPlayerStats { PlayerName = name }; } } var controller = new GameController(_gameViewer, game, false, players); var winnerIndex = controller.Run(); var stat = stats[players[winnerIndex].Name]; ColorConsole.WriteLine(ConsoleColor.Yellow, ">>> University {0}, AI player '{1}' has won. <<<", controller.Game.GetUniversityByIndex(winnerIndex).Color, stat.PlayerName ); stat.HasWon(); var challengerUni = game.GetUniversityByIndex(challengerIndex); tournamentResult.AddRound( new RoundResult(game.GetScore(challengerUni), winnerIndex == challengerIndex, game.Universities.Where(u => u != challengerUni).Select(game.GetScore) )); foreach (var statForPrint in stats.Values) { statForPrint.PrintToConsole(); } } var totalScore = tournamentResult.CalculateTotalScore(); LogInfo(_learnedScores.ToString()); _touranmentCount++; var remainingTimeSpan = GetEstimatedFinishedTime(); LogInfo("Got score: {0}. Challenger won {1} rounds. Time taken this tournament: {2}." + " Total time taken: {3}. Estimated finished time: {4} ({5} to go)", totalScore, tournamentResult.ChallengerWinningCount, DateTime.Now - startedTime, DateTime.Now - _learningStartedDT, DateTime.Now + remainingTimeSpan, remainingTimeSpan); return -totalScore; // return negative for function minimisation }