質問編集履歴

5

見やすくコードを別にし、コードを修正

2017/08/05 10:52

投稿

pure_storm
pure_storm

スコア16

test CHANGED
File without changes
test CHANGED
@@ -1,8 +1,6 @@
1
1
  ###前提・実現したいこと
2
2
 
3
- 学校の課題がわかりません。教えてください。
4
-
5
- C言語Q学習(宝探し)穴埋め問題です。
3
+ C言語Q学習のプログラミング問題です。
6
4
 
7
5
  プログラミングが苦手で手詰まり状態です。ヒントでもいいので教えてください。
8
6
 
@@ -12,12 +10,14 @@
12
10
 
13
11
  #####わからない部分
14
12
 
15
- 問題の意味も、どうしたらいいかわからない状態です
13
+ どうしたらいいかわからない状態です
16
14
 
17
15
  ######その1
18
16
 
19
17
  ルールの価値の初期化
20
18
 
19
+ ```ここに言語を入力
20
+
21
21
  Qvalue[s][a] : 状態sにおいて行動aを取ることの価値
22
22
 
23
23
  ****************************************************************/
@@ -34,8 +34,14 @@
34
34
 
35
35
  }
36
36
 
37
+
38
+
39
+ ```
40
+
37
41
  ######その2
38
42
 
43
+ ```ここに言語を入力
44
+
39
45
  /* 温度パラメータを設定 */
40
46
 
41
47
  T=T-t;
@@ -50,8 +56,14 @@
50
56
 
51
57
  /*** この部分を自分で書く ***/
52
58
 
59
+
60
+
61
+ ```
62
+
53
63
  ######その3
54
64
 
65
+ ```ここに言語を入力
66
+
55
67
  /********************************************************************
56
68
 
57
69
  ルールの価値の更新
@@ -88,55 +100,61 @@
88
100
 
89
101
  }
90
102
 
103
+
104
+
105
+ ```
106
+
91
107
  ###該当のソースコード
92
108
 
109
+ ```ここに言語を入力
110
+
93
111
  /**************************************************************************
94
112
 
95
113
  Q学習
96
114
 
97
115
  **************************************************************************/
98
116
 
99
- include<stdio.h>
117
+ #include<stdio.h>
100
-
118
+
101
- include<stdlib.h>
119
+ #include<stdlib.h>
102
-
120
+
103
- include<math.h>
121
+ #include<math.h>
104
122
 
105
123
  // 状態
106
124
 
107
- define START 0 // 入口 (スタート)
125
+ #define START 0 // 入口 (スタート)
108
-
126
+
109
- define WOOD 1 // 森
127
+ #define WOOD 1 // 森
110
-
128
+
111
- define LAKE 2 // 湖
129
+ #define LAKE 2 // 湖
112
-
130
+
113
- define POND 3 // 池
131
+ #define POND 3 // 池
114
-
132
+
115
- define FIELD 4 // 草原
133
+ #define FIELD 4 // 草原
116
-
134
+
117
- define GOAL 5 // 宝 (ゴール)
135
+ #define GOAL 5 // 宝 (ゴール)
118
136
 
119
137
  // 行動
120
138
 
121
- define EAST 0 // 東
139
+ #define EAST 0 // 東
122
-
140
+
123
- define WEST 1 // 西
141
+ #define WEST 1 // 西
124
-
142
+
125
- define SOUTH 2 // 南
143
+ #define SOUTH 2 // 南
126
-
144
+
127
- define NORTH 4 // 北
145
+ #define NORTH 4 // 北
128
-
146
+
129
- define TrialNo 50 // 試行回数
147
+ #define TrialNo 50 // 試行回数
130
-
148
+
131
- define StateNum 6 // 状態数
149
+ #define StateNum 6 // 状態数
132
-
150
+
133
- define ActNum 4 // 行動数
151
+ #define ActNum 4 // 行動数
134
-
152
+
135
- define Alpha 0.1 // 学習率
153
+ #define Alpha 0.1 // 学習率
136
-
154
+
137
- define Gamma 0.9 // 減衰率
155
+ #define Gamma 0.9 // 減衰率
138
-
156
+
139
- define Reward 10 // 報酬
157
+ #define Reward 10 // 報酬
140
158
 
141
159
  /*********************************************************************
142
160
 
@@ -446,6 +464,10 @@
446
464
 
447
465
  }
448
466
 
467
+
468
+
469
+ ```
470
+
449
471
  ###試したこと
450
472
 
451
473
  理解できないところが多くて、手が付けられない状態です

4

元に戻す

2017/08/05 10:52

投稿

pure_storm
pure_storm

スコア16

