プロが教える店舗&オフィスのセキュリティ対策術

与えられた乱数を二つのグループにわけ、その差が小さくなるようなプログラムを書いているつもりです。
が、コンパイルし、実行したところ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");

}

A 回答 (2件)

segumentation faultはデバッガーを使ったら大抵一瞬で原因がわかります。


コンパイラーのデバッグ情報付きオプション付きでコンパイルして、デバッガーで動かしましょう。

例えば、
% gcc -g ga.c
% gdb a.out
> run
のような感じで。

ちなみに、下記のargv[i+1]が確保されているところを超えてアクセスしてますね。
for(i=0 ; i<Number_of_gene ; i++){
real_Number[i] = atof(argv[i+1]);
}

例えばこうしませんか?
for(i = 0; i < Number_of_gene; i++){
real_Number[i] = atof(argv[i+1]);
}
    • good
    • 0

for(p=0 ; p<Number_of_ch ; p++){


for(q=1 ; q<Number_of_ch-p+1 ; q++){

ここでqの最大値はいくつでしょう?


rand()/32767

これ、どんな乱数になることを期待していますか?
おそらく期待通りになっていないと思います。

abc = (Number_of_gene-1) * (rand()/32767);

これも、期待通りになっていないでしょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!