Python(強化学習の試し02_過去の試行3つ分で学習)

■学習するコードの試し。
前回サンプルコードを作成したので、学習するコードの試しを行っていきたい。
サンプルコードの条件は下のようなもの
・ボタン(0と1)がある状態で、どちらかを押す想定。
・0を押した後に1を押すと報酬として1が追加される。
・試行は10回。
過去に押したものを記憶しているという想定で、3つ前までの結果を使う。これに基づいてActionを決めて報酬を得る。とりあえず、3つの結果を2進数表示と考えて、0~7までの8通りの結果があると見なす。それに対して、Actionで0か1を入れたときの報酬を考えてみた。


学習のコードが下。3回結果が得られるまではランダム。

def getAction(self, history):
    val = 0
    action = 0
    if (len(history) >= 3):
        for i in range(len(history)):
            if len(history) - i <= 3:
                val = val + (history[i] * 2 ** ((len(history) - i - 1)))
                a = np.where(self._Qtable[val] == self._Qtable[val].max())[0]
                action = np.random.choice(a)
    else:
        action = np.random.choice([0, 1])

    return action

def updateSelectAction(self, curhistory, action, reward):
    gamma = 0.9
    alpha = 0.5
    val = 0
    if (len(curhistory) >= 3):
        for i in range(len(curhistory)):
            if len(curhistory) - i <= 3:
                val = val + (curhistory[i] * 2 ** ((len(curhistory) - i - 1)))

        self._Qtable[val, action] = (1 - alpha) * self._Qtable[val, action] + alpha * (
                reward + gamma * self._Qtable[val, action])
    return self._Qtable

このコードを実行させた結果の1つが下。1回目が0で、その後はずっと1になっている。他の場合も0か1に固定されていく感じ。報酬は初めの0,1のみなのでReward:1だけ。


Qtable内の数字は試行を重ねるごとに更新されているので、学習は進んでいるはず。更新の式をもう少し改良したい。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です