void ModNeatExperiment7::createIndividualImage(wxDC &drawContext,shared_ptr<NEAT::GeneticIndividual> individual) { if (lastIndividualSeen!=individual) { screen << "Repopulating substrate\n"; populateSubstrate(individual); lastIndividualSeen = individual; } processEvaluation(individual,&drawContext,userBoardState); }
pair<double,double> CoCheckersExperiment::playGame( shared_ptr<NEAT::GeneticIndividual> ind1, shared_ptr<NEAT::GeneticIndividual> ind2 ) { //You get 1 point just for entering the game, wahooo! pair<double,double> rewards(1.0,1.0); #if DEBUG_GAME_ANNOUNCER cout << "Playing game\n"; #endif populateSubstrate(ind1,0); populateSubstrate(ind2,1); uchar b[8][8]; //cout << "Playing games with HyperNEAT as black\n"; //for (handCodedType=0;handCodedType<5;handCodedType++) for (testCases=0;testCases<2;testCases++) { if (testCases==0) { individualBlack = ind1; individualWhite = ind2; } else //testCases==1 { individualBlack = ind2; individualWhite = ind1; } resetBoard(b); int retval=-1; int rounds=0; for (rounds=0;rounds<CHECKERS_MAX_ROUNDS&&retval==-1;rounds++) { //cout << "Round: " << rounds << endl; moveToMake = CheckersMove(); if (testCases==0) { currentSubstrateIndex=0; } else //testCases==1 { currentSubstrateIndex=1; } //cout << "Black is thinking...\n"; evaluatemax(b,CheckersNEATDatatype(INT_MAX/2),0,2); #if CHECKERS_EXPERIMENT_DEBUG cout << "BLACK MAKING MOVE\n"; printBoard(b); #endif if (moveToMake.from.x==255) { //black loses cout << "BLACK LOSES!\n"; retval = WHITE; } else { makeMove(moveToMake,b); retval = getWinner(b,WHITE); } #if CHECKERS_EXPERIMENT_LOG_EVALUATIONS memcpy(gameLog[rounds*2],b,sizeof(uchar)*8*8); #endif #if COCHECKERS_EXPERIMENT_DEBUG printBoard(b); CREATE_PAUSE(""); #endif if (retval==-1) { //printBoard(b); moveToMake = CheckersMove(); { //progress_timer t; if (testCases==0) { currentSubstrateIndex=1; } else //testCases==1 { currentSubstrateIndex=0; } //cout << "White is thinking...\n"; evaluatemin(b,CheckersNEATDatatype(INT_MAX/2),0,3); //cout << "SimpleCheckers time: "; } #if COCHECKERS_EXPERIMENT_DEBUG cout << "WHITE MAKING MOVE\n"; printBoard(b); #endif if (moveToMake.from.x==255) { //white loses cout << "WHITE LOSES BECAUSE THERE'S NO MOVES LEFT!\n"; retval = BLACK; #if COCHECKERS_EXPERIMENT_DEBUG printBoard(b); CREATE_PAUSE(""); #endif } else { makeMove(moveToMake,b); retval = getWinner(b,BLACK); } #if COCHECKERS_EXPERIMENT_DEBUG printBoard(b); CREATE_PAUSE(""); #endif } #if CHECKERS_EXPERIMENT_LOG_EVALUATIONS memcpy(gameLog[rounds*2+1],b,sizeof(uchar)*8*8); #endif } if (retval==BLACK) { #if DEBUG_GAME_ANNOUNCER cout << "BLACK WON!\n"; #endif if (ind1==individualBlack) { rewards.first += 800; rewards.first += (CHECKERS_MAX_ROUNDS-rounds); } else { rewards.second += 800; rewards.second += (CHECKERS_MAX_ROUNDS-rounds); } } else if (retval==-1) //draw { #if DEBUG_GAME_ANNOUNCER cout << "WE TIED!\n"; #endif //rewards.first += 200; //rewards.second += 200; } else //White wins { #if DEBUG_GAME_ANNOUNCER cout << "WHITE WON\n"; #endif if (ind1==individualWhite) { rewards.first += 800; rewards.first += (CHECKERS_MAX_ROUNDS-rounds); } else { rewards.second += 800; rewards.second += (CHECKERS_MAX_ROUNDS-rounds); } } int whiteMen,blackMen,whiteKings,blackKings; //countPieces(gi.board,whiteMen,blackMen,whiteKings,blackKings); countPieces(b,whiteMen,blackMen,whiteKings,blackKings); if (ind1==individualWhite) { rewards.first += (2 * (whiteMen) ); rewards.first += (3 * (whiteKings) ); rewards.second += (2 * (blackMen) ); rewards.second += (3 * (blackKings) ); } else { rewards.first += (2 * (blackMen) ); rewards.first += (3 * (blackKings) ); rewards.second += (2 * (whiteMen) ); rewards.second += (3 * (whiteKings) ); } } #if DEBUG_GAME_ANNOUNCER cout << "Fitness earned: " << rewards.first << " & " << rewards.second << endl; CREATE_PAUSE(""); #endif return rewards; }