遺伝的アルゴリズム 手伝ってください。

ices_sinon
記事: 0
登録日時: 8年前
住所: 神奈川

遺伝的アルゴリズム 手伝ってください。

投稿記事 by ices_sinon » 8年前

//課題なのですが実行ができるものも、結果がうまくいきません。
crossoverの関数が間違ってる思うのですがどう直していいかわからなく。
全部の遺伝子の大して同じ位置で交叉してしまっています。
また、c_posよりも前の部分が正しく子の遺伝子に引き継がれていなくて困っています。手助けしてくれると助かります。
サンプルプログラムを参考にして、以下の条件を満たすようなプログラムを作成してください。 条件 1 選択はエリート保存、ルーレット選択を用いる。 条件 2 交叉は 1 点交叉を用いる (余裕があれば 2 点交叉も…)。 条件 3 突然変異率は 10%とする。 条件 4 個体数は 5、遺伝子長は 10、世代数は 20 とする。 条件 5 0 と 1 から構成される 10 ビットの遺伝子において、(前半の 5 ビットの中に含まれる 0 の 要素の数+後半の 5 ビットの中に含まれる 1 の要素の数) を適応度として解 (0000011111) を見つける。 条件 6 各世代における平均適応度と最大適応度をファイルに書き出し、gnuplot をつかってグラ フで表示できるようにする。


/********************************************************************
遺伝的アルゴリズム (サンプルプログラム)
********************************************************************/
#include
#include
#include
#include
#include

#define POP_SIZE 5 /* 個体数 (必ず奇数に設定) */
#define G_LENGTH 10 /* 個体の遺伝子型のビット数 */
#define MAX_GEN 20 /* 世代数 */
#define M_RATE 0.1 /* 突然変異率 (0〜1) */

double avg_fit; /* 平均適応度 */
double max_fit;
int t;
FILE *fp;


/********************************************************************
乱数の発生 (Seedの決定)
********************************************************************/
void init_rnd()
{
srand((unsigned int)time(NULL));
}

/********************************************************************
乱数の発生 (0〜1の乱数)
********************************************************************/
double Random()
{
return((double)rand() / RAND_MAX);
}

/********************************************************************
遺伝子の初期化
引数 gene[p] : 遺伝子pのi番目の成分
********************************************************************/
void init_gene(int gene[POP_SIZE][G_LENGTH])
{
int p, i;

/* 乱数の初期化 */
init_rnd();

/* 遺伝子を初期化 0〜1の乱数を発生し、0.5以上なら1
0.5未満なら0 */
printf(">\n");

/*** この部分を自分で書く ***/
for (p = 0; p fitness[p]) {//もしmin_fitnessがfitness[p]より大きければ、
min_fitness = fitness[p];//fitness[p]をmin_fitnessにコピーする。
min_p = p;//pをmin_pにコピーする。
}
}



/* 最小適応度の個体に最大適応度の個体をコピー */
copy_gene(max_p, min_p, gene, fitness);
/* 最大適応度の個体を0番目に移動 */
swap_gene(0, max_p, gene, fitness);
}

/**********************************************************************
ルーレット選択
引数 gene[p] : 遺伝子pのi番目の成分
fitness[p] : 遺伝子pの適応度
**********************************************************************/
void reproduction(int gene[POP_SIZE][G_LENGTH], double fitness[POP_SIZE])
{
double sum_of_fitness; /* 個体の適応度の総和 */
double border; /* ルーレット上の個体間の境界 */
double r; /* ルーレット上の選択位置 */
int p, i; /* 選ばれた個体の番号 */
int num; /* 0 c_pos2) { tmp = c_pos1; c_pos2 = c_pos1; c_pos1 = tmp; } //もしc_pos1がc_pos2より大きければ、c_pos1をtmpにコピーして、c_pos1をc_pos2にコピーして、tmpをc_pos1にコピーする。

for (p = 1; p >\n", t);
elite(gene, fitness); /* エリート保存 */
reproduction(gene, fitness); /* ルーレット選択 */
crossover(gene); /* 単純交叉 */
//two_crossover(gene); /* 二点交叉 */
mutation(gene); /* 突然変異 */
calc_fitness(gene, fitness); /* 適応度の計算 */
show_gene(t, gene, fitness, fp); /* 表示 */
}

/* ファイルのクローズ */
fclose(fp);

return 0;
}

たいちう
記事: 418
登録日時: 14年前

Re: 遺伝的アルゴリズム 手伝ってください。

投稿記事 by たいちう » 8年前

> 手助けしてくれると助かります。

日記ではなく掲示板に書くべきでは?
私は代わりに作る気は全くないですが、アドバイスなら少々できると思います。
それと、ソースコードタグの使い方 を調べてください。