MNP01/trainer.h
2018-03-11 12:48:48 +01:00

100 lines
2.9 KiB
C++

#include <vector>
#include <functional>
#include <iostream>
#include <algorithm>
template<class T>
struct trained {
unsigned int id;
T decider;
double monies;
unsigned stock;
double result;
};
template <class T>
class trainer {
std::vector< trained<T>* > trainees;
std::function<T()> factory;
unsigned int id;
public:
double money;
unsigned stock;
trainer(double money, unsigned stock, std::size_t n, std::function<T()> factory)
: factory(factory), id(0), money(money), stock(stock)
{
add(n);
}
void add(std::size_t n, std::function<T()> factory)
{
for(std::size_t i = 0; i < n; i++) {
trained<T> *trainee = new trained<T>();
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<T> *a, trained<T> *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;
}
}
};