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.7941 (46ー3510) 720.51
ランダム(重み)8.6201 (26ー10480) 1054.50
記録(弱く)15.2243 (22ー1052)220.27
記録(強く)14.7151 (20ー590) 129.25
強化学習19.5746 (20ー13200)1790.46

結果を見ると得点は他のものより高い。黄色マスがある道をより多く通っていることが分かる。Actionの選択は、始めのうちはランダムで100回の試行の終わりに行くほどQテーブルに従ったものになる。終わりほど歩数が少なくなったので、この差が標準偏差に表れていそう。特に最後の3回は得点20、歩数20でほぼ理想的な行動となった(これはQテーブルに従った結果)。

簡単なサンプルなので、おそらく学習率α、割引率γを変更しても似たような結果になるだろうから、この辺りは、もう少し複雑な迷路で見てみたい。次は、通った経路の記録について見るつもり。