Esempio n. 1
0
Chromosome* Chromosome::ArithmeticCrossoverWithChromosome(Chromosome* Mutator)
{
	//srand( (unsigned)time(0) );	 srand should have been called already
	bool bAnd = (rand() &1);
	
	//0 doesn't really matter, updating weights anyway
	Chromosome* ret = new Chromosome(0);
	
	if (bAnd)
	{
		for (int i = 0; i < NUM_EVALNODES; i++)
		{
			int newWeighting = (Weightings[i] & Mutator->GetWeighting(i));
			ret->SetWeighting(i, newWeighting);
		}
	}
	else {
		for (int i = 0; i < NUM_EVALNODES; i++)
		{
			int newWeighting = (Weightings[i] | Mutator->GetWeighting(i));
			ret->SetWeighting(i, newWeighting);
		}
	}
	return ret;
}
Esempio n. 2
0
Chromosome* Chromosome::MultiplePointCrossoverWithChromosome(Chromosome* Mutator)
{
	//srand( (unsigned)time(0) ); srand should have been called already
	Chromosome* ret = new Chromosome(10); // NEED NUM HERE
	for (int i = 0; i < NUM_EVALNODES; i++)
	{
		//In single point crossover, we select a random point
		//Before the random point, take from A, take rest from B
		int random_integer1 = (rand() %10); //32 bit integer
		int random_integer2 = (rand() %10);
		while (random_integer1 == random_integer2)
			random_integer2 = (rand() % 10);

		int mask = 1;
		//if (random_integer1 > random_integer2)
		{
			for (int j = 0 ; j < abs(random_integer1-random_integer2); j++)
			{
				mask = mask<<1;
				mask |= 1;
			}
			int nextShift = ((random_integer2 > random_integer1) ? random_integer1 : random_integer2);
			mask = mask << nextShift;
		}
		
		int newWeighting = (Weightings[i]&mask) | (Mutator->GetWeighting(i)& ~mask);
		ret->SetWeighting(i, newWeighting);
	}
	return ret;
}
Esempio n. 3
0
Chromosome* Chromosome::SinglePointCrossoverWithChromosome(Chromosome* Mutator)
{
	//srand( (unsigned)time(0) ); srand should have been called already
	Chromosome* ret = new Chromosome(10); // NEED NUM HERE
	for (int i = 0; i < NUM_EVALNODES; i++)
	{
		//In single point crossover, we select a random point
		//Before the random point, take from A, take rest from B
		int random_integer = (rand() %10); //32 bit integer
		int mask = 1;
		for (int j = 0 ; j < random_integer; j++)
		{
			mask = mask<<1;
			mask |= 1;
		}
		int newWeighting = (Weightings[i]&mask) | (Mutator->GetWeighting(i)& ~mask);
		ret->SetWeighting(i, newWeighting);
	}
	return ret;
}
Esempio n. 4
0
Chromosome* Chromosome::UniformPointCrossoverWithChromosome(Chromosome* Mutator)
{
	Chromosome* ret = new Chromosome(10);
	for (int i = 0 ;i < NUM_EVALNODES; i++)
	{
		int Weighting = 0;
		int currMutatorWeighting = Mutator->GetWeighting(i);
		for (int j = 0; j < 32; j++) //32 bits in an int
		{
			int mask = 1 << j;
			bool bOne = (rand() &1);
			if (bOne)
			{
				Weighting |= mask & Weightings[i];
			}
			else {
				Weighting |= mask & currMutatorWeighting;
			}
		}
		ret->SetWeighting(i, Weighting);
	}
	return ret;
}