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

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

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

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

Q&A

解決済

1回答

1092閲覧

#4無限ループとなってしまっているのですがどこが問題なのかわからないです。

rosbergf1

総合スコア13

C++

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

0グッド

0クリップ

投稿2018/05/07 10:06

/*行動選択・実行*/ void 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) { int i, s, b; double max = 0; /*P_explrの確率でランダムに行動を選択*/ if (random1() < P_explr) { /*ランダムな整数をsに格納*/ s = cla(n_cs); /*sの回数だけMS内のCSを渡り歩く*/ while (MS[s] == 1) { if (MS[s] == 0) { s = cla(n_cs); } } } else { /*MSの中で適合度の一番高いCSを探す*/ for (i = 0; i < n_cs; i++) { if (MS[i] == 1 && cs_F[i] > max) { max = cs_F[i]; } } /*ランダムな整数をsに格納*/ s = cla(n_cs); /*最大適合度を持つCSの中からランダムで1つ選ぶ*/ /*sの回数だけ最大適合度を持つCSを渡り歩く*/ i = 0; while (s > 0) { if (MS[i] == 1 && cs_F[i] >= max) { s--; } if (s > 0) { i++; if (i >= n_cs) { i = 0; } } } if (MS[i] == 0) { printf("gre:MS[%d]==%d\n", i, MS[i]); printf("max=%lf\n", max); } } /*選ばれたCSの行動部を記録*/ *act = cs_a[s]; /*選択された行動を実行*/ b = *Agent; /*上を選択した場合*/ if (*act == 1) { b /= 1000; /*壁がなければ移動*/ if (b != 1) { *Agent_y -= 1; } }/*右を選択した場合*/ else if (*act == 2) { b /= 100; b %= 10; /*壁がなければ移動*/ if (b != 1) { *Agent_x += 1; } }/*下を選択した場合*/ else if (*act == 3) { b /= 10; b %= 10; /*壁がなければ移動*/ if (b != 1) { *Agent_y += 1; } }/*左を選択した場合*/ else { b %= 10; /*壁がなければ移動*/ if (b != 1) { *Agent_x -= 1; } } /*行動に対する報酬値を与える*/ if (maze[*Agent_y][*Agent_x] == 3) { *P = Goal_P;/*ゴールの報酬*/ } else if (maze[*Agent_y][*Agent_x] == 2) { *P = Aisle_P;/*通路の報酬値*/ } else { *P = Wall_P;/*壁の報酬*/ } } /*グリーディな行動選択・実行*/ void 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) { int i, s, a[N_MAX], b; double max = 0; /*MSの中で適合度の一番高いCSを探す*/ for (i = 0; i < n_cs; i++) { if (MS[i] == 1 && cs_F[i] > max) { max = cs_F[i]; } } /*MSの中で最大適合度を持つCSを全て格納*/ for (i = 0; i < n_cs; i++) { if (MS[i] == 1 && cs_F[i] == max) { a[i] = 1; } else { a[i] = 0; } } /*最大適合度を持つCSの中からランダムで1つ選ぶ*/ /*ランダムな整数をsに格納*/ s = cla(n_cs); /*sの回数だけ最大適合度を持つCSを渡り歩く*/ i = 0; while (s > 0) { if (a[i] == 1) { s--; } if (s > 0) { i++; if (i >= n_cs) { i = 0; } } } /*選ばれたCSの行動部を記録*/ *act = cs_a[i]; /*選択された行動を実行*/ b = *Agent; /*上を選択した場合*/ if (*act == 1) { b /= 1000; /*壁がなければ移動*/ if (b != 1) { *Agent_y -= 1; } }/*右を選択した場合*/ else if (*act == 2) { b /= 100; b %= 10; /*壁がなければ移動*/ if (b != 1) { *Agent_x += 1; } }/*下を選択した場合*/ else if (*act == 3) { b /= 10; b %= 10; /*壁がなければ移動*/ if (b != 1) { *Agent_y += 1; } }/*左を選択した場合*/ else { b %= 10; /*壁がなければ移動*/ if (b != 1) { *Agent_x -= 1; } } /*行動に対する報酬値を与える*/ if (maze[*Agent_y][*Agent_x] == 3) { *P = Goal_P;/*ゴールの報酬*/ } else if (maze[*Agent_y][*Agent_x] == 2) { *P = Aisle_P;/*通路の報酬値*/ } else { *P = Wall_P;/*壁の報酬*/ } } /*アクションセットの生成*/ void make_AS(int act, int cs_a[N_MAX], int MS[N_MAX], int AS[N_MAX], int *N_AS) { int i; /*AS数を初期化*/ *N_AS = 0; /*MSに属し,選択された行動と同じ行動部を持つCSをASに格納*/ for (i = 0; i < n_cs; i++) { if (MS[i] == 1 && cs_a[i] == act) { AS[i] = 1; *N_AS += 1; } else { AS[i] = 0; } } if (*N_AS == 0) { printf("N_AS = %d\n", *N_AS); for (i = 0; i < n_cs; i++) { printf("ms=%d;cs[%d][%d],act=%d\n", MS[i], i, cs_a[i], act); if (MS[i] == 1 && cs_a[i] == act) { AS[i] = 1; *N_AS += 1; printf("+1!\n"); } } } } /*パラメータの更新*/ void update(int P, int AS[N_MAX], int cs[N_MAX], int cs_a[N_MAX], double cs_p[N_MAX], double cs_e[N_MAX], double cs_k[N_MAX], double cs_F[N_MAX], int cs_exp[N_MAX], double cs_as[N_MAX], int cs_ts[N_MAX], int N_AS) { int i; double k1, all_k = 0; int assize; /*念のため格納しておく*/ assize = N_AS; /*AS内のCSに対してパラメータを更新*/ for (i = 0; i < n_cs; i++) { if (AS[i] == 1) { /*経験値を増やす*/ cs_exp[i] += 1; /*経験が浅い場合*/ if ((double)cs_exp[i] < (double)(1 / Beta)) { cs_p[i] += ((double)P - cs_p[i]) / cs_exp[i];/*予測報酬の更新*/ cs_e[i] += (fabs((double)P - cs_p[i]) - cs_e[i]) / cs_exp[i];/*予測誤差の更新*/ cs_as[i] += ((double)assize - cs_as[i]) / cs_exp[i];/*アクションセットサイズの更新*/ } else {/*経験が多い場合*/ cs_p[i] += Beta * ((double)P - cs_p[i]);/*予測報酬の更新*/ cs_e[i] += Beta * (fabs((double)P - cs_p[i]) - cs_e[i]);/*予測誤差の更新*/ cs_as[i] += Beta * ((double)assize - cs_as[i]);/*アクションセットサイズの更新*/ } /*精度の計算*/ if (cs_e[i] < Epsilon_0) { cs_k[i] = 1; } else { cs_k[i] = Alpha * pow(cs_e[i] / Epsilon_0, -Cons_V); } all_k += cs_k[i]; /*タイムスタンプの更新*/ cs_ts[i] += 1; } } /*適合度の更新*/ for (i = 0; i < n_cs; i++) { if (AS[i] == 1) { k1 = cs_k[i] / all_k; cs_F[i] += Beta * (k1 - cs_F[i]); } } /*Subsumption処理*/ subsumption(cs, cs_a, cs_p, cs_e, cs_k, cs_F, cs_exp, cs_as, cs_ts); }

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

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

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

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

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

MMashiro

2018/05/07 10:07

ソースコードを全て挙げる為に複数投稿しているのでしょうが、おそらく全部読んで回答してくれる方は極少数でしょう。もうすこしポイントを絞って投稿するかせめてソースコードを一括で見れるように外部サイトないしzipで固めるなりするべきです。
cateye

2018/05/07 10:21 編集

コレだけのコードを観る気はしません。問題(無限ループ)は、どこで起こっていますか? 想定したパラメタと違う値を受け取っている関数は無いですか?
guest

回答1

0

ベストアンサー

まず、目についたところから、

C++

1 /*sの回数だけMS内のCSを渡り歩く*/ 2 while (MS[s] == 1) 3 { 4 if (MS[s] == 0) 5 { 6 s = cla(n_cs); 7 } 8 } 9

MS[s] == 1の場合、脱出する術がありません。
他にもありそうですが、地道にデバッガ等で追いかけましょう。
どこでループするかなんて、簡単に探せると思いますが、、、。

投稿2018/05/07 12:37

pepperleaf

総合スコア6383

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

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

rosbergf1

2018/05/11 07:49

ありがとうございました。 ここの部分に関しては解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問