test CHANGED
@@ -1 +1 @@
1
- testtesttest
1
+ Q学習の問題とC言語の問題
test CHANGED
@@ -1 +1,479 @@
1
- testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest
1
+ ###前提・実現したいこと
2
+
3
+ 学校の課題がわかりません。教えてください。
4
+
5
+ C言語のQ学習(宝探し)の穴埋め問題です。
6
+
7
+ プログラミングが苦手で手詰まり状態です。ヒントでもいいので教えてください。
8
+
9
+ ###発生している問題・エラーメッセージ
10
+
11
+ 穴埋め部分がわかりません
12
+
13
+ #####わからない部分
14
+
15
+ 問題の意味も、どうしたらいいかもわからない状態です
16
+
17
+ ######その1
18
+
19
+ ルールの価値の初期化
20
+
21
+ Qvalue[s][a] : 状態sにおいて行動aを取ることの価値
22
+
23
+ ****************************************************************/
24
+
25
+ void init_Q(double Qvalue[StateNum][ActNum])
26
+
27
+ {
28
+
29
+ int s,a;
30
+
31
+ /* すべての状態と行動の価値を0にする */
32
+
33
+ /* この部分を自分で書く */
34
+
35
+ }
36
+
37
+ ######その2
38
+
39
+ /* 温度パラメータを設定 */
40
+
41
+ T=T-t;
42
+
43
+ if(T<=1) T=1;
44
+
45
+ /* ルールの価値の合計を計算
46
+
47
+ その状態で取れない行動(env[state][a]=-1)
48
+
49
+ の価値は合計には含まない */
50
+
51
+ /*** この部分を自分で書く ***/
52
+
53
+ ######その3
54
+
55
+ /********************************************************************
56
+
57
+ ルールの価値の更新
58
+
59
+ Qvalue[s][a] : 状態sにおいて行動aを取ることの価値
60
+
61
+ p_state : 直前の状態
62
+
63
+ act : 行動
64
+
65
+ state : 状態 (行動後の状態)
66
+
67
+ r : 報酬
68
+
69
+ ********************************************************************/
70
+
71
+ void update_Q(double Qvalue[StateNum][ActNum],
72
+
73
+ int p_state, int act, int state, int r)
74
+
75
+ {
76
+
77
+ int a;
78
+
79
+ double max; // 行動後の状態から取ることのできる行動の中での価値の最大値
80
+
81
+ /* 取ることのできる行動に関する価値の中で最大値を求める */
82
+
83
+ /*** この部分を自分で書く ***/
84
+
85
+ /* 状態p_stateにおいて行動actをとることの価値を更新 */
86
+
87
+ /*** この部分を自分で書く ***/
88
+
89
+ }
90
+
91
+ ###該当のソースコード
92
+
93
+ /**************************************************************************
94
+
95
+ Q学習
96
+
97
+ **************************************************************************/
98
+
99
+ include<stdio.h>
100
+
101
+ include<stdlib.h>
102
+
103
+ include<math.h>
104
+
105
+ // 状態
106
+
107
+ #define START 0 // 入口 (スタート)
108
+
109
+ #define WOOD 1 // 森
110
+
111
+ #define LAKE 2 // 湖
112
+
113
+ #define POND 3 // 池
114
+
115
+ #define FIELD 4 // 草原
116
+
117
+ #define GOAL 5 // 宝 (ゴール)
118
+
119
+ // 行動
120
+
121
+ #define EAST 0 // 東
122
+
123
+ #define WEST 1 // 西
124
+
125
+ #define SOUTH 2 // 南
126
+
127
+ #define NORTH 4 // 北
128
+
129
+ #define TrialNo 50 // 試行回数
130
+
131
+ #define StateNum 6 // 状態数
132
+
133
+ #define ActNum 4 // 行動数
134
+
135
+ #define Alpha 0.1 // 学習率
136
+
137
+ #define Gamma 0.9 // 減衰率
138
+
139
+ #define Reward 10 // 報酬
140
+
141
+ /*********************************************************************
142
+
143
+ 乱数のシードの生成
144
+
145
+ **********************************************************************/
146
+
147
+ void init_rnd()
148
+
149
+ {
150
+
151
+ srand((unsigned int)time(NULL));
152
+
153
+ }
154
+
155
+ /********************************************************************
156
+
157
+ 乱数の発生 (0〜1の乱数)
158
+
159
+ ********************************************************************/
160
+
161
+ double Random()
162
+
163
+ {
164
+
165
+ return((double)rand()/RAND_MAX);
166
+
167
+ }
168
+
169
+ /********************************************************************
170
+
171
+ ルールの価値の初期化
172
+
173
+ Qvalue[s][a] : 状態sにおいて行動aを取ることの価値
174
+
175
+ ********************************************************************/
176
+
177
+ void init_Q(double Qvalue[StateNum][ActNum])
178
+
179
+ {
180
+
181
+ int s,a;
182
+
183
+ /* すべての状態と行動の価値を0にする */
184
+
185
+ /*** この部分を自分で書く ***/
186
+
187
+ }
188
+
189
+ /********************************************************************
190
+
191
+ 行動の選択 (ボルツマン選択)
192
+
193
+ state : 状態
194
+
195
+ Qvalue[s][a] : 状態sにおいて行動aを取ることの価値
196
+
197
+ env[s][a] : 状態sにおいて行動aを取ったときに遷移する状態
198
+
199
+ t : 試行回数
200
+
201
+ ********************************************************************/
202
+
203
+ int select_action(int state,
204
+
205
+ double Qvalue[StateNum][ActNum],
206
+
207
+ int env[StateNum-1][ActNum],int t)
208
+
209
+ {
210
+
211
+ double sum; // ルールの価値の合計
212
+
213
+ int a; // 行動
214
+
215
+ double r; // 乱数 (0~sumの間の乱数)
216
+
217
+ double border; // 境界線
218
+
219
+ double T=10; // 温度パラメータ
220
+
221
+ /* 温度パラメータを設定 */
222
+
223
+ T=T-t;
224
+
225
+ if(T<=1) T=1;
226
+
227
+ /* ルールの価値の合計を計算
228
+
229
+ その状態で取れない行動(env[state][a]=-1)
230
+
231
+ の価値は合計には含まない */
232
+
233
+ /*** この部分を自分で書く ***/
234
+
235
+ /* 0~sumの乱数を生成 */
236
+
237
+ r = Random()*sum;
238
+
239
+ border=0;
240
+
241
+ for(a=0;a<ActNum;a++){
242
+
243
+ /* 取ることのできる行動の中から行動を選択 */
244
+
245
+ if(env[state][a]!=-1){
246
+
247
+ border += exp(Qvalue[state][a]/T);
248
+
249
+ }
250
+
251
+ /* 選択された行動を返す */
252
+
253
+ if(r<=border){
254
+
255
+ return a;
256
+
257
+ }
258
+
259
+ }
260
+
261
+ }
262
+
263
+ /********************************************************************
264
+
265
+ ルールの価値の更新
266
+
267
+ Qvalue[s][a] : 状態sにおいて行動aを取ることの価値
268
+
269
+ p_state : 直前の状態
270
+
271
+ act : 行動
272
+
273
+ state : 状態 (行動後の状態)
274
+
275
+ r : 報酬
276
+
277
+ ********************************************************************/
278
+
279
+ void update_Q(double Qvalue[StateNum][ActNum],
280
+
281
+ int p_state, int act, int state, int r)
282
+
283
+ {
284
+
285
+ int a;
286
+
287
+ double max; // 行動後の状態から取ることのできる行動の中での価値の最大値
288
+
289
+ /* 取ることのできる行動に関する価値の中で最大値を求める */
290
+
291
+ /*** この部分を自分で書く ***/
292
+
293
+ /* 状態p_stateにおいて行動actをとることの価値を更新 */
294
+
295
+ /*** この部分を自分で書く ***/
296
+
297
+ }
298
+
299
+ /**************************************************************************
300
+
301
+ メインプログラム
302
+
303
+ **************************************************************************/
304
+
305
+ int main()
306
+
307
+ {
308
+
309
+ int t;
310
+
311
+ int s,a;
312
+
313
+ int act; // 行動
314
+
315
+ int p_state; // 直前の状態
316
+
317
+ int state; // 状態
318
+
319
+ double Qvalue[StateNum][ActNum]; // ルールの価値
320
+
321
+ // 環境 (状態の遷移) 東 西 南 北
322
+
323
+ int env[StateNum-1][ActNum]={{WOOD, -1, POND, -1}, // 入口
324
+
325
+ {LAKE, START, FIELD,-1}, // 森
326
+
327
+ {-1, WOOD, GOAL, -1}, // 湖
328
+
329
+ {FIELD,-1, -1, START}, // 池
330
+
331
+ {-1 ,POND, -1, WOOD}}; // 草原
332
+
333
+ int count; // エピソードの長さ
334
+
335
+ char *states[StateNum]={"入口","森","湖","池","草原","宝"}; // 状態(表示用)
336
+
337
+ char *acts[ActNum]={"東","西","南","北"}; // 行動(表示用)
338
+
339
+ FILE *fp; // ファイルポインタ
340
+
341
+ /* 結果保存用のファイル(result.dat)をオープン */
342
+
343
+ if((fp=fopen("result.dat","w"))==NULL){
344
+
345
+ printf("main() : Cannot open \"result.dat\"\n");
346
+
347
+ exit(1);
348
+
349
+ }
350
+
351
+ init_rnd(); /* 乱数の初期化 */
352
+
353
+ init_Q(Qvalue); /* ルールの価値の初期化 */
354
+
355
+ /* TrialNo回の試行を繰り返す */
356
+
357
+ for(t=0;t<TrialNo;t++){
358
+
359
+ printf("[%d]",t);
360
+
361
+ state = START; /* 状態を初期化(STARTに設定) */
362
+
363
+ count=0; /* エピソードの長さを0で初期化 */
364
+
365
+ /* ゴールに到達するまで繰り返す */
366
+
367
+ while(state!=GOAL){
368
+
369
+ act=select_action(state,Qvalue,env,t); /* 行動を選択 */
370
+
371
+ p_state=state; /* 状態を保存 */
372
+
373
+ state=env[p_state][act]; /* 行動することにより状態が遷移 */
374
+
375
+ /* ゴールに到達したら報酬を取得し、ルールの価値を更新 */
376
+
377
+ if(state==GOAL){
378
+
379
+ update_Q(Qvalue,p_state,act,state,Reward);
380
+
381
+ }
382
+
383
+ /* ルールの価値を更新(ゴール以外では報酬は0) */
384
+
385
+ else{
386
+
387
+ update_Q(Qvalue,p_state,act,state,0);
388
+
389
+ }
390
+
391
+ /* 状態と行動を画面に表示 */
392
+
393
+ printf("%s==>(%s)==>",states[p_state],acts[act]);
394
+
395
+ /* エピソードの長さを1増やす */
396
+
397
+ count++;
398
+
399
+ }
400
+
401
+ /* 最終的な状態を画面に表示 */
402
+
403
+ printf("%s\n",states[state]);
404
+
405
+ /* 試行回数とエピソードの長さをファイルに出力 */
406
+
407
+ fprintf(fp,"%d %d\n",t,count);
408
+
409
+ }
410
+
411
+ /* ファイルをクローズ */
412
+
413
+ fclose(fp);
414
+
415
+ /* 最終的なルールの価値保存用のファイルをオープン */
416
+
417
+ if((fp=fopen("Q.dat","w"))==NULL){
418
+
419
+ printf("main() : Cannot open \"Q.dat\"\n");
420
+
421
+ exit(1);
422
+
423
+ }
424
+
425
+ /* ルールの価値をファイルに書き出す */
426
+
427
+ fprintf(fp," 東 西 南 北\n");
428
+
429
+ for(s=0;s<StateNum;s++){
430
+
431
+ fprintf(fp,"%s\t",states[s]);
432
+
433
+ for(a=0;a<ActNum;a++){
434
+
435
+ fprintf(fp,"%6.3lf\t",Qvalue[s][a]);
436
+
437
+ }
438
+
439
+ fprintf(fp,"\n");
440
+
441
+ }
442
+
443
+ /* ファイルをクローズ */
444
+
445
+ fclose(fp);
446
+
447
+ }
448
+
449
+ ###試したこと
450
+
451
+ 理解できないところが多くて、手が付けられない状態です
452
+
453
+ ###補足情報(言語/FW/ツール等のバージョンなど)
454
+
455
+ Linax
456
+
457
+ VMware player
458
+
459
+ Ubuntu
460
+
461
+ C言語
462
+
463
+ 理想的な実行結果
464
+
465
+ [0] 入口==>(南)==>池==>(東)==>草原==>(北)==>森==>(南)==>草原==>(西)==>池==>(北)==
466
+
467
+ >入口==>(南)==>池==>(北)==>入口==>(東)==>森==>(東)==>湖==>(南)==>宝
468
+
469
+ [1] 入口==>(南)==>池==>(北)==>入口==>(南)==>池==>(東)==>草原==>(西)==>池==>(東)==
470
+
471
+ >草原==>(北)==>森==>(西)==>入口==>(東)==>森==>(西)==>入口==>(南)==>池==>(東)==>
472
+
473
+ 草原==>(北)==>森==>(東)==>湖==>(南)==>宝
474
+
475
+ [2] 入口==>(東)==>森==>(東)==>湖==>(南)==>宝
476
+
477
+
478
+
479
+ [99] 入口==>(東)==>森==>(東)==>湖==>(南)==>宝

