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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

1回答

3252閲覧

q学習 c言語 宝探し

Suchmos23

総合スコア6

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/07/31 06:25

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
c言語でq学習のプログラムを書いています。
この部分を自分で記述のところが分からなくて手詰まりの状態です。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

/**************************************************************************
Q学習
**************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

// 状態
#define START 0 // 入口 (スタート)
#define WOOD 1 // 森 
#define LAKE 2 // 湖
#define POND 3 // 池
#define FIELD 4 // 草原
#define GOAL 5 // 宝 (ゴール)

// 行動
#define EAST 0 // 東  
#define WEST 1 // 西
#define SOUTH 2 // 南 
#define NORTH 4 // 北

#define TrialNo 50 // 試行回数
#define StateNum 6 // 状態数
#define ActNum 4 // 行動数

#define Alpha 0.1 // 学習率   
#define Gamma 0.9 // 減衰率  

#define Reward 10 // 報酬

/*********************************************************************
乱数のシードの生成
**********************************************************************/
void init_rnd()
{
srand((unsigned int)time(NULL));
}

/********************************************************************
乱数の発生 (0〜1の乱数)
********************************************************************/
double Random()
{
return((double)rand()/RAND_MAX);
}

/********************************************************************
ルールの価値の初期化
Qvalue[s][a] : 状態sにおいて行動aを取ることの価値
********************************************************************/
void init_Q(double Qvalue[StateNum][ActNum])
{
int s,a;

/* すべての状態と行動の価値を0にする /
/
** この部分を自分で書く ***/
int s=0;
int a=0;

}

/********************************************************************
行動の選択 (ボルツマン選択)
state : 状態
Qvalue[s][a] : 状態sにおいて行動aを取ることの価値  
env[s][a] : 状態sにおいて行動aを取ったときに遷移する状態
t : 試行回数
********************************************************************/
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)
の価値は合計には含まない /
/
** この部分を自分で書く ***/

/* 0~sumの乱数を生成 */
r = Random()sum;
border=0;
for(a=0;a<ActNum;a++){
/
取ることのできる行動の中から行動を選択 /
if(env[state][a]!=-1){
border += exp(Qvalue[state][a]/T);
}
/
選択された行動を返す */
if(r<=border){
return a;
}
}
}

/********************************************************************
ルールの価値の更新
Qvalue[s][a] : 状態sにおいて行動aを取ることの価値
p_state : 直前の状態
act : 行動
state : 状態 (行動後の状態)    
r : 報酬
********************************************************************/
void update_Q(double Qvalue[StateNum][ActNum],
int p_state, int act, int state, int r)
{
int a;
double max; // 行動後の状態から取ることのできる行動の中での価値の最大値 

/* 取ることのできる行動に関する価値の中で最大値を求める /
/
** この部分を自分で書く ***/

/* 状態p_stateにおいて行動actをとることの価値を更新 /
/
** この部分を自分で書く ***/

}

/**************************************************************************
メインプログラム
**************************************************************************/
int main()
{
int t;
int s,a;
int act; // 行動  
int p_state; // 直前の状態 
int state; // 状態
double Qvalue[StateNum][ActNum]; // ルールの価値
// 環境 (状態の遷移)      東  西  南  北
int env[StateNum-1][ActNum]={{WOOD, -1, POND, -1}, // 入口    
{LAKE, START, FIELD,-1}, // 森 
{-1, WOOD, GOAL, -1}, // 湖 
{FIELD,-1, -1, START}, // 池
{-1 ,POND, -1, WOOD}}; // 草原 
int count; // エピソードの長さ 
char *states[StateNum]={"入口","森","湖","池","草原","宝"}; // 状態(表示用) 
char *acts[ActNum]={"東","西","南","北"}; // 行動(表示用)
FILE *fp; // ファイルポインタ

/* 結果保存用のファイル(result.dat)をオープン */
if((fp=fopen("result.dat","w"))==NULL){
printf("main() : Cannot open "result.dat"\n");
exit(1);
}

init_rnd(); /* 乱数の初期化 /
init_Q(Qvalue); /
ルールの価値の初期化 */

/* TrialNo回の試行を繰り返す /
for(t=0;t<TrialNo;t++){
printf("[%d]",t);
state = START; /
状態を初期化(STARTに設定) /
count=0; /
エピソードの長さを0で初期化 /
/
ゴールに到達するまで繰り返す /
while(state!=GOAL){
act=select_action(state,Qvalue,env,t); /
行動を選択 /
p_state=state; /
 状態を保存 /
state=env[p_state][act]; /
行動することにより状態が遷移 /
/
ゴールに到達したら報酬を取得し、ルールの価値を更新 /
if(state==GOAL){
update_Q(Qvalue,p_state,act,state,Reward);
}
/
ルールの価値を更新(ゴール以外では報酬は0) /
else{
update_Q(Qvalue,p_state,act,state,0);
}
/
状態と行動を画面に表示 /
printf("%s==>(%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<StateNum;s++){
fprintf(fp,"%s\t",states[s]);
for(a=0;a<ActNum;a++){
fprintf(fp,"%6.3lf\t",Qvalue[s][a]);
}
fprintf(fp,"\n");
}

/* ファイルをクローズ */
fclose(fp);
}

c言語 ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

y_waiwai

2018/07/31 06:33

コードは、<code>ボタン押して'''の枠の中に貼り付けてください
guest

回答1

0

6.5 Q-Learning: Off-Policy TD Control

とりあえず上記URLの内容を理解しましょう。
あと、下記の部分ですが、これも自力で書けなかったのでしょうか?

C

1/**************************************************************** 2ルールの価値の初期化 3Qvalue[s][a] : 状態sにおいて行動aを取ることの価値 4****************************************************************/ 5void init_Q(double Qvalue[StateNum][ActNum]) 6{ 7int s,a; 8 9/* すべての状態と行動の価値を0にする */ 10/* この部分を自分で書く */ 11int s=0; 12int a=0; 13 14}

これが書けないとなると、C言語の基礎からやり直す必要があるかと思います。

投稿2018/07/31 08:06

rtr1950x

総合スコア298

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問