bool GACPforORGSolverGene::mutation( ) { //1. add two new chromosomes to Gene or delete two chromosomes if accessible switch( GAConjProblemForORGroupSolver::roulette( 1 , 1 ) ) { case 0: { bool deg = ( GAConjProblemForORGroupSolver::rnd1( 2 )==0); //insert random chromosome in gene { GACPforORGSolverChromosome *chr = randomChromosome( deg ); int pos = GAConjProblemForORGroupSolver::rnd1( theWord2.length( ) ); addChr( chr , pos , GAConjProblemForORGroupSolver::rnd1( lengthes[pos] ) ); } fit = -1; if( exp==ANY ) return true; //insert second random chromosome (with other degree) in gene { GACPforORGSolverChromosome *chr = randomChromosome( !deg ); int pos = GAConjProblemForORGroupSolver::rnd1( theWord2.length( ) ); addChr( chr , pos , GAConjProblemForORGroupSolver::rnd1( lengthes[pos] ) ); } } break; // Delete chromosome from gene case 1 : { unsigned pos, pos2; unsigned d1=0, d2=0; for( pos=0 ; pos<theWord2.length() ; ++pos ) for( pos2=0 ; pos2<lengthes[pos] ; ++pos2 ) if( chromosomes[pos][pos2]->getDeg( ) ) ++d1; else ++d2; if( exp==ANY ) { //delete chromosome of any degree if( d1+d2==0 ) return false; findPos( ALL , GAConjProblemForORGroupSolver::rnd1(d1+d2) , pos , pos2 ); delChr( pos , pos2 ); } else { if( d1==0 || d2==0 ) return false; findPos( POSITIVE , GAConjProblemForORGroupSolver::rnd1(d1) , pos , pos2 ); delChr( pos , pos2 ); findPos( NEGATIVE , GAConjProblemForORGroupSolver::rnd1(d2) , pos , pos2 ); delChr( pos , pos2 ); } fit = -1; } break; } return true; }
std::vector<Chromosome> newVector(std::vector<Chromosome>& v, int size, int length) { for (int i = 0; i<size; ++i) { v.push_back(randomChromosome(length)); } return v; }
void GACPforORGSolverGene::check( ) { // add chromosomes if (exp != curExp) // such gene isn't accessible if( curExp!=exp && exp!=ANY && exp!=NOONE ) { for( int i=0 ; i<abs(exp-curExp) ; ++i) { GACPforORGSolverChromosome* chr = randomChromosome( exp<curExp ); int pos = GAConjProblemForORGroupSolver::rnd1( theWord2.length( ) ); if( lengthes[pos]==sizes[pos] ) resize( pos , sizes[pos]+jumpSize ); chromosomes[pos][lengthes[pos]++] = chr; nChr++; } curExp = exp; fit = -1; return; } }
Robot::Robot() { //create a random chromosome and send it to init init(randomChromosome()); }