3

削除

2017/08/05 08:51

投稿

pure_storm
pure_storm

スコア16

test CHANGED
@@ -1 +1 @@
1
- C言語のQ学習(宝探し)の穴埋め問題です。 プログラミングが苦手で手詰まり状態です。ヒントでもいいので教えてください。
1
+ testtesttest
test CHANGED
@@ -1,563 +1 @@
1
- ###前提・実現したいこと
2
-
3
-
4
-
5
- 学校の課題がわかりません。教えてください。
6
-
7
- C言語のQ学習(宝探し)の穴埋め問題です。
8
-
9
- プログラミングが苦手で手詰まり状態です。ヒントでもいいので教えてください。
10
-
11
-
12
-
13
- ###発生している問題・エラーメッセージ
14
-
15
- 穴埋め部分がわかりません
16
-
17
- #####わからない部分
18
-
19
- 問題の意味も、どうしたらいいかもわからない状態です
20
-
21
- ######その1
22
-
23
- ルールの価値の初期化
24
-
25
- Qvalue[s][a] : 状態sにおいて行動aを取ることの価値
26
-
27
- ****************************************************************/
28
-
29
- void init_Q(double Qvalue[StateNum][ActNum])
30
-
31
- {
32
-
33
- int s,a;
34
-
35
-
36
-
37
- /* すべての状態と行動の価値を0にする */
38
-
39
- /* この部分を自分で書く */
40
-
41
-
42
-
43
- }
44
-
45
-
46
-
47
- ######その2
48
-
49
- /* 温度パラメータを設定 */
50
-
51
- T=T-t;
52
-
53
- if(T<=1) T=1;
54
-
55
-
56
-
57
- /* ルールの価値の合計を計算
58
-
59
- その状態で取れない行動(env[state][a]=-1)
60
-
61
- の価値は合計には含まない */
62
-
63
- /*** この部分を自分で書く ***/
64
-
65
-
66
-
67
- ######その3
68
-
69
- /********************************************************************
70
-
71
- ルールの価値の更新
72
-
73
- Qvalue[s][a] : 状態sにおいて行動aを取ることの価値
74
-
75
- p_state : 直前の状態
76
-
77
- act : 行動
78
-
79
- state : 状態 (行動後の状態)
80
-
81
- r : 報酬
82
-
83
- ********************************************************************/
84
-
85
- void update_Q(double Qvalue[StateNum][ActNum],
86
-
87
- int p_state, int act, int state, int r)
88
-
89
- {
90
-
91
- int a;
92
-
93
- double max; // 行動後の状態から取ることのできる行動の中での価値の最大値
94
-
95
-
96
-
97
- /* 取ることのできる行動に関する価値の中で最大値を求める */
98
-
99
- /*** この部分を自分で書く ***/
100
-
101
-
102
-
103
-
104
-
105
- /* 状態p_stateにおいて行動actをとることの価値を更新 */
106
-
107
- /*** この部分を自分で書く ***/
108
-
109
-
110
-
111
- }
112
-
113
-
114
-
115
- ###該当のソースコード
116
-
117
- /**************************************************************************
118
-
119
- Q学習
120
-
121
- **************************************************************************/
122
-
123
- include<stdio.h>
124
-
125
- include<stdlib.h>
126
-
127
- include<math.h>
128
-
129
-
130
-
131
- // 状態
132
-
133
- #define START 0 // 入口 (スタート)
134
-
135
- #define WOOD 1 // 森
136
-
137
- #define LAKE 2 // 湖
138
-
139
- #define POND 3 // 池
140
-
141
- #define FIELD 4 // 草原
142
-
143
- #define GOAL 5 // 宝 (ゴール)
144
-
145
-
146
-
147
- // 行動
148
-
149
- #define EAST 0 // 東
150
-
151
- #define WEST 1 // 西
152
-
153
- #define SOUTH 2 // 南
154
-
155
- #define NORTH 4 // 北
156
-
157
- #define TrialNo 50 // 試行回数
158
-
159
- #define StateNum 6 // 状態数
160
-
161
- #define ActNum 4 // 行動数
162
-
163
- #define Alpha 0.1 // 学習率
164
-
165
- #define Gamma 0.9 // 減衰率
166
-
167
-
168
-
169
- #define Reward 10 // 報酬
170
-
171
-
172
-
173
- /*********************************************************************
174
-
175
- 乱数のシードの生成
176
-
177
- **********************************************************************/
178
-
179
- void init_rnd()
180
-
181
- {
182
-
183
- srand((unsigned int)time(NULL));
184
-
185
- }
186
-
187
-
188
-
189
- /********************************************************************
190
-
191
- 乱数の発生 (0〜1の乱数)
192
-
193
- ********************************************************************/
194
-
195
- double Random()
196
-
197
- {
198
-
199
- return((double)rand()/RAND_MAX);
200
-
201
- }
202
-
203
-
204
-
205
- /********************************************************************
206
-
207
- ルールの価値の初期化
208
-
209
- Qvalue[s][a] : 状態sにおいて行動aを取ることの価値
210
-
211
- ********************************************************************/
212
-
213
- void init_Q(double Qvalue[StateNum][ActNum])
214
-
215
- {
216
-
217
- int s,a;
218
-
219
-
220
-
221
- /* すべての状態と行動の価値を0にする */
222
-
223
- /*** この部分を自分で書く ***/
224
-
225
-
226
-
227
- }
228
-
229
-
230
-
231
- /********************************************************************
232
-
233
- 行動の選択 (ボルツマン選択)
234
-
235
- state : 状態
236
-
237
- Qvalue[s][a] : 状態sにおいて行動aを取ることの価値
238
-
239
- env[s][a] : 状態sにおいて行動aを取ったときに遷移する状態
240
-
241
- t : 試行回数
242
-
243
- ********************************************************************/
244
-
245
- int select_action(int state,
246
-
247
- double Qvalue[StateNum][ActNum],
248
-
249
- int env[StateNum-1][ActNum],int t)
250
-
251
- {
252
-
253
- double sum; // ルールの価値の合計
254
-
255
- int a; // 行動
256
-
257
- double r; // 乱数 (0~sumの間の乱数)
258
-
259
- double border; // 境界線
260
-
261
- double T=10; // 温度パラメータ
262
-
263
-
264
-
265
- /* 温度パラメータを設定 */
266
-
267
- T=T-t;
268
-
269
- if(T<=1) T=1;
270
-
271
-
272
-
273
- /* ルールの価値の合計を計算
274
-
275
- その状態で取れない行動(env[state][a]=-1)
276
-
277
- の価値は合計には含まない */
278
-
279
- /*** この部分を自分で書く ***/
280
-
281
-
282
-
283
-
284
-
285
- /* 0~sumの乱数を生成 */
286
-
287
- r = Random()*sum;
288
-
289
- border=0;
290
-
291
- for(a=0;a<ActNum;a++){
292
-
293
- /* 取ることのできる行動の中から行動を選択 */
294
-
295
- if(env[state][a]!=-1){
296
-
297
- border += exp(Qvalue[state][a]/T);
298
-
299
- }
300
-
301
- /* 選択された行動を返す */
302
-
303
- if(r<=border){
304
-
305
- return a;
306
-
307
- }
308
-
309
- }
310
-
311
- }
312
-
313
-
314
-
315
- /********************************************************************
316
-
317
- ルールの価値の更新
318
-
319
- Qvalue[s][a] : 状態sにおいて行動aを取ることの価値
320
-
321
- p_state : 直前の状態
322
-
323
- act : 行動
324
-
325
- state : 状態 (行動後の状態)
326
-
327
- r : 報酬
328
-
329
- ********************************************************************/
330
-
331
- void update_Q(double Qvalue[StateNum][ActNum],
332
-
333
- int p_state, int act, int state, int r)
334
-
335
- {
336
-
337
- int a;
338
-
339
- double max; // 行動後の状態から取ることのできる行動の中での価値の最大値
340
-
341
-
342
-
343
- /* 取ることのできる行動に関する価値の中で最大値を求める */
344
-
345
- /*** この部分を自分で書く ***/
346
-
347
-
348
-
349
-
350
-
351
- /* 状態p_stateにおいて行動actをとることの価値を更新 */
352
-
353
- /*** この部分を自分で書く ***/
354
-
355
-
356
-
357
- }
358
-
359
-
360
-
361
- /**************************************************************************
362
-
363
- メインプログラム
364
-
365
- **************************************************************************/
366
-
367
- int main()
368
-
369
- {
370
-
371
- int t;
372
-
373
- int s,a;
374
-
375
- int act; // 行動
376
-
377
- int p_state; // 直前の状態
378
-
379
- int state; // 状態
380
-
381
- double Qvalue[StateNum][ActNum]; // ルールの価値
382
-
383
- // 環境 (状態の遷移) 東 西 南 北
384
-
385
- int env[StateNum-1][ActNum]={{WOOD, -1, POND, -1}, // 入口
386
-
387
- {LAKE, START, FIELD,-1}, // 森
388
-
389
- {-1, WOOD, GOAL, -1}, // 湖
390
-
391
- {FIELD,-1, -1, START}, // 池
392
-
393
- {-1 ,POND, -1, WOOD}}; // 草原
394
-
395
- int count; // エピソードの長さ
396
-
397
- char *states[StateNum]={"入口","森","湖","池","草原","宝"}; // 状態(表示用)
398
-
399
- char *acts[ActNum]={"東","西","南","北"}; // 行動(表示用)
400
-
401
- FILE *fp; // ファイルポインタ
402
-
403
-
404
-
405
- /* 結果保存用のファイル(result.dat)をオープン */
406
-
407
- if((fp=fopen("result.dat","w"))==NULL){
408
-
409
- printf("main() : Cannot open \"result.dat\"\n");
410
-
411
- exit(1);
412
-
413
- }
414
-
415
-
416
-
417
- init_rnd(); /* 乱数の初期化 */
418
-
419
- init_Q(Qvalue); /* ルールの価値の初期化 */
420
-
421
-
422
-
423
- /* TrialNo回の試行を繰り返す */
424
-
425
- for(t=0;t<TrialNo;t++){
426
-
427
- printf("[%d]",t);
428
-
429
- state = START; /* 状態を初期化(STARTに設定) */
430
-
431
- count=0; /* エピソードの長さを0で初期化 */
432
-
433
- /* ゴールに到達するまで繰り返す */
434
-
435
- while(state!=GOAL){
436
-
437
- act=select_action(state,Qvalue,env,t); /* 行動を選択 */
438
-
439
- p_state=state; /* 状態を保存 */
440
-
441
- state=env[p_state][act]; /* 行動することにより状態が遷移 */
442
-
443
- /* ゴールに到達したら報酬を取得し、ルールの価値を更新 */
444
-
445
- if(state==GOAL){
446
-
447
- update_Q(Qvalue,p_state,act,state,Reward);
448
-
449
- }
450
-
451
- /* ルールの価値を更新(ゴール以外では報酬は0) */
452
-
453
- else{
454
-
455
- update_Q(Qvalue,p_state,act,state,0);
456
-
457
- }
458
-
459
- /* 状態と行動を画面に表示 */
460
-
461
- printf("%s==>(%s)==>",states[p_state],acts[act]);
462
-
463
- /* エピソードの長さを1増やす */
464
-
465
- count++;
466
-
467
- }
468
-
469
- /* 最終的な状態を画面に表示 */
470
-
471
- printf("%s\n",states[state]);
472
-
473
- /* 試行回数とエピソードの長さをファイルに出力 */
474
-
475
- fprintf(fp,"%d %d\n",t,count);
476
-
477
- }
478
-
479
- /* ファイルをクローズ */
480
-
481
- fclose(fp);
482
-
483
-
484
-
485
- /* 最終的なルールの価値保存用のファイルをオープン */
486
-
487
- if((fp=fopen("Q.dat","w"))==NULL){
488
-
489
- printf("main() : Cannot open \"Q.dat\"\n");
490
-
491
- exit(1);
492
-
493
- }
494
-
495
-
496
-
497
- /* ルールの価値をファイルに書き出す */
498
-
499
- fprintf(fp," 東 西 南 北\n");
500
-
501
- for(s=0;s<StateNum;s++){
502
-
503
- fprintf(fp,"%s\t",states[s]);
504
-
505
- for(a=0;a<ActNum;a++){
506
-
507
- fprintf(fp,"%6.3lf\t",Qvalue[s][a]);
508
-
509
- }
510
-
511
- fprintf(fp,"\n");
512
-
513
- }
514
-
515
-
516
-
517
- /* ファイルをクローズ */
518
-
519
- fclose(fp);
520
-
521
- }
522
-
523
-
524
-
525
-
526
-
527
-
528
-
529
-
530
-
531
- ###試したこと
532
-
533
- 理解できないところが多くて、手が付けられない状態です
534
-
535
- ###補足情報(言語/FW/ツール等のバージョンなど)
536
-
537
- Linax
538
-
539
- VMware player
540
-
541
- Ubuntu
542
-
543
- C言語
544
-
545
-
546
-
547
- 理想的な実行結果
548
-
549
- [0] 入口==>(南)==>池==>(東)==>草原==>(北)==>森==>(南)==>草原==>(西)==>池==>(北)==
550
-
551
- >入口==>(南)==>池==>(北)==>入口==>(東)==>森==>(東)==>湖==>(南)==>宝
552
-
553
- [1] 入口==>(南)==>池==>(北)==>入口==>(南)==>池==>(東)==>草原==>(西)==>池==>(東)==
554
-
555
- >草原==>(北)==>森==>(西)==>入口==>(東)==>森==>(西)==>入口==>(南)==>池==>(東)==>
556
-
557
- 草原==>(北)==>森==>(東)==>湖==>(南)==>宝
558
-
559
- [2] 入口==>(東)==>森==>(東)==>湖==>(南)==>宝
560
-
561
-
562
-
563
- [99] 入口==>(東)==>森==>(東)==>湖==>(南)==>宝
1
+ testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest

