追記
乱数の発生のさせ方がまずく, すべてのcs_a[i]に全く同じ値が代入されていました.
この問題が解決して, 以下の問題が解決するかはまだわかっておりません.
前提・実現したいこと
クラシファイアシステムを用いた迷路探索システムを作っています。
コンパイルすると以下のエラーが発生しました。
発生している問題・エラーメッセージ
(1) Floating point exception: 8
(2) Abort trap: 6
(3) ms=0;cs[0999の整数][j],act=(14の整数)
...
Abort trap :6
(1)に関しては,
$
学習回数:9000
検証回数:1000
学習開始
00%:CS数[1000],累積GA回数[0]
Floating point exception :8
(2)に関しては,
$
学習回数:9000
検証回数:1000
学習開始
00%:CS数[1000],累積GA回数[0]
N_AS = 0
Abort trap :6
(3)に関しては,
$
学習回数:9000
検証回数:1000
学習開始
00%:CS数[1000],累積GA回数[0]
N_AS = 0
ms=0;cs[0][4],act=4
ms=0;cs[1][4],act=4
...
ms=0;cs[999][4],act=4
Abort trap: 6
といった具合に出ます。(1例なのでその都度、値は変わってます。)
Abort関数はGAという関数内でN_ASで割る動作があるため, N_AS=0となってしまう場合はGAの途中で異常終了するようにしています。
(3)についてなんですが,
printf("ms=%d;cs[%d][%d],act=%d\n", MS[i], i, cs_a[i], act);
としています。
ここで補足として
- ms=0となっているのは特に問題はない。(ただし,msに代入しているMS[i]がすべて0だと問題。)
- cs_a[i] と act は動作上同じ値になる。
以上です。
該当のソースコード
以下、リンク先です。
https://www.dropbox.com/s/q4x6z8r8hx5cw3z/XCS.cpp?dl=0
該当のソースコードの一部
全体の流れはリンク先のソースコードを参照してください。
1200行近くあり、載せることができません。
C++
1 2/*アクションセットの生成*/ 3void make_AS(int act, int cs_a[N_MAX], int MS[N_MAX], int AS[N_MAX], int *N_AS, int *N_MS) 4{ 5 int i; 6 /*AS数を初期化*/ 7 *N_AS = 0; 8 /*MSに属し,選択された行動と同じ行動部を持つCSをASに格納*/ 9 for (i = 0; i < *N_MS; i++) 10 { 11 if (MS[i] == 1 && cs_a[i] == act) 12 { 13 AS[i] = 1; 14 *N_AS += 1; 15 } 16 else { 17 AS[i] = 0; 18 } 19 } 20 if (*N_AS == 0) 21 { 22 printf("N_AS = %d\n", *N_AS); 23 for (i = 0; i < n_cs; i++) 24 { 25 printf("ms=%d;cs[%d][%d],act=%d\n", MS[i], i, cs_a[i], act); 26 if (MS[i] == 1 && cs_a[i] == act) 27 { 28 AS[i] = 1; 29 *N_AS += 1; 30 printf("+1!\n"); 31 } 32 } 33 } 34}
怪しい部分
デバッグで探っていたのですが、
make_ASという関数内で動作が止まっているっぽいです。
この関数を追いかけてみたのですが、途中まではif (MS[i] == 1 && cs_a[i] == act)を満たしていて, N_ASはカウントされています。
しかし、動作を繰り返すうちに急にN_AS=0となってしまって異常終了してしまいます。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/13 04:58