Start_python’s diary

ふたり暮らし

アラフィフ夫婦のフリーランスプラン

Q-learning(Q学習)による倒立振子 (棒を立て続ける)

gymの倒立振子を使って強化学習Q-learning(Q学習)第1回

f:id:Start_python:20191125201903g:plain

500試行ほどの学習によりかなり安定して棒を支えられるようになりました。

プログラムのコードは

CartPoleでQ学習(Q-learning)を実装・解説【Phythonで強化学習:第1回】

こちらからそのまま使わせていただきました。

 

解説

変数 q_table 【重要】

「6の4乗」個と「2」個からなる二次元配列 (初期値は全て -1~1の乱数)

変数 state

4つの要素を6分割した値を6進数で表して、さらに十進数にしたもの (6個ずつの四次元配列を一次元配列に変換したときの何番目か)

np.argmax関数

action = np.argmax(q_table[state])

actionは、q_tableのstate番目にある配列の最大集合 (今回は2つしかないので数値が大きい方の配列番号、0か1)

例えば

カート位置 □□■□□□
カート速度 □■□□□□
棒の角度  □□□□■□
棒の角速度 □□□■□□

この位置にある数値[2つ]の大きい方の配列番号でactionが0か1かを決めます。

ε-greedy法

epsilon = 0.5 * (1 / (episode + 1))

1回目 0.25、2回目 0.167、3回目 0.125、、、の確率でactionをランダムで決めます。episode(試行回数)が大きくなると0に近くなります。

変数 reward

報酬と罰則。各ステップで立ってたら報酬 1を追加、こけたら罰則 -200にします。

関数 update_Qtable

# [3]Qテーブルを更新する関数 -------------------------------------
def update_Qtable(q_table, state, action, reward, next_state):
    gamma = 0.99
    alpha = 0.5
    next_Max_Q=max(q_table[next_state][0],q_table[next_state][1] )
    q_table[state, action] = (1 - alpha) * q_table[state, action] +
            alpha * (reward + gamma * next_Max_Q)

    return q_table

この部分の計算がQ学習だと思います。

np.zeros関数
例: np.zeros(5) は、[0. 0. 0. 0. 0.] となる

np.random.uniform関数
例: 1以上10未満の一様乱数3個の配列
np.random.uniform(1, 10, 3) は、[2.43895925 8.43729377 7.65803791]

 

 

関数def update_Qtableの部分がQ学習の全てだと思います。今は詳しい計算はわかりません。次回はこの部分を見える化してもう少し詳しく理解してみたいです。

 


参考サイト

qiita.com

qiita.com

 

 

保存ファイル

lesson43.py

 

 

文責:Luke