2

誤字の修正

2017/08/05 08:17

投稿

pure_storm
pure_storm

スコア16

test CHANGED
File without changes
test CHANGED
@@ -14,6 +14,102 @@
14
14
 
15
15
  穴埋め部分がわかりません
16
16
 
17
+ #####わからない部分
18
+
19
+ 問題の意味も、どうしたらいいかもわからない状態です
20
+
21
+ ######その1
22
+
23
+ ルールの価値の初期化
24
+
25
+ Qvalue[s][a] : 状態sにおいて行動aを取ることの価値
26
+
27
+ ****************************************************************/
28
+
29
+ void init_Q(double Qvalue[StateNum][ActNum])
30
+
31
+ {
32
+
33
+ int s,a;
34
+
35
+
36
+
37
+ /* すべての状態と行動の価値を0にする */
38
+
39
+ /* この部分を自分で書く */
40
+
41
+
42
+
43
+ }
44
+
45
+
46
+
47
+ ######その2
48
+
49
+ /* 温度パラメータを設定 */
50
+
51
+ T=T-t;
52
+
53
+ if(T<=1) T=1;
54
+
55
+
56
+
57
+ /* ルールの価値の合計を計算
58
+
59
+ その状態で取れない行動(env[state][a]=-1)
60
+
61
+ の価値は合計には含まない */
62
+
63
+ /*** この部分を自分で書く ***/
64
+
65
+
66
+
67
+ ######その3
68
+
69
+ /********************************************************************
70
+
71
+ ルールの価値の更新
72
+
73
+ Qvalue[s][a] : 状態sにおいて行動aを取ることの価値
74
+
75
+ p_state : 直前の状態
76
+
77
+ act : 行動
78
+
79
+ state : 状態 (行動後の状態)
80
+
81
+ r : 報酬
82
+
83
+ ********************************************************************/
84
+
85
+ void update_Q(double Qvalue[StateNum][ActNum],
86
+
87
+ int p_state, int act, int state, int r)
88
+
89
+ {
90
+
91
+ int a;
92
+
93
+ double max; // 行動後の状態から取ることのできる行動の中での価値の最大値
94
+
95
+
96
+
97
+ /* 取ることのできる行動に関する価値の中で最大値を求める */
98
+
99
+ /*** この部分を自分で書く ***/
100
+
101
+
102
+
103
+
104
+
105
+ /* 状態p_stateにおいて行動actをとることの価値を更新 */
106
+
107
+ /*** この部分を自分で書く ***/
108
+
109
+
110
+
111
+ }
112
+
17
113
 
