diff --git a/src/main.cpp b/src/main.cpp index 7a1aeab..c8cae43 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -27,7 +27,8 @@ int main(int argc, char* argv[]) { // ai::v2_alpha_beta p2(false, std::chrono::milliseconds(20000)); // ai::v3_AB_ordering p2(false, std::chrono::milliseconds(20000)); // ai::v4_search_captures p2(false, std::chrono::milliseconds(20000)); - ai::v5_better_endgame p2(false, std::chrono::milliseconds(20000)); + // ai::v5_better_endgame p2(false, std::chrono::milliseconds(20000)); + ai::v6_iterative_deepening p2(false, std::chrono::milliseconds(2000)); GUI gui; // NoOpView gui; diff --git a/src/model/ais/ai.hpp b/src/model/ais/ai.hpp index 881aeb3..753668d 100644 --- a/src/model/ais/ai.hpp +++ b/src/model/ais/ai.hpp @@ -88,5 +88,16 @@ namespace ai { virtual int eval(const Board&) override; }; + + class v6_iterative_deepening : public v5_better_endgame { + // same as v5, but instead of just looking 2 moves ahead, it does + // iterative depening until and keeps on searching until the thinking + // time runs out + + public: + v6_iterative_deepening(bool w, std::chrono::milliseconds tt) + : v5_better_endgame(w, tt) {} + + virtual Move _search(const Board&) override; }; } // namespace ai diff --git a/src/model/ais/v6_iterative_deepening.cpp b/src/model/ais/v6_iterative_deepening.cpp new file mode 100644 index 0000000..899224b --- /dev/null +++ b/src/model/ais/v6_iterative_deepening.cpp @@ -0,0 +1,40 @@ +#include "../pieces/piece.hpp" +#include "../utils/threadpool.hpp" +#include "../utils/utils.hpp" +#include "ai.hpp" + +#include + +Move ai::v6_iterative_deepening::_search(const Board& b) { + ThreadPool pool(std::thread::hardware_concurrency()); + std::vector moves = b.all_legal_moves(); + + Move best_move; + int best_eval = -INFINITY; + + std::map> futures; + for (int depth = 1; !stop_computation; depth++) { + for (const Move& move : moves) { + Board tmp_board = b.make_move(move); + futures.insert( + {move, pool.enqueue([&, tmp_board]() { + return _ab_search(tmp_board, depth, -INFINITY, INFINITY); + })} + ); + } + + int counter = 0; + for (auto& [move, future] : futures) { + int eval = future.get(); + counter++; + if (!am_white) + eval *= -1; + if (eval > best_eval) { + best_eval = eval; + best_move = move; + } + } + futures.clear(); + } + return best_move; +}