-
Notifications
You must be signed in to change notification settings - Fork 0
/
Experiment.cpp
120 lines (89 loc) · 2.45 KB
/
Experiment.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#ifndef EXPERIMENT
#define EXPERIMENT
#include "FitnessFunctions.hpp"
#include "PoleBalancing.hpp"
#include "DoublePole.hpp"
#include "PPC.hpp"
#include "Rand.hpp"
#include "Experiment.hpp"
#include "Individual.hpp"
#include "Model.hpp"
#include "DataCollector.hpp"
#include <iostream>
#include <fstream>
#include <string.h>
#include <cstdlib>
#include <cmath>
#include <string>
#include <sstream>
CfgFile* Experiment::config = NULL;
void Experiment::set_config( CfgFile& cfg )
{
config = &cfg;
}
Experiment::Experiment()
{
if( config == NULL )
DataCollector::debug << "Experiment::config is NULL." << endline;
}
Experiment::~Experiment()
{
}
void Experiment::run( DataCollector& dc, RandomNumberGenerator& rng )
{
// INITIALIZE
double prob_learning_type; // ELITE or BEST OF GENERATION
int i;
for( int run = 0; run < config->number_of_runs; run++ )
{
std::cout << "" << (run+1) << ",";
std::cout.flush();
dc.start_new_run( run );
prob_learning_type = 1.;
dc.run << "Run seed = " << rng.getCurrentSeed() << endline;
//INITIALIZE THE MODEL
Model model;
model.set_data_collector( dc );
// RUN FOR N GENERATIONS
for( i = 0; i < config->number_of_generations; i++ )
{
//std::cout << (run+1) << "." << i << "," << std::flush;
// ELITIST LEARNING
if( config->structural_learning == PIPE
&& prob_learning_type < config->pipe_prob_elitist_learn )
{
model.is_elitist_learning = true;
model.adapt( model.get_elite() );
}
else
{
// BEST OF LEARNING
// GENERATION BASED LEARNING
model.sample( rng );
if( config->fitness_test == RETINA_SWITCHING
&& ( i % config->retina_switch_after ) == 0
&& i != 0 )
retina_test_switch();
// MEASURE FITNESS + INDEX BEST and ELITE
model.measure_fitness( dc.run );
// ADAPT PPC TOWARD BEST
model.adapt( model.get_best() );
}
// MUTATE
model.mutate( rng );
prob_learning_type = rng.getRandom();
dc.log_generation( run, i, model );
dc.flush_debug();
if( ( model.stop_condition_met() && config->stop_on_target_reached )
|| ( i + 1 ) == config->number_of_generations )
{
dc.log_run( run, i, model );
break;
}
}
// RANDOM FITNESS TEST (to confirm findings)
dc.log_random_fitness( model );
}
dc.log_experiment();
}
#endif