質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

273閲覧

カウントされているはずの変数が途中で0になり途中で異常終了してしまいます。

rosbergf1

総合スコア13

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

1クリップ

投稿2018/05/11 08:24

編集2018/05/11 10:19

追記

乱数の発生のさせ方がまずく, すべての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);
としています。

ここで補足として

  1. ms=0となっているのは特に問題はない。(ただし,msに代入しているMS[i]がすべて0だと問題。)
  2. 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となってしまって異常終了してしまいます。

set0gut1👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

質問の本題の解答ではないです。一般論として解答します。

C++

1void g_action(int maze[maze_y][maze_x], int *P, int MS[N_MAX], int cs_a[N_MAX], double cs_F[N_MAX], int *act, int *Agent_x, int *Agent_y, int *Agent);

関数の引数が9個と多すぎませんか?
例えばAgent_xAgent_yを構造体を使って一つに纏めてみたり、
Mazeクラス、Agentクラスにクラス分割を行ってみてはどうでしょうか。
あと配列を多用していますが、STLvectorクラスが使えるのでは。

プログラムの土台部分がしっかりしていないと、砂で作った城が壊れやすいように、
バグを直しても新たなバグが発生するだけかと。
自分で書いたコードを管理しきれていないのでは・・・。

投稿2018/05/11 22:34

編集2018/05/12 01:39
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rosbergf1

2018/05/13 04:58

回答ありがとうございます。 構造体がものすごく苦手で使わずに作ったという経緯があります。 勉強し直したいと思います。
guest

0

make_AS関数の引数N_MSへ渡されるmain関数内の変数N_ASが初期化せずに渡されています。
dropboxだとコードが提示されたものと書き換わって面倒くさいですね

投稿2018/05/11 21:25

編集2018/05/11 21:36
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

全てコードを見ているわけではありませんが、

*N_AS > N_MAX という事はないでしょうか?
make_AS()の引数である AS[], MS[], cs_a[] はどのように宣言されて、引数として渡されているでしょうか?

投稿2018/05/11 12:19

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rosbergf1

2018/05/13 05:00

回答ありがとうございました。 見直してみた結果, 引き渡す際にcs_a[]が確保していない領域にアクセスしてしまっていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問