Acrobot2009

はじめに

ここではサンプルプログラムを紹介します,これは強化学習エージェントがAcrobot課題を行うプログラムですが,基本的に参考なので力のある人は自作してより良いものを作ってください.以下に,レポート課題を進める上でのヒントを書いておきます.


このページは,InternetExplorerを推奨しています(FireFoxでも見られることを確認しています).もし,ページが見られない場合は山根(yamane@bcl.esys.tsukuba.ac.jp)までご連絡いただければ対応します.



プログラム開発環境

サンプルプログラムは基本的にC言語(C++)で書かれています.C言語に限らず自分の環境で課題に取り組んでいただきたいのですが,以下では環境が無い人のために,簡単にWindowsにおける環境構築の一例を紹介します.

無料で公開されているVisual C++ 2008 Express Editionを使います.Visual C++のインストールと使い方はこちらを参照してください.

発展として,グラフィックにアクロボットの動きを観察したいという人は,Processingを使ってプログラミングすることも出来ます.言語としてはJavaやC言語に近くリファレンスも充実しています.また,環境を整えるのも簡単で,こちらからダウンロードするとインストール無しで使用できます.



コンパイルと動作

まずはコンパイルをします.

C:\hogehoge>cl Acrobot.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

Acrobot.cpp
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.

/out:Acrobot.exe
Acrobot.obj
C:\hogehoge>

次に,プログラムを動かします.

C:\hogehoge>Acrobot.exe
Episode:0 Time:50.00
Episode:1 Time:50.00
Episode:2 Time:50.00
Episode:3 Time:50.00
Episode:4 Time:50.00
Episode:5 Time:43.50
Episode:6 Time:50.00
Episode:7 Time:50.00
Episode:8 Time:50.00
30.90    0    (0.0000)     0.17    -0.06    -0.48    0.04    -1.426

実行すると,文字と数値が画面に出力されます.これらの意味は,順番に[エピソード数][エピソード終了時の経過時間]を表しています.

また,一番下の列は,[現在の時間][選択した行動(左行動なら0,右行動なら1)],括弧付きは[Q値],次に[状態を表す4変数],最後は[リンク2の足先の高さ]を表しています.

状態を表す4変数は,[リンク1の角度][リンク1の角速度][リンク2の角度][リンク2の角速度]から成り,-1〜1の範囲に正規化されています.

これら出力部分は,自分で適切に書き直してください.



パラメータの変更

ここでは,基本的なパラメータをいじってみます.

まず,最大経過時間と最大エピソード数を変更してみましょう.

13
14
#define TL 50.0
#define EPI 1000

次に,テーブルの分割の細かさを調整してみましょう.ただし,プログラムの都合上,奇数を指定してください.

27
#define GRID 21

最後に,強化学習のパラメータを変更してみます.学習率α,割引率γ,ランダム行動をとる確率εを様々な値にして実験してみましょう.

45
46
47
double alpha=1.0;
double gamma=0.95;
double e_greedy=0.00;



高度な改造のヒント

ここでは高度に改造して自分のプログラムを作る時の,ヒントを書いておきます.

(1)自作の評価関数を作りましょう.そのためには,166〜181行目のout関数と221〜236行目のlearn関数を改造する必要があります.

out関数は,現在状態(4変数)と行動(0又は1)を与えるとQ値を返す関数です.オリジナルは単純なテーブル(配列)参照になっています.また,learn関数は,取った行動とその結果として得られた報酬を基に正しいQ値を更新する関数です.具体的には,新しいQ値(newQ)を計算し,その値になるように(もしくは,近づくように)out関数を更新することになります.

多項式近似,タイルコーディング,RBFN(放射状基底関数ネットワーク),やニューラルネットなどなど,多くの関数近似器があります.

*どうしてもよく分からない場合のために,RBFN版をこっそり置いておきます.

(2)強化学習のアルゴリズムをQ学習から変えてみましょう.221〜236行目のlearn関数を改造する必要があります.

(3)条件に応じて報酬の与え方をよりシンプルなものに変えてみましょう(例えば,リンク2の足先がある高さ以上になったときだけ報酬を与え,それ以外は報酬を与えないなど).改造するところは,238〜254行目のreward関数です.

初期設定では,リンク2の足先が1[m]を超えたらゴールで200.0の報酬を与え,リンク1の角度が±1度であれば罰として-10.0を与え,それ以外は0の報酬を与えるようになっている.

238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
/*reward function*/
double reward(){
    /*
        conditions:
        height of tip > 1.0 => reward 200.0, episode end
        th1 < 1 degree => reward -10.0
        normal => reward 0.0
    */

    if(-(cos(th1)*cos(th2)-sin(th1)*sin(th2)+cos(th1))>1.0){
        Goalflag=1;
        return 200.0;
    }else if(th1*th1<1.0*Degree*Degree){
        return -10.0;
    }
    return 0.0;
}



その他

以下に使用した関数についてメモを残しておきます.サンプルプログラムについての質問は山根までどうぞ.



追加情報

ここでは,質問に対する答えやバグレポートなどを載せるつもりです.

[2009.02.17]
Q1.コンパイルしたらエラーが出ました.どうやら変数counterが初期化されていないようです.
A1.main関数で宣言しているcounterをcounter=0と書き直してください.

[2009.02.06]
Q0.コンパイルしたらエラーが出ました.どうやら変数gammaが使えません.
A0.名前をgamとかに変更してください.