#include #include #include #include template struct trained { unsigned int id; T decider; double monies; unsigned stock; double result; }; template class trainer { std::vector< trained* > trainees; std::function factory; unsigned int id; public: double money; unsigned stock; trainer(double money, unsigned stock, std::size_t n, std::function factory) : factory(factory), id(0), money(money), stock(stock) { add(n); } void add(std::size_t n, std::function factory) { for(std::size_t i = 0; i < n; i++) { trained *trainee = new trained(); trainee->id = ++id; trainee->result = 0.0; trainee->decider = factory(); trainees.push_back(trainee); } } void add(std::size_t n) { add(n, factory); } void test(std::istream& input) { for (auto trainee : trainees) { trainee->monies = money; trainee->stock = stock; trainee->decider.start_money = money; trainee->decider.start_stock = stock; } double price, start; input >> price; start = price*stock + money; do { for (auto trainee : trainees) { auto decision = trainee->decider.decide(price, trainee->monies, trainee->stock); auto current = price*trainee->stock + trainee->monies; auto max_credit = std::max(current * 0.05, -1e4); /* std::cout << "D: " << decision << " C: " << current << " P: " << price << " MC: " << max_credit << std::endl; */ if (decision > 0 && trainee->monies - decision*price < -max_credit) { decision = floor((trainee->monies + max_credit) / price); } if (decision < 0 && -decision > trainee->stock) { decision = -trainee->stock; } trainee->stock += decision; trainee->monies -= price*decision; } } while (input >> price); auto hodl = price * stock + money; std::cout << "Zakonczono testy " << trainees.size() << " przypadkow." << std::endl; std::cout << "HODL: " << hodl << " START: " << start << std::endl; std::cout << "-----------------------" << std::endl; std::sort(trainees.begin(), trainees.end(), [=](trained *a, trained *b){ return (a->monies + a->stock * price) > (b->monies + b->stock * price); }); for (auto trainee : trainees) { auto earned = trainee->monies + trainee->stock * price; std::cout << "#" << trainee->id << ": " << earned << " [" << earned - hodl << "] " << trainee->stock << " akcji, " << trainee->monies << " gelda w banku. " << std::endl; } } };