質問: Random()*sum; border=0; for(a=0;a(%s)==>",states[p_state],acts[act]); /* エピソードの長さを1増やす */ count++; } /* 最終的な状態を画面に表示 */ printf("%s\n",states[state]); /* 試行回数とエピソードの長さをファイルに出力 */ fprintf(fp,"%d %d\n",t,count); } /* ファイルをクローズ */ fclose(fp); /* 最終的なルールの価値保存用のファイルをオープン */ if((fp=fopen("Q.dat","w"))==NULL){ printf("main() : Cannot open \"Q.dat\"\n"); exit(1); } /* ルールの価値をファイルに書き出す */ fprintf(fp," 東 西 南 北\n"); for(s=0;s(南)==>池==>(東)==>草原==>(北)==>森==>(南)==>草原==>(西)==>池==>(北)== >入口==>(南)==>池==>(北)==>入口==>(東)==>森==>(東)==>湖==>(南)==>宝 [1] 入口==>(南)==>池==>(北)==>入口==>(南)==>池==>(東)==>草原==>(西)==>池==>(東)== >草原==>(北)==>森==>(西)==>入口==>(東)==>森==>(西)==>入口==>(南)==>池==>(東)==> 草原==>(北)==>森==>(東)==>湖==>(南)==>宝 [2] 入口==>(東)==>森==>(東)==>湖==>(南)==>宝 ... [99] 入口==>(東)==>森==>(東)==>湖==>(南)==>宝
回答: 強化学習に関しては素人ですが。。 1. c言語の問題 2. 強化学習の問題 と分けて考えることをおすすめします。 その1 ``` void init_Q(double Qvalue[StateNum][ActNum]) { int s,a; /* すべての状態と行動の価値を0にする */ ここは、c言語の問題です。 「状態と行動の価値」を表す変数を0にしましょう。 forループなどで実現できそうです。 /* この部分を自分で書く */ } ``` その2 ``` int select_action(int state, double Qvalue[StateNum][ActNum], int env[StateNum-1][ActNum],int t) { double sum; // ルールの価値の合計 int a; // 行動 double r; // 乱数 (0~sumの間の乱数) double border; // 境界線 double T=10; // 温度パラメータ /* 温度パラメータを設定 */ T=T-t; if(T<=1) T=1; /* ルールの価値の合計を計算 その状態で取れない行動(env[state][a]=-1) の価値は合計には含まない */ /* この部分を自分で書く */ これは、強化学習の問題です。 env[state][a]の変数を判断しながら、「ルールの価値」を表す変数を合計します。 ただし、「ボルツマン選択」をするということなので、その式に従います。 (温度定数Tが低いほどエージェントは値の高いQ値を選択する可能性が上がり、 逆にTが高いほどランダムに近い行動選択をするようになります。) このプログラムは試行回数が高くなるほどT値を低くする実装になっていますが、 その理由は、身近な先生などにヒントをもらったほうが良いかもしれません。 /* 0~sumの乱数を生成 */ r = Random()*sum; border=0; for(a=0;a