#include "../src/NeuronNetwork/FeedForward" #include "../src/NeuronNetwork/Learning/Reinforcement" #include "../src/NeuronNetwork/Learning/OpticalBackPropagation" #include #include class X: public Shin::NeuronNetwork::Problem { public: X(const X& a) :Problem(a) {} X(const std::vector &a):Problem() {data=a;} }; int main() { srand(time(NULL)); for (int test=0;test<3;test++) { Shin::NeuronNetwork::FeedForward q({2,4,1}); Shin::NeuronNetwork::Learning::Reinforcement b(q); //b.setPropagator(new Shin::NeuronNetwork::Learning::OpticalBackPropagation(q)); b.getPropagator().setLearningCoeficient(0.4); //b.getPropagator().allowEntropy(); double targetQuality =2.9; if(test==2) { targetQuality =1.62; std::cerr << "Testing with OBP ...\n"; b.setPropagator(new Shin::NeuronNetwork::Learning::OpticalBackPropagation(q)); b.getPropagator().setLearningCoeficient(0.5); } b.setQualityFunction( [](const Shin::NeuronNetwork::Problem &p,const Shin::NeuronNetwork::Solution &s)->float { float expect=0.0; if(p[0] && p[1]) expect=0; else if(p[0] && !p[1]) expect=1; else if(!p[0] && !p[1]) expect=0; else if(!p[0] && p[1]) expect=1; // std::cerr << "expected: " << expect << " got " << s[0]; if(expect==0) { expect=0.3-abs(s[0]); }else { expect=s[0]-0.7; } // std::cerr << " returnning " << expect*5.0 << "\n"; return expect*19.0; }); std::vector p; p.push_back(new X(std::vector({0,0}))); p.push_back( new X(std::vector({1,0}))); p.push_back( new X(std::vector({0,1}))); p.push_back(new X(std::vector({1,1}))); if(test==1) { std::cerr << "Testing with entropy ...\n"; b.getPropagator().allowNoise(); }else { std::cerr << "Testing without entropy ...\n"; } for(int i=0;i < 500000000;i++) // for(int i=0;i < 5;i++) { double err=b.learnSet(p); if(i%100000==0) srand(time(NULL)); if(i%200000==0 || err > targetQuality) { std::cerr << i << " ("<< err <<").\n"; for(int j=0;j<4;j++) { std::cerr << "\t" << i%4 <<". FOR: [" << p[j%4]->operator[](0) << "," <operator[](1) << "] res: " << q.solve(*p[j%4])[0] << "\n"; } } if(err >targetQuality) break; } } }