diff --git a/optimizer/box-eater.cpp b/optimizer/box-eater.cpp index 40c8bb7..fd7392e 100644 --- a/optimizer/box-eater.cpp +++ b/optimizer/box-eater.cpp @@ -11,8 +11,10 @@ std::mt19937 rng(std::random_device{}()); __builtin_unreachable(); \ } while (false); \ -const int species_limit = 8; +const int species_limit = 16; const int population_limit = 10; +const int protect_age = 30; +const int stable_limit = 10; const int SPECIES_NAME_LEN = 4; struct Gene { @@ -207,19 +209,19 @@ inline Species mutation(const Species &sc) { res.tactic = tactic; switch (tactic) { case 0: - mutationRandomHole(res, sc.population[0], 60); + mutationRandomHole(res, sc.population[0], 80); break; case 1: - mutationRowCl(res, sc.population[0], 2); + mutationRowCl(res, sc.population[0], 3); break; case 2: - mutationColCl(res, sc.population[0], 2); + mutationColCl(res, sc.population[0], 3); break; case 3: - mutationSqrCl(res, sc.population[0], 3); + mutationSqrCl(res, sc.population[0], 5); break; case 4: - mutationSqrCl(res, sc.population[0], 5); + mutationSqrCl(res, sc.population[0], 7); break; } } while (res.empty()); @@ -289,6 +291,20 @@ inline void inherit(Species &s) { s.population.resize(population_limit); } +namespace term { + +inline void clear() +{ + printf("\033[2J\033[0;0H"); +} + +inline void setColor(int color) +{ + printf("\033[%dm", color); +} + +} + int main() { std::vector biosphere; int history_best_w; @@ -298,6 +314,7 @@ int main() { std::fclose(frecord); std::uniform_real_distribution d01(0, 1); + int new_record_counter = 0; for (int iter_id = 1; ; ++iter_id) { int best_w = 0; @@ -310,10 +327,10 @@ int main() { std::vector Hnxt, Lnxt; for (auto &s : biosphere) { - if (s.stable_age <= std::max(5, 15 * s.best_w / best_w) + if (s.stable_age < std::max(3, stable_limit * s.best_w / best_w) || s.best_w == best_w) { - if (s.best_w < best_w || s.age <= 35) + if (s.best_w < best_w || s.age < protect_age) Hnxt.push_back(std::move(s)); else Lnxt.push_back(std::move(s)); @@ -343,20 +360,39 @@ int main() { bool broke_record = best_w > history_best_w; if (broke_record) { history_best_w = best_w; - printf("New Record: %d!\n", best_w); + new_record_counter = 5; std::FILE *f = fopen("best.txt", "w"); writeBiosphere(biosphere, best_w, f); fclose(f); } if (true) { + term::clear(); printf("Iterated for %d times.\n", iter_id); printf("Current Best=%d, History Best=%d, Species:\n", best_w, history_best_w); for (auto &s : biosphere) { - printf(" - %s[%d]: best=%d stable=%d age=%d.\n", s.name + if (s.best_w == best_w) + term::setColor(35); // purple + else if (s.stable_age > 5) + term::setColor(31); // red + else if (s.age <= 2) + term::setColor(34); // blue + else if (s.best_w >= best_w * 95 / 100) + term::setColor(32); // green + + printf(" - %s[%d]: best=%d\tstable=%d\tage=%d.\n", s.name , s.tactic, s.best_w, s.stable_age, s.age); + term::setColor(0); } + if (new_record_counter > 0) { + term::setColor(32); + printf("New Record: %d\n", best_w); + term::setColor(0); + new_record_counter -= 1; + } + fflush(stdout); + std::FILE *f = fopen("current.txt", "w"); writeBiosphere(biosphere, best_w, f); fclose(f);