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
}