From 82f3a6e9ef206c9fe5e4b2497d389858672ba818 Mon Sep 17 00:00:00 2001 From: David Jardim Date: Tue, 2 May 2017 10:29:47 -0400 Subject: [PATCH] added output values to sim_out.txt, shrinkage of random distribtuion --- include/GeneticSimulation.hpp | 19 +++++--- include/Heuristic.hpp | 3 +- include/MinimaxSearch.h | 2 +- src/Game.cpp | 10 ++-- src/GeneticSimulation.cpp | 92 ++++++++++++++++++++++------------- src/main.cpp | 7 ++- 6 files changed, 85 insertions(+), 48 deletions(-) diff --git a/include/GeneticSimulation.hpp b/include/GeneticSimulation.hpp index f85a333..2995770 100644 --- a/include/GeneticSimulation.hpp +++ b/include/GeneticSimulation.hpp @@ -2,26 +2,33 @@ #define GENETIC_SIMULATION_H #include -#include +#include +#include #include "Specimen.hpp" class GeneticSimulation { int numSpecimen; - std::queue population; + std::deque population; std::random_device rd; std::mt19937 gen; std::uniform_int_distribution dist; + std::ofstream fileOut; + public: GeneticSimulation(int s): numSpecimen(s), - dist(-268435456,268435456), + // dist(-268435456,268435456), + dist(-100,100), rd(), - gen(rd()) {}; - void simulate(); - + gen(rd()) { + fileOut.open("sim_out.txt", std::ios::app); + }; + ~GeneticSimulation(){ fileOut.close(); }; + void simulateRound(int roundNum); + void printWinners(); }; diff --git a/include/Heuristic.hpp b/include/Heuristic.hpp index fbd21cb..3044a94 100644 --- a/include/Heuristic.hpp +++ b/include/Heuristic.hpp @@ -33,9 +33,10 @@ class Heuristic public: void set(int index, int value) { coeff[index] = value; }; int evaluate(bup &bitboard); - + auto getArray(){ return coeff;}; // Needed public for variable depth search int jumpeablePieces() const; + }; #endif diff --git a/include/MinimaxSearch.h b/include/MinimaxSearch.h index 526694e..c02fdd0 100644 --- a/include/MinimaxSearch.h +++ b/include/MinimaxSearch.h @@ -14,7 +14,7 @@ class MinimaxSearch { private: static const int MIN_DEPTH = 5; - static const int MAX_DEPTH = 9; + static const int MAX_DEPTH = 6; Heuristic heuristic; double minValue(std::unique_ptr &board, int currentDepth); diff --git a/src/Game.cpp b/src/Game.cpp index 02cd684..4c96dc7 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -32,7 +32,7 @@ void Game::play(int *winner){ // draw after some limit of no capture if(noCaptureCount >= noCaptureLimit) { - *winner = 3; + *winner = 0; break; } @@ -47,7 +47,7 @@ void Game::play(int *winner){ } //get next move - if(board->player().compare("black")) + if(board->player().compare("black") == 0) bestMove = blackSearch.minimaxDecision(board); else bestMove = whiteSearch.minimaxDecision(board); @@ -57,11 +57,11 @@ void Game::play(int *winner){ board->printState(); // 1 if black wins, 2 if white, 3 if draw - if(noCaptureCount == noCaptureLimit) + if(noCaptureCount >= noCaptureLimit) *winner = 0; - else if(board->player().compare("black")) + else if(board->player().compare("black") == 0) *winner = 1; - else if(board->player().compare("white")) + else if(board->player().compare("white") == 0) *winner = 2; } diff --git a/src/GeneticSimulation.cpp b/src/GeneticSimulation.cpp index 8452930..63ac923 100644 --- a/src/GeneticSimulation.cpp +++ b/src/GeneticSimulation.cpp @@ -5,28 +5,48 @@ #include "Game.hpp" #include "Specimen.hpp" -void GeneticSimulation::simulate(){ - - for(int i = 0; i < numSpecimen; i++){ - Heuristic h1, h2; - for(int j = 0; j < Heuristic::numFeatures; j++){ - h1.set(j, dist(gen)); - h2.set(j, dist(gen)); - } - - Specimen s(h1, h2); - population.push(s); + +void GeneticSimulation::printWinners(){ + for(auto i = population.begin(); i < population.end(); i++){ + fileOut << "\nS: {"; + Heuristic h = i->getStartHeuristics(); + for(int j = 0; j < Heuristic::numFeatures-1; j++) + fileOut << h.getArray()[j] << ", "; + fileOut << h.getArray()[Heuristic::numFeatures-1] << "}\nE: {"; + h = i->getEndHeuristics(); + for(int j = 0; j < Heuristic::numFeatures-1; j++) + fileOut << h.getArray()[j] << ", "; + fileOut << h.getArray()[Heuristic::numFeatures-1] << "}"; } +} +void GeneticSimulation::simulateRound(int roundNum){ + + // if first round, randomly populate + // if(population.size() = 0){ + for(int i = 0; i < numSpecimen - population.size(); i++){ + Heuristic h1, h2; + for(int j = 0; j < Heuristic::numFeatures; j++){ + h1.set(j, dist(gen)); + h2.set(j, dist(gen)); + } + + Specimen s(h1, h2); + population.push_back(s); + + } + + std::cout << numSpecimen; int cntBlack=0, cntWhite=0, cntTies=0; int cntTieBlack=0, cntTieWhite=0; - while(population.size() > numSpecimen/5){ + int gamesSinceNoTie = 0; + while(population.size() > (numSpecimen/10) && gamesSinceNoTie < population.size()){ Specimen a = population.front(); - population.pop(); + population.pop_front(); Specimen b = population.front(); - population.pop(); + population.pop_front(); Game game1(a, b); @@ -40,41 +60,45 @@ void GeneticSimulation::simulate(){ game2.play(&winner); if(winner == 1){ - population.push(b); + population.push_back(b); cntTieBlack++; } else if(winner == 2){ - population.push(a); + population.push_back(a); cntTieWhite++; } } else { if(winner == 1){ - population.push(a); + population.push_back(a); cntBlack++; } else if(winner == 2){ - population.push(b); + population.push_back(b); cntWhite++; } - else cntTies++; - - std::cout << population.size() << std::endl; } + + if(winner == 0){ + cntTies++; + population.push_back(a); + population.push_back(b); + gamesSinceNoTie++; + }else { + gamesSinceNoTie = 0; + } + } - - - std::ofstream s; - s.open("sim_out.txt", std::ios::app); - - if(s.is_open()){ - s << "Size: \t\t" << numSpecimen << std::endl; - s << "Black Wins: \t" << cntBlack << std::endl; - s << "White Wins: \t" << cntWhite << std::endl; - s << "White Wins(after Tie): " << cntTieBlack << std::endl; - s << "Black Wins(after Tie): " << cntTieWhite << std::endl; - s << "Ties: \t\t" << cntTies << std::endl; + if(fileOut.is_open()){ + fileOut<< "\nRound: " << roundNum << std::endl; + fileOut<< "Size: \t\t" << numSpecimen << std::endl; + fileOut<< "Black Wins: \t" << cntBlack << std::endl; + fileOut<< "White Wins: \t" << cntWhite << std::endl; + fileOut<< "White Wins(after Tie): " << cntTieBlack << std::endl; + fileOut<< "Black Wins(after Tie): " << cntTieWhite << std::endl; + fileOut<< "Ties: \t\t" << cntTies<< std::endl; + fileOut<< "End popultion size: \t" << population.size() << std::endl; } - s.close(); + } diff --git a/src/main.cpp b/src/main.cpp index b27254c..312ecd3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -94,7 +94,12 @@ void serverGame(int userID, int oppID){ void geneticSimulation(int numSpecimen){ GeneticSimulation gs(numSpecimen); - gs.simulate(); + + int numRounds = 20; + for(int i = 0; i < numRounds; i++){ + gs.simulateRound(i); + } + gs.printWinners(); } int main(int argc, const char * argv[]) {