18
114
 
19
115
  ###該当のソースコード
@@ -34,43 +130,43 @@
34
130
 
35
131
  // 状態
36
132
 
37
- #define START 0 // 入口 (スタート)
133
+ define START 0 // 入口 (スタート)
38
-
134
+
39
- define WOOD 1 // 森
135
+ define WOOD 1 // 森
40
-
136
+
41
- define LAKE 2 // 湖
137
+ define LAKE 2 // 湖
42
-
138
+
43
- define POND 3 // 池
139
+ define POND 3 // 池
44
-
140
+
45
- define FIELD 4 // 草原
141
+ define FIELD 4 // 草原
46
-
142
+
47
- define GOAL 5 // 宝 (ゴール)
143
+ define GOAL 5 // 宝 (ゴール)
48
144
 
49
145
 
50
146
 
51
147
  // 行動
52
148
 
53
- define EAST 0 // 東
149
+ define EAST 0 // 東
54
-
150
+
55
- define WEST 1 // 西
151
+ define WEST 1 // 西
56
-
152
+
57
- define SOUTH 2 // 南
153
+ define SOUTH 2 // 南
58
-
154
+
59
- define NORTH 4 // 北
155
+ define NORTH 4 // 北
60
-
156
+
61
- define TrialNo 50 // 試行回数
157
+ define TrialNo 50 // 試行回数
62
-
158
+
63
- define StateNum 6 // 状態数
159
+ define StateNum 6 // 状態数
64
-
160
+
65
- define ActNum 4 // 行動数
161
+ define ActNum 4 // 行動数
66
-
162
+
67
- define Alpha 0.1 // 学習率
163
+ define Alpha 0.1 // 学習率
68
-
164
+
69
- define Gamma 0.9 // 減衰率
165
+ define Gamma 0.9 // 減衰率
70
-
71
-
72
-
166
+
167
+
168
+
73
- define Reward 10 // 報酬
169
+ define Reward 10 // 報酬
74
170
 
