⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 queue2.cc

📁 标准的GP源代码,由Andy Singleton维护
💻 CC
📖 第 1 页 / 共 3 页
字号:
				    }				break;			}//end switch	      }	calls [ tree ]--;	Arg1   = save_arg1;	Arg2   = save_arg2;	last_var_used = save_var_used;	return result;}//end callevalOPDEF(MakenullEval) {return calleval (0,makenull);}OPDEF(FrontEval)    {return calleval (0,front);}OPDEF(DequeueEval)  {return calleval (0,dequeue);}OPDEF(EnqueueEval)  {return calleval (1,enqueue);}OPDEF(EmptyEval)    {return calleval (0,empty);}OPDEF(Adf1Eval)     {return calleval (1,adf1,&adf1_cache);}OPDEF(Adf2Eval)     {return calleval (2,adf2);}//**************************************************************************///////////////////////// PROBLEM definitionvoid queue::AddF1 (int t, Function* f ){AddF(f);addtofuncbag(t, f);}void queue::AddFbar1 (int exclude_tree, Function* f ){AddF(f);for ( int i = 0; i < NUM_TREES; i++ )	{if ( i != exclude_tree) addtofuncbag(i, f);};}void queue::AddF2 (int t1, int t2, Function* f ){AddF(f);addtofuncbag(t1, f);addtofuncbag(t2, f);}void queue::AddF3 (int t1, int t2, int t3, Function* f ){AddF(f);addtofuncbag(t1, f);addtofuncbag(t2, f);addtofuncbag(t3, f);}void queue::AddFmain (Function* f ){AddFbar1(adf1, f);}void queue::AddFall (Function* f ){AddFmain(f);addtofuncbag(adf1, f);}queue::queue(ChromeParams* p) : Problem(){	assert ( NUM_TREES >= adf1+1);	AddF(new ConstFunc(0));    // REQUIRED as function 0	// Add some standard primitives	AddFall(new AddFunc(100));	AddFall(new SubFunc(100));	AddFall(new Function(2,0,100,Prog2Eval,"PROG2"));//	AddFall(new Function(3,0,100,Prog3Eval,"PROG3"));	AddFall(new Function(2,0,100,Qrog2Eval,"QROG2"));//	AddFall(new Function(3,0,100,Qrog3Eval,"QROG3"));	// Add the problem specific primitives	AddFall(new Function(0,0,100,zeroEval,"0"));	AddFall(new Function(0,0,100,oneEval,"1"));	AddFall(new Function(0,0,100,MaxEval,"max"));	AddFall(new Function(2,0,100,modEval,"mod"));	AddF2(enqueue, adf1, new Function(0,0,100,Arg1Eval,"arg1"));//	AddFx(new Function(0,0,100,Arg2Eval,"arg2"));	AddFmain(new Function(0,0,100,Aux1Eval,"aux1"));//	AddF3(makenull, dequeue, enqueue,//              new Function(0,0,100,inc_Aux1Eval,"Inc_Aux1"));//	AddF3(makenull, dequeue, enqueue,//              new Function(0,0,100,Minc_Aux1Eval,"MInc1"));//	AddFmain(new Function(0,0,100,dec_Aux1Eval,"Dec_Aux1"));	AddFmain(new Function(0,0,100,Aux2Eval,"aux2"));//	AddF3(makenull, dequeue, enqueue,//              new Function(0,0,100,inc_Aux2Eval,"Inc_Aux2"));//	AddF3(makenull, dequeue, enqueue,//              new Function(0,0,100,Minc_Aux2Eval,"MInc2"));//	AddFmain(new Function(0,0,100,dec_Aux2Eval,"Dec_Aux2"));//	AddFmain(new Function(0,0,100,Aux3Eval,"aux3"));//	AddF3(makenull, dequeue, enqueue,//              new Function(0,0,100,inc_Aux3Eval,"Inc_Aux3"));//	AddF3(makenull, dequeue, enqueue,//              new Function(0,0,100,Minc_Aux3Eval,"MInc3"));//	AddF3(makenull, dequeue, enqueue,//              new Function(0,0,100,dec_Aux3Eval,"Dec_Aux3"));	AddFmain(new Function(1,0,100,readEval,"read"));	AddF3(makenull, dequeue, enqueue,              new Function(2,0,100,writeEval,"write"));//	AddFx(new Function(1,0,100,write_Aux1Eval,"Write_Aux1"));//	AddFx(new Function(1,0,100,write_Aux2Eval,"Write_Aux2"));	AddF1(makenull, new Function(1,0,100,set_Aux1Eval,"Set_Aux1"));	AddF1(makenull, new Function(1,0,100,set_Aux2Eval,"Set_Aux2"));//	AddF1(makenull, new Function(1,0,100,set_Aux3Eval,"Set_Aux3"));//	AddF(new Function(0,0,100,MakenullEval,"Makenull"));	AddF1(dequeue,new Function(0,0,100,FrontEval,"Front"));//	AddF(new Function(0,0,100,DequeueEval,"Dequeue"));//	AddF(new Function(1,0,100,EnqueueEval,"Enqueue"));//	AddF(new Function(0,0,100,EmptyEval,"Empty"));	AddF2(dequeue, enqueue, new Function(1,0,100,Adf1Eval,"Adf1"));//	AddF(new Function(2,0,100,Adf2Eval,"Adf2"));	// Set some defualt parameters	p->params[pMaxExpr]=250;	// Nb hold NUM_TREES trees	p->params[pRepeatEval]=0;	// Dont test again if copy chrome	p->params[pMuteShrinkWt]=0;	// No shrink mutation	p->params[pMuteWt]=0;	        // No muation	p->params[pCrossWt]=90;         // Use Koza value	p->params[pMuteRate]=0;         // No mutations	p->params[pAnnealCrossWt]=0;	// No annealing	p->params[pAnnealMuteWt]=0;	p->params[pTournSize]=4;	// try and see	p->params[pKillTourn]=4;	// try and see	p->params[pMateRadius]=0;	// whole population	p->params[pMaxAge]=0;     	// no age limit//	p->params[pFitnessCases]=;	// ?	p->params[pPopSize]=1000;	// Population size	p->params[pPopSize]=50000;	// Max number individuals to generate	ifstream gpParams ("gp.ini");	if ( gpParams )	     { p->Load(gpParams);	       gpParams.close();             }	else 		cerr << "Could not open gp.ini, using defaults\n";	// If you need to load problem specific data for evaluation	// Or load an environment (a map, a scenario)	// Do it here}//store for test casesint first_test = 0;const int first_test_sequence = 1;int test[Max_tests];retval argument[Max_tests];retval ans[Max_tests];int fron, rear;retval correct_queue [test_queue_limit+1];int addone(int i) {return (i + 1 )% test_queue_limit;}BOOL set_answer (int i){ans [i] = 0;argument [i] = 0;switch(test[i]){ case makenull:	fron = 0;	rear = test_queue_limit - 1;	break; case front:	if (addone(rear) == fron )		return FALSE; //force new tested to be selected	else		ans [i] = correct_queue [fron];	break; case enqueue:	if (addone(addone(rear))==fron)		return FALSE; //force new tested to be selected	else	       {       argument [i] = int(5*tan(float(rnd(3141))/1000.0));		       rear = addone(rear);		       correct_queue [rear] = argument [i];	       }	break; case dequeue:	if (addone(rear) == fron)	       return FALSE; //force new tested to be selected	else	       ans [i] = correct_queue [fron];	       fron = addone(fron);	break; case empty:	ans [i] = (addone(rear)==fron);	break; default:	return FALSE; //force new tested to be selected	break;}//end casereturn TRUE;}//end set_answer()int tests_run = 0;float tests_avg_passed[Max_tests];int test_total = 0;int test_cases [empty+1] = {0, 0, 0, 0, 0};int test_by_length [empty+1][test_queue_limit+2];int test_Qlength [Max_tests];float score ( int m, int f, int d, int eq, int em ){ return m  * makenull_score +	 f  * ( sign_score + magnitude_score ) +	 d  * ( sign_score + magnitude_score ) +         eq * enqueue_score +         em * empty_score;}//end scorevoid	generate_tests(){int i = 0;cout << "Generating test data\n";memset(tests_avg_passed,0,sizeof(tests_avg_passed));memset(test_by_length,0,sizeof(test_by_length));//enum{makenull,front,dequeue,enqueue,empty,adf1,adf2,start_test,end_tests};const int test_seq_length [Num_test_seq]         =	                                       { 40,                                                 40,                                                 40,						 40,						160};const int probablities [Num_test_seq][(empty+1)] =	                                       {  1, 20, 34, 25, 20,                                                 30, 10, 10, 40, 10,                                                 10, 10, 20, 30, 30,                                                 10, 40, 20, 20, 10,                                                  0, 11, 18, 68,  3 };//rescald#define ptotal 100#define test_five 4for (int j = 0; j < Last_test_seq; j++ ){test[i++] = start_test;int old_length = test_queue_limit + 1; //ie not set yetfor (int k=0; k<test_seq_length[j]; k++)	{assert ( i < Max_tests );//better than segmention fault	BOOL try_again;	do {    try_again = FALSE;		test[i] = makenull;		if (k != 0) 		  {       			  int r = rnd(ptotal);			  for ( int m = makenull; m <= empty; m++)				  if (r < probablities [j][m])				   {				     if( (j==test_five)                     &&                                         (m==enqueue)                       &&                                          (old_length!=test_queue_limit + 1) &&                                          (r>=((probablities [j][m] *                        (test_queue_limit-1-old_length))/(test_queue_limit-1)))					)					try_again = TRUE;				     else 					test [i] = m;				     break;				   }				  else 					  r -= probablities [j][m];		  }	   } while (try_again==TRUE || set_answer(i)==FALSE);	test_total++;	test_cases [test[i]]++;	test_by_length [test[i]][old_length]++;	test_Qlength [i] = old_length++;	old_length = (rear+1+test_queue_limit-fron) % test_queue_limit;       	i++;	}//endloop k}//endloop jtest[i++] = end_tests;max_fitness = score (	      test_cases [ makenull ],	      test_cases [ front ],	      test_cases [ dequeue ],              test_cases [ enqueue ],              test_cases [ empty ]    ) - 	      1.0/10000.0; //protect against rounding errors}//end generate_tests()void write_Qlength(ostream& fout, int k){if ( k <= test_queue_limit ) fout << k << "\t\t";else                         fout << "undefined\t";}      void write_tests ( ostream& fout = cout ){fout<<"\ntest cases\n";fout << "sign_score\t" << sign_score<< "  magnitude_score\t" << magnitude_score<< "  empty_score\t" << empty_score<< "\nmakenull_score\t" << makenull_score<< "  dequeue_score as front"<< "  enqueue_score\t" << enqueue_score<< "\nmem_penalty\t" << mem_penalty<< "  per word, if more than " << mem_penalty_bot<< " words are used" << endl;int skip = 0;{for (int i = first_test; test[i] != end_tests; i++)   {  if ( test [i] == start_test )	      { skip++;		if ( skip < first_test_sequence )			{ for(i++;test[i] < start_test; i++); i--;}		if ( skip == first_test_sequence )			{ first_test = i; }		fout << "\nstart_test\n";	      }      else	     {	      fout<< i <<"\t";	      ThisProblem->WriteTreeName(test[i], fout);	      fout<< "(" << argument[i] << ")  \t" << ans[i];	      fout<< "\t" << tests_avg_passed[i] << "\t";	      write_Qlength(fout,test_Qlength[i]); fout<<endl;             }   }}fout<< "\nRan " << tests_run << " fitness evaluations\n";{for ( int j = 0; j <= empty; j++ )	{	ThisProblem->WriteTreeName(j, fout);	fout<<" tested " << test_cases [ j ] << " times";        if ((j == dequeue ) || ( j == empty ))		fout<<endl;        else		fout<<", ";        }}fout << "\nQueue length";{for ( int j = 0; j <= empty; j++ ){fout << "\t"; ThisProblem->WriteTreeName(j, fout);}}fout << "\tscore" << endl;{for ( int k = 0; k <= test_queue_limit + 1 ; k++ ){       write_Qlength(fout,k);	for ( int j = 0; j <= empty; j++ )		{ fout << test_by_length [ j ][ k ] << "\t"; }	fout << score (	      test_by_length [ makenull ] [ k ],	      test_by_length [ front    ] [ k ],	      test_by_length [ dequeue  ] [ k ],              test_by_length [ enqueue  ] [ k ],              test_by_length [ empty    ] [ k ]    ) << endl;}}fout << endl;}//end write_tests()void queue::WriteTreeName(int tree, ostream& ostr){switch(tree)	 {	 case makenull: ostr<< "makenul"; break;	 case front:    ostr<< "front"; break;	 case enqueue:  ostr<< "enqueue"; break;	 case dequeue:  ostr<< "dequeue"; break;	 case empty:    ostr<< "empty"; break;	 case adf1:     ostr<< "adf1"; break;	 case adf2:     ostr<< "adf2"; break;	 default:       ostr<< "ERROR322"; break;	 }}//end queue::WriteTreeName()BOOL queue::TreeNameMatch(int tree, char* s){switch(tree)	 {	 case makenull: return strcmp("makenul", s);	 case front:    return strcmp("front",   s);	 case dequeue:  return strcmp("dequeue", s);	 case enqueue:  return strcmp("enqueue", s);	 case empty:    return strcmp("empty",   s);	 case adf1:     return strcmp("adf1",    s);	 case adf2:     return strcmp("adf2",    s); 	 default:       return FALSE;	 }}//end queue::TreeNameMatch()BOOL update_score(float& score,		  int test_done, int actual_answer, int required_ans ){//return TRUE => test passed.switch(test_done){ case makenull:	score += makenull_score;	return TRUE; case front: case dequeue:	if ( actual_answer == required_ans )	      { score += magnitude_score;		return TRUE;	      }	else		return FALSE;	break; case enqueue:	score += enqueue_score;	return TRUE;	break; case empty:	if ( (actual_answer==0) == required_ans )	      { score += empty_score;		return TRUE;	      }	else		return FALSE;	break; default:	assert (0==1);   //catch internal error and terminate gp run        break;}//end casereturn FALSE;            //not used but keeps compiler happy}//end update_score()void display_run (Chrome* chrome, ostream& fout = cout )// fitness function.{int i;int passed = 0;float score = 0.0;memset(store_written,0,sizeof(store_written));adf1_cache.init();chrome->SetupEval();for(i=first_test; test[i] != end_tests; i++){if (test[i] == start_test)	 {	 fout<<"\nInitialise everything for new test\n";	 memory_error = FALSE;	 recurse_error = FALSE;	 Aux1 = 0;	 Aux2 = 0;	 Aux3 = 0;	 memset(store,0,sizeof(store));        }else	{retval answer;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -