/*行動選択・実行*/ 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); }
ソースコードを全て挙げる為に複数投稿しているのでしょうが、おそらく全部読んで回答してくれる方は極少数でしょう。もうすこしポイントを絞って投稿するかせめてソースコードを一括で見れるように外部サイトないしzipで固めるなりするべきです。
とりあえず質問者様はteratailの質問ヒントに目を通すことをおすすめします https://teratail.com/help/question-tips
コレだけのコードを観る気はしません。問題(無限ループ)は、どこで起こっていますか? 想定したパラメタと違う値を受け取っている関数は無いですか?
回答1件
あなたの回答
tips
プレビュー