public static ChromosomeDataRequest CreateChromosomeRequest(int testId, double fitness, double elapsedTime, IChromosome chromosome, EvaluationParticipant referenceParticipant, EvaluationParticipant experimentalParticipant) { return(new ChromosomeDataRequest { TestId = testId, ElapsedTime = elapsedTime, Fitness = fitness, ReferenceEngineStatistics = new SelfPlayStatisticsDataRequest { AverageTimePerGame = elapsedTime / SettingsLoader.Data.GamesPerFitnessTest, AverageDepth = referenceParticipant.AverageDepth, AverageNodesCount = referenceParticipant.AverageNodesCount, AverageNodesPerSecond = referenceParticipant.AverageNps, Wins = referenceParticipant.Wins, Draws = referenceParticipant.Draws }, ExperimentalEngineStatistics = new SelfPlayStatisticsDataRequest { AverageTimePerGame = elapsedTime / SettingsLoader.Data.GamesPerFitnessTest, AverageDepth = experimentalParticipant.AverageDepth, AverageNodesCount = experimentalParticipant.AverageNodesCount, AverageNodesPerSecond = experimentalParticipant.AverageNps, Wins = experimentalParticipant.Wins, Draws = experimentalParticipant.Draws }, Genes = CreateGenesRequest(chromosome) }); }
public double Evaluate(IChromosome chromosome) { var referenceParticipant = new EvaluationParticipant(_referenceEngineOperator); var experimentalParticipant = new EvaluationParticipant(_experimentalEngineOperator); for (var geneIndex = 0; geneIndex < SettingsLoader.Data.Genes.Count; geneIndex++) { var geneName = SettingsLoader.Data.Genes[geneIndex].Name; var geneValue = chromosome.GetGene(geneIndex).ToString(); experimentalParticipant.EngineOperator.SetOption(geneName, geneValue); } while (true) { try { referenceParticipant.EngineOperator.ApplyOptions(); experimentalParticipant.EngineOperator.ApplyOptions(); break; } catch { referenceParticipant.EngineOperator.Restart(); experimentalParticipant.EngineOperator.Restart(); } } var stopwatch = Stopwatch.StartNew(); var(whitePlayer, blackPlayer) = (referenceParticipant, experimentalParticipant); for (var gameIndex = 0; gameIndex < SettingsLoader.Data.GamesPerFitnessTest;) { var openingBookMoves = _polyglotBook.GetRandomOpening(SettingsLoader.Data.PolyglotMaxMoves); for (var i = 0; i < 2; i++) { try { var gameData = new GameData(openingBookMoves); var(playerToMove, opponent) = (whitePlayer, blackPlayer); playerToMove.EngineOperator.InitNewGame(); opponent.EngineOperator.InitNewGame(); while (true) { var bestMoveData = playerToMove.EngineOperator.Go(gameData.HalfMovesDone, gameData.WhiteClock, gameData.BlackClock); if (bestMoveData == null || bestMoveData.LastInfoData == null) { playerToMove.History.Add(new ArchivedGame(gameData, GameResult.Draw)); opponent.History.Add(new ArchivedGame(gameData, GameResult.Draw)); break; } playerToMove.Logs.Add(bestMoveData.LastInfoData); gameData.MakeMove(bestMoveData); if (gameData.GameIsDone) { if (gameData.WhiteClock <= 0 || gameData.BlackClock <= 0) { playerToMove.History.Add(new ArchivedGame(gameData, GameResult.Loss)); opponent.History.Add(new ArchivedGame(gameData, GameResult.Win)); } else if (gameData.Winner == Color.None) { playerToMove.History.Add(new ArchivedGame(gameData, GameResult.Draw)); opponent.History.Add(new ArchivedGame(gameData, GameResult.Draw)); } else { playerToMove.History.Add(new ArchivedGame(gameData, GameResult.Win)); opponent.History.Add(new ArchivedGame(gameData, GameResult.Loss)); } break; } (playerToMove, opponent) = (opponent, playerToMove); } (whitePlayer, blackPlayer) = (blackPlayer, whitePlayer); gameIndex++; } catch { referenceParticipant.EngineOperator.Restart(); experimentalParticipant.EngineOperator.Restart(); gameIndex--; } } } var elapsedTime = (double)stopwatch.ElapsedMilliseconds / 1000; var fitness = CalculateEloPerformance(experimentalParticipant.Wins, experimentalParticipant.Losses, experimentalParticipant.Draws); var chromosomeRequest = RequestsFactory.CreateChromosomeRequest(_testId, fitness, elapsedTime, chromosome, referenceParticipant, experimentalParticipant); _webService.SendChromosomeData(chromosomeRequest).GetAwaiter().GetResult(); Console.WriteLine($"[{DateTime.Now}] Run done! Fitness: {fitness}"); return(fitness); }