#ifndef HATPUZZLE_H #define HATPUZZLE_H #include #include #include using namespace std; typedef enum Guess_enum { GuessBlue = 0, GuessRed = 1, GuessNone } Guess; ostream& operator<< (ostream& o, Guess g) { if (g == GuessNone) { return (o << 'N'); } else if (g == GuessBlue) { return (o << 'B'); } else if (g == GuessRed) { return (o << 'R'); } else { return (o << '?'); } } ostream& operator<< (ostream& o, const vector& g) { for (vector::const_iterator it = g.begin(); it != g.end(); ++it) { o << *it; } return o; } struct LessRight { bool operator() (const pair, double>& lhs, const pair, double>& rhs) { if (lhs.second > rhs.second) { return true; } else if (lhs.second < rhs.second) { return false; } return lhs.first < rhs.first; } }; int getHatConfigBit(int hatConfig, int n, int i); int curViewFromHatConfig(int hatConfig, int n, int cur); void strategyGuesses(const vector& strategy, int n, int hatConfig, vector& guesses); double scoreStrategy(const vector& strategy, int n); vector breedParents(const vector& strat1, const vector& strat2, double mutationProb); void mutateStrategy(vector& strategy, double mutationProb); vector selectWeightedStrategy(const vector, double> >&generation, double totalScore, const vector& preCalc); vector preCalculateWeightedStrategy(const vector, double> >&generation, double totalScore); void breedGeneration(vector, double> >& generation, int n, double mutationProb); Guess guessFromChar(const char& ch); vector strategyFromString(const string& strategy); void setFirstStrategy(vector& strategy, int n); bool incrementStrategy(vector& strategy, int n); vector findBestStrategyExhaustive(int n); vector findBestStrategyRandom(int n, int numIter); vector findBestStrategyHillClimbRestart(int n, int numIter, int steps); vector findBestStrategyGenetic(int n, int numIter, int generationSize, double mutationProb); int getStrategySize(int n); void runTests(); template void assert(T expected, U actual, const string& message); void assert(bool b, const string& message); #endif // HATPUZZLE_H