// °ЎБЯДЎ ЕЧАМєн(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; }
/* * 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()