実験もくそもないけど、ちょっと実装してみます。
ランダムエージェントで、報酬関数が囚人のジレンマのゲームをやってみます。
問題設定
よくゲーム理論で用いられているものです。
1,2 | 協調(C) | 裏切り(D) |
---|---|---|
協調(C) | 6, 6 | 2,7 |
裏切り(D) | 7,2 | 0,0 |
ランダムエージェント
ランダムで行動選択をするエージェントです
ソースコード
以下の3つのプログラムから構成されています
- 実行用のプログラム(run_random.py)、
- gameプログラム(games/simple_game.py)、
- randomエージェント(agents/random_agent.py)
ファイル構成
├── agents │ └── random_agent.py ├── games │ ├── game.py │ └── simple_game.py └── run_random.py
run_random.py
from games.simple_game import SimpleGame
from agents.random_agent import RandomAgent
import numpy as np
import os
import sys
sys.path.append(os.getcwd())
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()
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 numpy as np
from tqdm import tqdm
from games.game import Game
import os
import sys
sys.path.append(os.getcwd())
class SimpleGame(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):
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
agents/random_agent.py
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)
実験結果
単純に何回か行動選択して、
得られた報酬の平均をプロットしてみます。
python run_random.py
agent0s average reward:3.75736
agent1s average reward:3.75341
コメント