ノート

強化学習関連のこと

MENU

【強化学習】シンプルなマルチアームバンディットプログラムの作成

進捗1

目的

強化学習の様々な行動選択手法を実験的に試したい

進捗

マルチアームバンディットプログラムの実装(シンプルな)。

マルチアームバンディット問題

マルチアームバンディット問題は、 スロットマシンに複数のレバーがついているスロットマシーンを あるプレーヤーがプレイし、より多くの報酬を得ることを目標とするゲーム。 レバー毎に得られる報酬の値(もしくは当たる確率分布)が異なる。

現状は、各アームの報酬はランダムで設定。

プログラム

import random
import numpy as np
import matplotlib.pyplot as plt

class Arm():
    def __init__(self, idx):
        self.value = random.random()    # ランダムでこのアームを引いた時の報酬を設定

    def pull(self):
        return self.value

class MultiArmBandit():
    def __init__(self, nb_arm):
        self.arms = self._init_arms(nb_arm)

    def _init_arms(self, nb_arm):
        arms = []
        for i in range(nb_arm):
            arms.append(Arm(i))

        return arms

    def step(self, arm_id):
        """
            pull lever
        """
        return self.arms[arm_id].pull()

if __name__ == '__main__':
    game = MultiArmBandit(nb_arm=5) # 5本のアームを設定
    nb_step = 100   #ステップ数
    rewards = []
    for step in range(nb_step):
        reward = game.step(random.randint(0, 4))
        rewards.append(reward)

    plt.plot(np.arange(nb_step), rewards)
    plt.ylim(0, 1)
    plt.savefig("result1.png")
    plt.show()

結果

f:id:ttt242242:20180531213520p:plain