예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
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;
  }
}
예제 #4
0
Robot::Robot() {
    //create a random chromosome and send it to init
    init(randomChromosome());
}