与えられた乱数を二つのグループにわけ、その差が小さくなるようなプログラムを書いているつもりです。
が、コンパイルし、実行したところ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");
}
No.1ベストアンサー
- 回答日時:
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]);
}
No.2
- 回答日時:
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);
これも、期待通りになっていないでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- VPN 何これ 1 2022/04/19 01:32
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- 英語 "an amount of"の意味等について 2 2023/06/13 12:19
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- TOEFL・TOEIC・英語検定 中学2年生です。 英検2級でこのライティングで何点くらい取れるでしょうか。(16満点) Some p 4 2022/04/01 17:38
- C言語・C++・C# [至急] Project Euler:#16 Power digit sumコード、入力、出力、解説 3 2022/09/24 02:35
- 英語 The shape of the pyramid, however, has changed as 1 2022/04/27 20:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語プログラミングで初項を1....
-
C言語のエラーについて
-
C言語のソースコードについて教...
-
C言語初心者です。計算がうまく...
-
C言語で自作ヘッダーを作ったの...
-
互いに素と負の数
-
クレーンでのCFブレーキとな...
-
二つの波形の合致を調べる方法は?
-
R-C直列回路にLを接続した時の...
-
物理の波についてです 時刻12/8...
-
半波整流回路と平滑回路の波形...
-
rc直列回路の波形を観測する時...
-
インパルス応答と入力信号から...
-
数学Aの問題です。 答えは、左...
-
「跨川橋」は、「運河に架かる...
-
PWM波形をAM波形に変換す...
-
ベクトル場の面積分・線積分の...
-
複数のシリンダーの同調化にコ...
-
制御工学の問題です。
-
パターン効果/裾引き(アイパタ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語プログラミングで初項を1....
-
プログラミングが分かりません。
-
'printf':識別子が見つかりませ...
-
C言語のエラーについて
-
Expression: nptr != NULL
-
TCP/IP: 非ソケットに対するソ...
-
3×3のラテン方陣をつくるプログ...
-
加減剰余のオーバーフローについて
-
プログラムがエラーが出る原因
-
getch / putch用のヘッダ
-
コマンドライン引数について。
-
C言語で自作ヘッダーを作ったの...
-
コンソールAPIのSetConsoleScre...
-
分割コンパイルの手順と方法に...
-
C言語 コンパイルエラー(文字...
-
リターンキー又は、スペースキ...
-
C言語初心者です。計算がうまく...
-
最も文字数が多い行番号と文字...
-
モンテカルロ法で三角錐の体積...
-
C言語のソースコードについて教...
おすすめ情報