75
171
 
76
172
 
@@ -465,101 +561,3 @@
465
561
 
466
562
 
467
563
  [99] 入口==>(東)==>森==>(東)==>湖==>(南)==>宝
468
-
469
-
470
-
471
- ##わからない部分
472
-
473
- 問題の意味も、どうしたらいいかもわからない状態です
474
-
475
- #その1
476
-
477
- ルールの価値の初期化
478
-
479
- Qvalue[s][a] : 状態sにおいて行動aを取ることの価値
480
-
481
- ****************************************************************/
482
-
483
- void init_Q(double Qvalue[StateNum][ActNum])
484
-
485
- {
486
-
487
- int s,a;
488
-
489
-
490
-
491
- /* すべての状態と行動の価値を0にする */
492
-
493
- /* この部分を自分で書く */
494
-
495
-
496
-
497
- }
498
-
499
-
500
-
501
- #その2
502
-
503
- /* 温度パラメータを設定 */
504
-
505
- T=T-t;
506
-
507
- if(T<=1) T=1;
508
-
509
-
510
-
511
- /* ルールの価値の合計を計算
512
-
513
- その状態で取れない行動(env[state][a]=-1)
514
-
515
- の価値は合計には含まない */
516
-
517
- /*** この部分を自分で書く ***/
518
-
519
-
520
-
521
- #その3
522
-
523
- /********************************************************************
524
-
525
- ルールの価値の更新
526
-
527
- Qvalue[s][a] : 状態sにおいて行動aを取ることの価値
528
-
529
- p_state : 直前の状態
530
-
531
- act : 行動
532
-
533
- state : 状態 (行動後の状態)
534
-
535
- r : 報酬
536
-
537
- ********************************************************************/
538
-
539
- void update_Q(double Qvalue[StateNum][ActNum],
540
-
541
- int p_state, int act, int state, int r)
542
-
543
- {
544
-
545
- int a;
546
-
547
- double max; // 行動後の状態から取ることのできる行動の中での価値の最大値
548
-
549
-
550
-
551
- /* 取ることのできる行動に関する価値の中で最大値を求める */
552
-
553
- /*** この部分を自分で書く ***/
554
-
555
-
556
-
557
-
558
-
559
- /* 状態p_stateにおいて行動actをとることの価値を更新 */
560
-
561
- /*** この部分を自分で書く ***/
562
-
563
-
564
-
565
- }

