68 lines
1.3 KiB
C++
68 lines
1.3 KiB
C++
|
|
#include <eoPop.h>
|
|
#include <EO.h>
|
|
#include <eoProportionalSelect.h>
|
|
#include <eoStochasticUniversalSelect.h>
|
|
|
|
class TestEO : public EO<double> { public: unsigned index; };
|
|
|
|
using namespace std;
|
|
|
|
template <class Select>
|
|
int test_select()
|
|
{
|
|
vector<double> probs(4);
|
|
probs[0] = 0.1;
|
|
probs[1] = 0.4;
|
|
probs[2] = 0.2;
|
|
probs[3] = 0.3;
|
|
|
|
vector<double> counts(4,0.0);
|
|
|
|
// setup population
|
|
eoPop<TestEO> pop;
|
|
for (unsigned i = 0; i < probs.size(); ++i)
|
|
{
|
|
pop.push_back( TestEO());
|
|
pop.back().fitness( probs[i] * 2.1232 ); // some number to check scaling
|
|
pop.back().index = i;
|
|
}
|
|
|
|
Select select;
|
|
|
|
unsigned ndraws = 10000;
|
|
|
|
for (unsigned i = 0; i < ndraws; ++i)
|
|
{
|
|
const TestEO& eo = select(pop);
|
|
|
|
counts[eo.index]++;
|
|
}
|
|
|
|
cout << "Threshold = " << 1./sqrt(double(ndraws)) << endl;
|
|
|
|
for (unsigned i = 0; i < 4; ++i)
|
|
{
|
|
cout << counts[i]/ndraws << ' ';
|
|
|
|
double c = counts[i]/ndraws;
|
|
|
|
if (fabs(c - probs[i]) > 1./sqrt((double)ndraws)) {
|
|
cout << "ERROR" << endl;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
cout << endl;
|
|
return 0;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
rng.reseed(44);
|
|
|
|
if (test_select<eoProportionalSelect<TestEO> >()) return 1;
|
|
|
|
return test_select<eoStochasticUniversalSelect<TestEO> >();
|
|
}
|
|
|