Python(強化学習の試し08_迷路03_強化学習)
■迷路サンプルで強化学習の試し。
強化学習のコードを追加して、動作確認した。
Actionの選択とQテーブルの更新のコードは下のもの。Qテーブルは[11, 11, 4] (縦、横、Action数)としている。
def get_action(py, px, epsilon):
if epsilon > np.random.uniform(0, 1):
next_action = np.random.choice([0, 1, 2, 3])
else:
a = np.where(Qtable[py - 1][px - 1] == Qtable[py - 1][px - 1].max())[0]
next_action = np.random.choice(a)
return next_action
def update_Qtable(py, px, action, reward, next_py, next_px):
gamma = 0.5
alpha = 0.1
next_maxQ = max(Qtable[next_py - 1][next_px - 1])
Qtable[py - 1, px - 1, action] = (1 - alpha) * Qtable[py - 1, px - 1, action] + alpha * (reward + gamma * next_maxQ)
return Qtable
epsilon は、100回の試行で割った直線的なもの。100回目に近づくほど、Qテーブルに基づいたActionが選択される。Actionは、0(左)、1(右)、2(上)、3(下)から選択。前回のランダムなどの試しでは、移動できる道からランダムで選択としていたけど、今回は報酬部分で移動できる道と壁の間に差を作った。報酬は、移動できる道を選択した場合は+1(壁では0)、黄色マスに行く場合は+10、ゴール(右下のマス)に行く場合は+20とした。
100回試した結果が表の一番下(他のものは前回の結果)。
得点平均 | 歩数平均(最大ー最小) | 歩数標準偏差 | |
ランダム | 15.7 | 941 (46ー3510) | 720.51 |
ランダム(重み) | 8.6 | 201 (26ー10480) | 1054.50 |
記録(弱く) | 15.2 | 243 (22ー1052) | 220.27 |
記録(強く) | 14.7 | 151 (20ー590) | 129.25 |
強化学習 | 19.5 | 746 (20ー13200) | 1790.46 |
結果を見ると得点は他のものより高い。黄色マスがある道をより多く通っていることが分かる。Actionの選択は、始めのうちはランダムで100回の試行の終わりに行くほどQテーブルに従ったものになる。終わりほど歩数が少なくなったので、この差が標準偏差に表れていそう。特に最後の3回は得点20、歩数20でほぼ理想的な行動となった(これはQテーブルに従った結果)。
簡単なサンプルなので、おそらく学習率α、割引率γを変更しても似たような結果になるだろうから、この辺りは、もう少し複雑な迷路で見てみたい。次は、通った経路の記録について見るつもり。