Ejemplo n.º 1
0
// °ЎБЯДЎ ЕЧАМєн(prob_lst)А» №ЮѕЖ random_set.size()°іАЗ indexё¦ ј±ЕГЗПї© random_setА» return
bool MakeDistinctRandomNumberSet(std::list <float> prob_lst, OUT std::vector<int>& random_set)
{
	int size = prob_lst.size();
	int n = random_set.size();
	if (size < n)
		return false;

	std::vector <int> select_bit(size, 0);
	for (int i = 0; i < n; i++)
	{
		float range = 0.f;
		for (std::list <float>::iterator it = prob_lst.begin(); it != prob_lst.end(); it++)
		{
			range += *it;
		}
		float r = fnumber (0.f, range);
		float sum = 0.f;
		int idx = 0;
		for (std::list <float>::iterator it = prob_lst.begin(); it != prob_lst.end(); it++)
		{
			while (select_bit[idx++]);

			sum += *it;
			if (sum >= r)
			{
				select_bit[idx - 1] = 1;
				random_set[i] = idx - 1;
				prob_lst.erase(it);
				break;
			}
		}
	}
	return true;
}
Ejemplo n.º 2
0
/*
 * crossover process that executes crossover of two
 * chromosomes after a randomly chosen bit position
 * if RV is less than crossover rate
 */
void crossover(Group* grp)
{
	int num_chrs = grp->num_chrs;
	int num_genes = grp->num_genes;

	int i, j;

	// iterate through chromosomes in pairs
	for (i = 0; i < num_chrs; i += 2)
	{
		double rv = (double)rand() / RAND_MAX;

		// if RV is less than crossover rate, do crossover
		if (rv <= grp->cross_rate)
		{
			int gene_pos;		// index of gene segment
			int bit_pos;		// bit position of gene segment

			// randomly select a gene segment and the bit position
			select_bit(grp->num_genes, &gene_pos, &bit_pos);

			// exchange bits after bit_pos in the same gene segment
			unsigned char gene1 = grp->chrs[i]->genes[gene_pos];
			unsigned char gene2 = grp->chrs[i+1]->genes[gene_pos];

			unsigned char mask1 = CHAR_MAX << (CHAR_LENGTH - bit_pos + 1);
			unsigned char mask2 = CHAR_MAX >> (bit_pos - 1);

			grp->chrs[i]->genes[gene_pos] = (gene1 & mask1) + (gene2 & mask2);
			grp->chrs[i+1]->genes[gene_pos] = (gene2 & mask1) + (gene1 & mask2);
			
			// exchage gene segments after gene_pos
			for (j = gene_pos + 1; j < num_genes; j++)
			{
				unsigned char tmp = grp->chrs[i]->genes[j];
				grp->chrs[i]->genes[j] = grp->chrs[i+1]->genes[j];
				grp->chrs[i+1]->genes[j] = tmp;
			}
		}	// end of if()
	}	// end of i-for()