#include #include #include #include int MAXSTATES = 5; int MAXMOVES = 100; double MPROB=0.5; int ITERATIONS=100; const int POP=50; int grid[40][11]; void fillgrid() { int i,j; for(i=0;i<40;i++) for(j=0;j<11;j++) grid[i][j]=0; grid[0][5]=1; grid[1][5]=1; grid[2][5]=1; grid[3][6]=1; grid[4][6]=1; grid[5][5]=1; grid[6][5]=1; grid[7][4]=1; grid[8][4]=1; grid[9 ][3]=1; grid[10][2]=1; grid[11][2]=1; grid[12][2]=1; grid[13][3]=1; grid[14][4]=1; grid[15][4]=1; grid[16][4]=1; grid[17][5]=1; grid[18][6]=1; grid[19][6]=1; grid[20][7]=1; grid[21][7]=1; grid[22][6]=1; grid[23][6]=1; grid[24][7]=1; grid[25][7]=1; grid[26][7]=1; grid[27][8]=1; grid[28][7]=1; grid[29][7]=1; grid[30][6]=1; grid[31][5]=1; grid[32][5]=1; grid[33][4]=1; grid[34][4]=1; grid[35][5]=1; grid[36][6]=1; grid[37][6]=1; grid[38][7]=1; grid[39][6]=1; } struct trans { int output[3]; int state[3]; }; class ant { public: vector fsm; int n; int initstate; int currentstate; int fitness; char dir; int x,y; int moves; int com; void copy(ant s) { n=s.n; initstate=s.initstate; int i,j; fsm.erase(fsm.begin(),fsm.end()); for(i=0;i10 || y<0) // die return -1; if(y==40) return 1; // __ Completed moves++; if(moves==MAXMOVES) // ___to many moves return 2; } } void mutate(ant* array[2][POP],int turn) { double mp=((double)random())/RAND_MAX; int i=random()%POP; copy(*array[turn][i]); if(mp<=MPROB) { //cout << "\nMut" << flush; i=random()%5; if(i==0) //cout << "changeo" << flush changeo(); if(i==1) //cout << "changes" << flush, changes(); if(i==2 && n1) //__Must have at least 1 state ! //cout << "deletes" << flush , deletes(); if(i==4) //cout << "changeis" << flush, changeis(); } } }; ant* ants[2][POP]; ant run(int& av) { int turn=0; int i,j,k; ant fittest(4); for(j=0;jcom=1; int d=ants[turn][i]->move(); // if(i==0) // cout << "\nrvalue : " << d; if(ants[turn][i]->fitness>mf) { mf=ants[turn][i]->fitness; fittest=*ants[turn][i]; } av+=ants[turn][i]->fitness; } av/=POP; //___Generate next generation int turn1=(turn+1)%2; // cout << "\nmutating" << flush; for(i=0;imutate(ants,turn); //cout << "\nfinished mutating" << flush; int rv=random()%POP; ants[turn1][rv]->copy(fittest); //cout << "\nassigned fittest" << flush; turn=turn1; } // fittest.com=1; // fittest.move(); return fittest; } void main() { srandom(time(NULL)); ant fittest(4); int i,j; for(int i=0;i