/*--------------------------------------------------------------------- 小さい数の方が発生し易い、乱数発生関数 0〜max-1までの値を発生させる。 0の発生確率がmax-1の発生確率のmax倍に設定されている。 */ int tri_rand(int max) { int i, j, k, l, r_max = 0; for(i = 0; i < max; i++) r_max += i + 1; i = rand() % r_max; for(j = max, k = max - 1, l = 0; j <= r_max; j += k, k--, l++) if(i < j) return l; } /*--------------------------------------------------------------------- 次世代の集団を生成する。 */ void ga_next_genelation() { int i; // 集団は順位付けられているものとし、CUT_LINE以下の個体を // CUT_LINE以上の個体から1点交差によって生成される個体に置き換える。 for(i = CUT_LINE; i < POPULATION_COUNT; i++) crossover(population[i], population[tri_rand(CUT_LINE)], population[tri_rand(CUT_LINE)]); // 全ての個体はMUTATION_ODDSの確率で突然変異をおこす。 for(i = 0; i < POPULATION_COUNT; i++) if((rand() % (int)(1.0 / MUTATION_ODDS)) == 0) mutation(population[i]); } /*---------------------------------------------------------------------