ノート

強化学習関連のこと

MENU

囚人のジレンマをランダムエージェントで実験

実験もくそもないけど、ちょっと実装してみます。

強化学習エージェントで実装する前にランダムエージェントで、

報酬関数が囚人のジレンマのゲームをやってみます。

問題設定

よくゲーム理論で用いられているものです。

1,2 協調(C) 裏切り(D)
協調(C) 6, 6 2,7
裏切り(D) 7,2 0,0

ランダムエージェント

ランダムで行動選択をするエージェントです

実験結果

単純に何回か行動選択して、

得られた報酬の平均をプロットしてみます。

python run_random.py

agent0s average reward:3.75736
agent1s average reward:3.75341

ソースコード

以下の3つのプログラムから構成されています

  • 実行用のプログラム(run_random.py)、
  • gameプログラム(games/simple_game.py)、
  • randomエージェント(agents/random_agent.py)

GitHub - Tcom242242/multi-agent-learning

ファイル構成

├── agents
│   └── random_agent.py
├── games
│   ├── game.py
│   └── simple_game.py
└── run_random.py

run_random.py

import os, sys
sys.path.append(os.getcwd())
from games.game import Game
import time
from tqdm import tqdm
import numpy as np
from agents.random_agent import RandomAgent
from games.simple_game import SimpleGame

if __name__ == '__main__':
    nb_agents = 2
    agents = []

    for idx in range(nb_agents):
        agent = RandomAgent(action_list=np.arange(2))
        agents.append(agent)

    game = SimpleGame(nb_steps=100000, agents=agents)
    game.run()
    # print results
    for idx, agent in enumerate(agents):
        print("agent{}s average reward:{}".format(idx, np.mean(agent.rewards)))

games/game.py

from abc import ABCMeta, abstractmethod


class Game(metaclass=ABCMeta):

    @abstractmethod
    def run(self):
        pass

games/simple_game.py

import os, sys
sys.path.append(os.getcwd())
from games.game import Game
from tqdm import tqdm
import numpy as np

class SimpleGame(Game):
    """
        シンプルなmatrix gameを強化学習でやってみる
    """
    def __init__(self, nb_eps=1, nb_steps=10000,agents=None):
        self.agents = agents
        self.nb_steps = nb_steps
        self.nb_eps = nb_eps
        self.reward_matrix = self._create_reward_table()

    def _reset_agents(self):
        for agent in self.agents:
            from_s = agent.state
            to_s = agent.init_state()
            self.env.force_move(int(from_s), int(to_s))

    def run(self):
        all_log = []
        for eps in range(self.nb_eps):
            social_rewards = []
            for step in tqdm(range(self.nb_steps)):
                a0, a1 = self.agents[0].act(), self.agents[1].act()
                r0, r1 = self.reward_matrix[a0][a1]
                social_rewards.append(r0+r1)
                self.agents[0].get_reward(r0)
                self.agents[1].get_reward(r1)

        social_rewards = np.array(social_rewards)
        return {"social_rewards":social_rewards}


    def _create_reward_table(self):
        """
            囚人のジレンマやチキン・ゲームなど、各ゲームに合わせて報酬行列を定義
        """
        reward_matrix = [
                            [[6, 6], [2, 7]],
                            [[7, 2], [0, 0]]
                        ]

        return reward_matrix

    def game_log(self):
        pass

    def get_conf(self):
        pass

agents/random_agent.py

import numpy as np
import random

class RandomAgent():
    def __init__(self, action_list=None):
        self.action_list = action_list  # 選択肢
        self.rewards = []

    def act(self, q_values=None):
        action_id = random.randint(0, (len(self.action_list)-1))
        action = self.action_list[action_id]
        return action

    def get_reward(self, reward):
        self.rewards.append(reward)