1

変更点:わからない部分の追記

2017/07/28 15:10

投稿

pure_storm
pure_storm

スコア16

test CHANGED
File without changes
test CHANGED
@@ -34,7 +34,7 @@
34
34
 
35
35
  // 状態
36
36
 
37
- define START 0 // 入口 (スタート)
37
+ #define START 0 // 入口 (スタート)
38
38
 
39
39
  define WOOD 1 // 森
40
40
 
@@ -465,3 +465,101 @@
465
465
 
466
466
 
467
467
  [99] 入口==>(東)==>森==>(東)==>湖==>(南)==>宝
468
+
469
+
470
+
471
+ ##わからない部分
472
+
473
+ 問題の意味も、どうしたらいいかもわからない状態です
474
+
475
+ #その1
476
+
477
+ ルールの価値の初期化
478
+
479
+ Qvalue[s][a] : 状態sにおいて行動aを取ることの価値
480
+
481
+ ****************************************************************/
482
+
483
+ void init_Q(double Qvalue[StateNum][ActNum])
484
+
485
+ {
486
+
487
+ int s,a;
488
+
489
+
490
+
491
+ /* すべての状態と行動の価値を0にする */
492
+
493
+ /* この部分を自分で書く */
494
+
495
+
496
+
497
+ }
498
+
499
+
500
+
501
+ #その2
502
+
503
+ /* 温度パラメータを設定 */
504
+
505
+ T=T-t;
506
+
507
+ if(T<=1) T=1;
508
+
509
+
510
+
511
+ /* ルールの価値の合計を計算
512
+
513
+ その状態で取れない行動(env[state][a]=-1)
514
+
515
+ の価値は合計には含まない */
516
+
517
+ /*** この部分を自分で書く ***/
518
+
519
+
520
+
521
+ #その3
522
+
523
+ /********************************************************************
524
+
525
+ ルールの価値の更新
526
+
527
+ Qvalue[s][a] : 状態sにおいて行動aを取ることの価値
528
+
529
+ p_state : 直前の状態
530
+
531
+ act : 行動
532
+
533
+ state : 状態 (行動後の状態)
534
+
535
+ r : 報酬
536
+
537
+ ********************************************************************/
538
+
539
+ void update_Q(double Qvalue[StateNum][ActNum],
540
+
541
+ int p_state, int act, int state, int r)
542
+
543
+ {
544
+
545
+ int a;
546
+
547
+ double max; // 行動後の状態から取ることのできる行動の中での価値の最大値
548
+
549
+
550
+
551
+ /* 取ることのできる行動に関する価値の中で最大値を求める */
552
+
553
+ /*** この部分を自分で書く ***/
554
+
555
+
556
+
557
+
558
+
559
+ /* 状態p_stateにおいて行動actをとることの価値を更新 */
560
+
561
+ /*** この部分を自分で書く ***/
562
+
563
+
564
+
565
+ }