record iteration time

Signed-off-by: szdytom <szdytom@qq.com>
This commit is contained in:
方而静 2024-01-19 19:45:34 +08:00
parent 7d6bd6f085
commit 0c0f25a566

View File

@ -3,13 +3,13 @@
#include "pushbox.h" #include "pushbox.h"
#include "box-solver.h" #include "box-solver.h"
std::mt19937 rng(std::random_device{}());
#define compiler_assume(condition) \ #define compiler_assume(condition) \
do { \ do { \
if (!(condition)) \ if (!(condition)) \
__builtin_unreachable(); \ __builtin_unreachable(); \
} while (false); \ } while (false);
using i64 = long long;
const int species_limit = 16; const int species_limit = 16;
const int population_limit = 10; const int population_limit = 10;
@ -17,6 +17,8 @@ const int protect_age = 30;
const int stable_limit = 10; const int stable_limit = 10;
const int SPECIES_NAME_LEN = 4; const int SPECIES_NAME_LEN = 4;
std::mt19937 rng(std::random_device{}());
struct Gene { struct Gene {
Maze m; Maze m;
int w; int w;
@ -82,17 +84,17 @@ inline Species loadSpecies(std::FILE *f) {
return res; return res;
} }
inline void loadBiosphere(std::vector<Species> &species, int &best_w, std::FILE *f) { inline void loadBiosphere(std::vector<Species> &species, int &best_w, int &iter_n, i64 &tc, std::FILE *f) {
int n; int n;
std::fscanf(f, "%d %d", &n, &best_w); std::fscanf(f, "%d %d %d %lld", &n, &best_w, &iter_n, &tc);
species.reserve(n); species.reserve(n);
for (int i = 0; i < n; ++i) for (int i = 0; i < n; ++i)
species.push_back(loadSpecies(f)); species.push_back(loadSpecies(f));
} }
inline void writeBiosphere(const std::vector<Species> &species, int &best_w, std::FILE *f) { inline void writeBiosphere(const std::vector<Species> &species, int best_w, int iter_n, i64 tc, std::FILE *f) {
int n = species.size(); int n = species.size();
std::fprintf(f, "%d %d\n", n, best_w); std::fprintf(f, "%d %d %d %lld\n", n, best_w, iter_n, tc);
for (int i = 0; i < n; ++i) for (int i = 0; i < n; ++i)
writeSpecies(species[i], f); writeSpecies(species[i], f);
} }
@ -307,30 +309,32 @@ inline void setColor(int color)
int main() { int main() {
std::vector<Species> biosphere; std::vector<Species> biosphere;
int history_best_w; int history_best_w, iter_start;
i64 time_cost_old = 0;
auto frecord = std::fopen("current.txt", "r"); auto frecord = std::fopen("current.txt", "r");
loadBiosphere(biosphere, history_best_w, frecord); loadBiosphere(biosphere, history_best_w, iter_start, time_cost_old, frecord);
std::fclose(frecord); std::fclose(frecord);
std::chrono::milliseconds time_cost(time_cost_old);
std::uniform_real_distribution<float> d01(0, 1); std::uniform_real_distribution<float> d01(0, 1);
int new_record_counter = 0; int new_record_counter = 0;
for (int iter_id = 1; ; ++iter_id) { for (int iter_id = iter_start + 1; ; ++iter_id) {
auto iter_st = std::chrono::steady_clock::now();
int best_w = 0; int best_w = 0;
# pragma omp parallel for num_threads(8) # pragma omp parallel for num_threads(8)
for (auto &s : biosphere) for (auto &s : biosphere)
inherit(s); inherit(s);
for (auto &s : biosphere) for (auto &s : biosphere)
best_w = std::max(best_w, s.best_w); best_w = std::max(best_w, s.best_w);
std::vector<Species> Hnxt, Lnxt; std::vector<Species> Hnxt, Lnxt;
for (auto &s : biosphere) { for (auto &s : biosphere) {
if (s.stable_age < std::max(3, stable_limit * s.best_w / best_w) const int sl = std::max(3, stable_limit * s.best_w / best_w);
|| s.best_w == best_w) if (s.stable_age < sl || s.best_w == best_w) {
{ if (s.best_w < best_w || s.age < protect_age || s.stable_age < sl)
if (s.best_w < best_w || s.age < protect_age)
Hnxt.push_back(std::move(s)); Hnxt.push_back(std::move(s));
else else
Lnxt.push_back(std::move(s)); Lnxt.push_back(std::move(s));
@ -338,6 +342,7 @@ int main() {
} }
biosphere.clear(); biosphere.clear();
if (Lnxt.size()) { if (Lnxt.size()) {
shuffle(Lnxt.begin(), Lnxt.end(), rng);
biosphere.push_back(std::move(*std::max_element(Lnxt.begin(), Lnxt.end()))); biosphere.push_back(std::move(*std::max_element(Lnxt.begin(), Lnxt.end())));
} }
@ -357,28 +362,35 @@ int main() {
for (auto &s : biosphere) for (auto &s : biosphere)
s.tick(); s.tick();
auto iter_ed = std::chrono::steady_clock::now();
time_cost += std::chrono::duration_cast<std::chrono::milliseconds>(iter_ed - iter_st);
bool broke_record = best_w > history_best_w; bool broke_record = best_w > history_best_w;
if (broke_record) { if (broke_record) {
history_best_w = best_w; history_best_w = best_w;
new_record_counter = 5; new_record_counter = 5;
std::FILE *f = fopen("best.txt", "w"); std::FILE *f = fopen("best.txt", "w");
writeBiosphere(biosphere, best_w, f); writeBiosphere(biosphere, best_w, iter_id, time_cost.count(), f);
fclose(f); std::freopen("log.txt", "a", f);
std::fprintf(f, "[%lldms] [%d]: %d\n", (i64)time_cost.count(), iter_id, best_w);
std::fclose(f);
} }
if (true) { if (true) {
term::clear(); term::clear();
printf("Iterated for %d times.\n", iter_id); i64 tc_val = time_cost.count() / 1000;
auto tc_hr = tc_val / 3600, tc_min = (tc_val / 60) % 60, tc_sec = tc_val % 60;
printf("Iterated for %d times in %lld hour(s), %lld minute(s), %lld second(s).\n"
, iter_id, tc_hr, tc_min, tc_sec);
printf("Current Best=%d, History Best=%d, Species:\n", best_w, history_best_w); printf("Current Best=%d, History Best=%d, Species:\n", best_w, history_best_w);
for (auto &s : biosphere) { for (auto &s : biosphere) {
if (s.best_w == best_w) if (s.best_w == best_w)
term::setColor(35); // purple term::setColor(35); // purple
else if (s.stable_age > 5) else if (s.stable_age > 5)
term::setColor(31); // red term::setColor(31); // red
else if (s.age <= 2)
term::setColor(34); // blue
else if (s.best_w >= best_w * 95 / 100) else if (s.best_w >= best_w * 95 / 100)
term::setColor(32); // green term::setColor(32); // green
else if (s.stable_age == 1)
term::setColor(34); // blue
printf(" - %s[%d]: best=%d\tstable=%d\tage=%d.\n", s.name printf(" - %s[%d]: best=%d\tstable=%d\tage=%d.\n", s.name
, s.tactic, s.best_w, s.stable_age, s.age); , s.tactic, s.best_w, s.stable_age, s.age);
@ -394,7 +406,7 @@ int main() {
fflush(stdout); fflush(stdout);
std::FILE *f = fopen("current.txt", "w"); std::FILE *f = fopen("current.txt", "w");
writeBiosphere(biosphere, best_w, f); writeBiosphere(biosphere, best_w, iter_id, time_cost.count(), f);
fclose(f); fclose(f);
} }
} }