C言語 遺伝的アルゴリズムでのエラーについて
与えられた乱数を二つのグループにわけ、その差が小さくなるようなプログラムを書いているつもりです。
が、コンパイルし、実行したところsegmentation fault が表示されます。
segmentation fault が表示される理由はわかっていますが、どこでそういった現象がおこっているのか判断できない状況です。
どなたかよろしくお願いします。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//染色体の数
#define Number_of_ch 10
//エリート選抜の割合
#define Selection 0.3
//交叉率
#define Cross_ratio 0.7
//突然変異率
#define Mutation_ratio 0.1
//ループ回数
#define Number_of_loop 100
int main(int argc , char *argv[])
{
int f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,x,y,z;
int Number_of_gene = argc-1;//遺伝子の数
int chromosome[Number_of_ch][Number_of_gene],distmin[Number_of_gene];//染色体と遺伝子
int best_chromosome[Number_of_gene],Number_of_cross=0,ch_1=0,ch_2=0,point=0,temp=0,temp_1=0,temp_2=0,abc=0,loop=0;
float real_Number[Number_of_gene] , dist[Number_of_ch] , best = 100.0;
float sum0 = 0.0 , sum1 = 0.0 ;
//入力値の記録
for(i=0 ; i<argc ; i++){
real_Number[i] = atof(argv[i+1]);
}
srand((unsigned)time(NULL));
//染色体の初期化
for(j=0 ; j<Number_of_ch ; j++){
for(k=0 ; k<Number_of_gene ; k++){
chromosome[j][k] = rand() % 2;//0 or 1のグループ分け
}
}
//----------------------ループ開始------------------------
while(loop < Number_of_loop){
//差分
for(l=0 ; l<Number_of_ch ; l++){
for(m=0 ; m<Number_of_gene ; m++){
if(chromosome[l][m] == 0){
sum0 = sum0 + real_Number[k];
}
else{
sum1 = sum1 + real_Number[k];
}
}
dist[l] = abs(sum1 - sum0);
}
//評価と記憶
for(n=0 ; n<Number_of_ch ; n++){
if(dist[n] < best){
best = dist[n];
for(o=0 ; o<Number_of_gene ; o++){
best_chromosome[o] = chromosome[n][o];
}
}
}
//ソート
for(p=0 ; p<Number_of_ch ; p++){
for(q=1 ; q<Number_of_ch-p+1 ; q++){
if(dist[q-1] > dist[q]){
for(r=0 ; r<Number_of_gene ; r++){
distmin[r] = chromosome[q][r];
chromosome[q][r] = chromosome[q-1][r];
chromosome[q-1][r] = distmin[r];
}
}
}
}
//エリートの選抜
for(s=Number_of_ch*Selection ; s<Number_of_ch ; s++){
for(t=0 ; t<Number_of_gene ; t++){
chromosome[s][t] = best_chromosome[t];
}
}
//交叉
Number_of_cross = Number_of_ch * Cross_ratio;
for(u=0 ; u<Number_of_cross ; u++){
ch_1 = (Number_of_ch-1) * (rand()/32767);
ch_2 = (Number_of_ch-1) * (rand()/32767);
point = (Number_of_gene-1) * (rand()/32767);
for(x=point ; x<Number_of_gene ; x++){
temp_1 = chromosome[ch_1][x];
for(y=0 ; y<Number_of_gene ; y++){
if(chromosome[ch_1][x] == chromosome[ch_2][y]){
temp_2 = chromosome[ch_2][x];
chromosome[ch_2][x] = chromosome[ch_2][y];
chromosome[ch_2][y] = temp_2;
}
for(z=0 ; z<Number_of_gene ; z++){
if(chromosome[ch_2][x] == chromosome[ch_1][z]){
chromosome[ch_1][x] = chromosome[ch_1][z];
chromosome[ch_1][z] = temp_1;
}
}
}
}
}
//突然変異
for(f=0 ; f<Number_of_cross ; f++){
for(g=0 ; g<Number_of_gene ; g++){
if(rand()/32767 < Mutation_ratio){
abc = (Number_of_gene-1) * (rand()/32767);
temp = chromosome[f][g];
chromosome[f][g] = chromosome[f][abc];
chromosome[f][abc] = temp;
}
}
}
loop = loop + 1;
}
//結果の出力
printf("# best = %f \n",best);
for(h=0 ; h<Number_of_gene ; h++){
printf("%d",best_chromosome[h]);
}
printf("\n");
}
お礼
わざわざお調べいただいて、どうもありがとうございます。とても参考になりました。それとacronymfinder、いいですね。お気に入りにしておきました。重ねて感謝申し上げます。