質問編集履歴

1

全体のソースコードを記載・更新いたしました。

2019/12/04 11:08

投稿

nori0519
nori0519

スコア16

test CHANGED
File without changes
test CHANGED
@@ -130,7 +130,543 @@
130
130
 
131
131
  ```
132
132
 
133
-
133
+ ###全ソースコード
134
+
135
+ ```
136
+
137
+ #1.環境の設計
138
+
139
+
140
+
141
+ puts"グリッドワールドの大きさを教えてください。(n×n)"
142
+
143
+ n = gets.to_i
144
+
145
+ puts"n:#{n}"
146
+
147
+ #グリッドワールドの大きさを取得する。
148
+
149
+ puts"エージェントの人数を教えてください。"
150
+
151
+ enum =gets.to_i
152
+
153
+ #エージェントがスタートに設置されて、矢印の長さを更新されるまでの過程を何回くりかえすか。(エージェントの個数)
154
+
155
+ puts"エージェントの寿命は何ステップですか。"
156
+
157
+ elife =gets.to_i
158
+
159
+ #エージェントの寿命の指定
160
+
161
+ x =0
162
+
163
+ y =0
164
+
165
+ #現在座標
166
+
167
+ gx_h =[]
168
+
169
+ gy_h =[]
170
+
171
+ #ゴールの座標の記録
172
+
173
+ arrow =Array.new(n).map {Array.new(n,0)}
174
+
175
+ #グリッドワー ルド作成
176
+
177
+ gx =rand(0..n-1)
178
+
179
+ gy =rand(0..n-1)
180
+
181
+ puts"goal(x,y):(#{gx},#{gy})"
182
+
183
+ #グリッドワールドの任意の位置にゴールを設置
184
+
185
+ #gx_h[k]=gx
186
+
187
+ #gy_h[k]=gy
188
+
189
+ #ゴールの座標を記録
190
+
191
+ u =Array.new(n).map{Array.new(n,0)}
192
+
193
+ d =Array.new(n).map{Array.new(n,0)}
194
+
195
+ r =Array.new(n).map{Array.new(n,0)}
196
+
197
+ l =Array.new(n).map{Array.new(n,0)}
198
+
199
+ #上下左右の矢印の長さを格納
200
+
201
+ history_x =[]
202
+
203
+ history_y =[]
204
+
205
+ =begin
206
+
207
+ u_h =[]
208
+
209
+ d_h =[]
210
+
211
+ r_h =[]
212
+
213
+ l_h =[]
214
+
215
+ =end
216
+
217
+ #エージェントの過去の移動履歴
218
+
219
+ p =1
220
+
221
+ #エージェントがゴールに到達した際の総報酬
222
+
223
+ t =1
224
+
225
+ #ゴールからさかのぼったエージェントのステップ数(ゴールからtステップ前)
226
+
227
+ e_g =0
228
+
229
+ #ゴールしたエージェントの数
230
+
231
+ puts"n-1:#{n-1}"
232
+
233
+
234
+
235
+ u[0][0]=0 #(0,0)
236
+
237
+ l[0][0]=0
238
+
239
+ d[0][0]=0.5
240
+
241
+ r[0][0]=0.5
242
+
243
+ puts"四つ角"
244
+
245
+ puts"u[0][0]:#{u[0][0]}"
246
+
247
+ puts"d[0][0]:#{d[0][0]}"
248
+
249
+ puts"r[0][0]:#{r[0][0]}"
250
+
251
+ puts"l[0][0]:#{l[0][0]}"
252
+
253
+
254
+
255
+ d[n-1][0]=0 #(0,n-1)
256
+
257
+ l[n-1][0]=0
258
+
259
+ u[n-1][0]=0.5
260
+
261
+ r[n-1][0]=0.5
262
+
263
+ puts"u[#{n-1}][0]:#{u[n-1][0]}"
264
+
265
+ puts"d[n-1][0]:#{d[n-1][0]}"
266
+
267
+ puts"r[n-1][0]:#{r[n-1][0]}"
268
+
269
+ puts"l[n-1][0]:#{l[n-1][0]}"
270
+
271
+
272
+
273
+ u[0][n-1]=0 #(n-1,0)
274
+
275
+ r[0][n-1]=0
276
+
277
+ d[0][n-1]=0.5
278
+
279
+ l[0][n-1]=0.5
280
+
281
+ puts"u[0][#{n-1}]:#{u[0][n-1]}"
282
+
283
+ puts"d[0][n-1]:#{d[0][n-1]}"
284
+
285
+ puts"r[0][n-1]:#{r[0][n-1]}"
286
+
287
+ puts"l[0][n-1]:#{l[0][n-1]}"
288
+
289
+
290
+
291
+ d[n-1][n-1]=0 #(n-1,n-1)
292
+
293
+ r[n-1][n-1]=0
294
+
295
+ u[n-1][n-1]=0.5
296
+
297
+ l[n-1][n-1]=0.5
298
+
299
+ puts "u[#{n-1}][#{n-1}]:#{u[n-1][n-1]}"
300
+
301
+ puts "d[n-1][n-1]:#{d[n-1][n-1]}"
302
+
303
+ puts "r[n-1][n-1]:#{r[n-1][n-1]}"
304
+
305
+ puts "l[n-1][n-1]:#{l[n-1][n-1]}"
306
+
307
+ puts"__________________________________"
308
+
309
+ #四つ角
310
+
311
+ for i in 1..n-2 do
312
+
313
+ u[0][i] =0 #上側
314
+
315
+ d[0][i] =0.3
316
+
317
+ r[0][i] =0.3
318
+
319
+ l[0][i] =0.4
320
+
321
+ puts"上側"
322
+
323
+ puts"u(#{i},0):#{u[0][i]}"
324
+
325
+ puts"d(#{i},0):#{d[0][i]}"
326
+
327
+ puts"r(#{i},0):#{r[0][i]}"
328
+
329
+ puts"l(#{i},0):#{l[0][i]}"
330
+
331
+ puts"__________________________________"
332
+
333
+
334
+
335
+ d[n-1][i] =0 #下側
336
+
337
+ u[n-1][i] =0.3
338
+
339
+ r[n-1][i] =0.3
340
+
341
+ l[n-1][i] =0.4
342
+
343
+ puts"下側"
344
+
345
+ puts"u(#{i},#{n-1}):#{u[n-1][i]}"
346
+
347
+ puts"d(#{i},#{n-1}):#{d[n-1][i]}"
348
+
349
+ puts"r(#{i},#{n-1}):#{r[n-1][i]}"
350
+
351
+ puts"l(#{i},#{n-1}):#{l[n-1][i]}"
352
+
353
+ puts"__________________________________"
354
+
355
+
356
+
357
+ l[i][0]=0 #左側
358
+
359
+ u[i][0]=0.3
360
+
361
+ d[i][0]=0.3
362
+
363
+ r[i][0]=0.4
364
+
365
+ puts"左側"
366
+
367
+ puts"u(0,#{i}):#{u[i][0]}"
368
+
369
+ puts"d(0,#{i}):#{d[i][0]}"
370
+
371
+ puts"r(0,#{i}):#{r[i][0]}"
372
+
373
+ puts"l(0,#{i}):#{l[i][0]}"
374
+
375
+ puts"__________________________________"
376
+
377
+
378
+
379
+ r[i][n-1]=0 #右側
380
+
381
+ u[i][n-1]=0.3
382
+
383
+ d[i][n-1]=0.3
384
+
385
+ l[i][n-1]=0.4
386
+
387
+ puts"右側"
388
+
389
+ puts"u(#{n-1},#{i}):#{u[i][n-1]}"
390
+
391
+ puts"d(#{n-1},#{i}):#{d[i][n-1]}"
392
+
393
+ puts"r(#{n-1},#{i}):#{r[i][n-1]}"
394
+
395
+ puts"l(#{n-1},#{i}):#{l[i][n-1]}"
396
+
397
+ puts"__________________________________"
398
+
399
+ end
400
+
401
+ #残りの壁
402
+
403
+ #境界線の作成(確率を0にする。)ついでに他の方向の矢印にも確立を格納する。(環境の初期化)
404
+
405
+
406
+
407
+ for i in 1..n-2 do
408
+
409
+ for j in 1..n-2 do
410
+
411
+ u[i][j]=0.25
412
+
413
+ d[i][j]=0.25
414
+
415
+ r[i][j]=0.25
416
+
417
+ l[i][j]=0.25
418
+
419
+ puts"他のグリッド"
420
+
421
+ puts"u(#{j},#{i}):#{u[i][j]}"
422
+
423
+ puts"d(#{j},#{i}):#{d[i][j]}"
424
+
425
+ puts"r(#{j},#{i}):#{r[i][j]}"
426
+
427
+ puts"l(#{j},#{i}):#{l[i][j]}"
428
+
429
+ puts"__________________________________"
430
+
431
+ end
432
+
433
+ end
434
+
435
+ #他のグリッドに確率を格納(等確立の0.25)
436
+
437
+
438
+
439
+ #_________________________________________________________________________________________________________________________
440
+
441
+
442
+
443
+ #2.学習
444
+
445
+ for k in 1..enum do #エージェントの個数分繰り返す。
446
+
447
+
448
+
449
+ sx =rand(0..n-1)
450
+
451
+ sy =rand(0..n-1)
452
+
453
+ puts"start(x,y):(#{sx},#{sy})"
454
+
455
+ #startを,グリッドワールドにランダムに格納
456
+
457
+
458
+
459
+ ex =sx
460
+
461
+ ey =sy
462
+
463
+ puts"エージェントの座標(ex,ey):(#{ex},#{ey})"
464
+
465
+ #エージェントの作成(スタート地点に設置)
466
+
467
+
468
+
469
+ for h in 0..elife-1 do #hはエージェント寿命である。四つの矢印の長さを使って確率的に移動する。もしゴールについたらforから脱出する。
470
+
471
+ sum = u[ey][ex] + d[ey][ex] + r[ey][ex] + l[ey][ex]
472
+
473
+ ra =rand(0..999)/999.to_f
474
+
475
+ puts"移動前のエージェントの座補(x,y)=(#{ex},#{ey})"
476
+
477
+ puts"sum:#{sum}"
478
+
479
+ puts"ra:#{ra}"
480
+
481
+ puts"u:#{u[ey][ex]}"
482
+
483
+ puts"d:#{d[ey][ex]}"
484
+
485
+ puts"l:#{l[ey][ex]}"
486
+
487
+ puts"r:#{r[ey][ex]}"
488
+
489
+
490
+
491
+ if ex==gx && ey==gy#スタート地点とゴール地点が同じ場合、終了する。(そのエージェントはゴールする。ただし、報酬なし)
492
+
493
+ e_g+=1#ゴールしたエージェントのカウント
494
+
495
+
496
+
497
+ break
498
+
499
+ puts"_________________________________エージェント#{enum}人目ゴール"
500
+
501
+ end
502
+
503
+ =begin
504
+
505
+ u_c =u[ey][ex] / sum
506
+
507
+ puts "u_c:#{u_c}"
508
+
509
+ =end
510
+
511
+ if ra<u[ey][ex]/sum
512
+
513
+ history_x[h] =ex
514
+
515
+ history_y[h] =ey #エージェントの経路記録
516
+
517
+
518
+
519
+ #u_h[h]=1#エージェントがどちらに行ったのかの軌跡の記録
520
+
521
+
522
+
523
+ ey =ey-1
524
+
525
+ elsif ra < (u[ey][ex]+d[ey][ex]) / sum
526
+
527
+ history_x[h] =ex
528
+
529
+ history_y[h] =ey
530
+
531
+
532
+
533
+ #d_h[h]=1
534
+
535
+ ey =ey+1
536
+
537
+ elsif ra < (u[ey][ex]+d[ey][ex]+r[ey][ex]) / sum
538
+
539
+ history_x[h] =ex
540
+
541
+ history_y[h] =ey
542
+
543
+
544
+
545
+ #r_h[h]=1
546
+
547
+
548
+
549
+ ex =ex-1
550
+
551
+ else
552
+
553
+ history_x[h] =ex
554
+
555
+ history_y[h] =ey
556
+
557
+
558
+
559
+ #l_h[h]=1
560
+
561
+
562
+
563
+ ex =ex+1
564
+
565
+ end
566
+
567
+
568
+
569
+ puts"移動前のエージェントの座標(x,y):(#{history_x[h]},#{history_y[h]})(履歴から引用)"
570
+
571
+ puts"移動後のエージェントの座標(x,y):(#{ex},#{ey})"
572
+
573
+ puts"________*________*____________*_______________*__________"
574
+
575
+
576
+
577
+ if ex==gx && ey==gy
578
+
579
+ T =h#エージェントの移動距離(エージェントの寿命)
580
+
581
+ puts"逆順前"#配列を逆順にする(先入先出法の実現)
582
+
583
+ p history_x
584
+
585
+ p history_y
586
+
587
+
588
+
589
+ history_x.reverse
590
+
591
+ history_y.reverse
592
+
593
+
594
+
595
+ puts"逆順後"
596
+
597
+ p history_x
598
+
599
+ p history_y
600
+
601
+
602
+
603
+ for rb in 0..h do #rollback(ここで報酬を分配する。)
604
+
605
+ e_g+=1#ゴールしたエージェントのカウント
606
+
607
+
608
+
609
+ if history_x[h] ==history_x[h-1]&&history_y[h]>history_y[h-1]
610
+
611
+ u[history_x[h-1]][history_y[h-1]] = u[history_x[h-1]][history_y[h-1]]+p*(T-t+1/T)
612
+
613
+ elsif history_x[h]==history_x[h-1]&&history_y[h]<history_y[h-1]
614
+
615
+ d[history_x[h-1]][history_y[h-1]] = d[history_x[h-1]][history_y[h-1]]+p*(T-t+1/T)
616
+
617
+ elsif history_x[h]>history_x[h-1]&&history_y[h]==history_y[h-1]
618
+
619
+ r[history_x[h-1]][history_y[h-1]] = r[history_x[h-1]][history_y[h-1]]+p*(T-t+1/T)
620
+
621
+ else
622
+
623
+ l[history_x[h-1]][history_y[h-1]] = l[history_x[h-1]][history_y[h-1]]+p*(T-t+1/T)
624
+
625
+ end
626
+
627
+ t+=1#エージェントのtステップ前の更新
628
+
629
+ =begin
630
+
631
+ u_h[h]=nil
632
+
633
+ d_h[h]=nil
634
+
635
+ r_h[h]=nil
636
+
637
+ l_h[h]=nil
638
+
639
+ =end
640
+
641
+ end
642
+
643
+ history_x.clear #エージェントの履歴をリセットする。
644
+
645
+ history_y.clear
646
+
647
+ break
648
+
649
+ end
650
+
651
+ end
652
+
653
+ end
654
+
655
+
656
+
657
+ puts"ゴールしたエージェントの数:#{e_g}"
658
+
659
+
660
+
661
+
662
+
663
+
664
+
665
+
666
+
667
+
668
+
669
+ ```
134
670
 
135
671
  ### 試したこと
136
672