tests.test_ai_simulation
1import sys 2import argparse 3import unittest 4import time 5import statistics 6import math 7import pickle 8import numpy 9from hanabiapp.game.game_manager import Game 10from hanabiapp.game.agent.random_agent import RandomAgent 11from hanabiapp.game.agent.random_agent_pyhanabi import PyhanabiRandomAgent 12from hanabiapp.game.agent.simple_agent import SimpleAgent 13from hanabiapp.game.agent.internal_state_agent import InternalStateAgent 14from hanabiapp.game.agent.intentional_agent import IntentionalAgent 15from hanabiapp.game.agent.human_cui_agent import HumanCUIAgent 16 17def set_ai_ins(ai_name, player_number): 18 """ 19 指定された AI のインスタンスを作成する関数. 20 21 Args: 22 ai_name (str): 使用する AI の名前(例: "random", "simple", "internal") 23 player_number (int): プレイヤーの番号 24 25 Returns: 26 Agent: 指定された AI のインスタンス 27 """ 28 cui_name = ai_name + "-" + str(player_number) 29 if ai_name == "random": 30 return RandomAgent(name=cui_name, player_number=player_number) 31 elif ai_name == "pyrandom": 32 return PyhanabiRandomAgent(name=cui_name, player_number=player_number) 33 elif ai_name == "simple": 34 return SimpleAgent(name=cui_name, player_number=player_number) 35 elif ai_name == "internal": 36 return InternalStateAgent(name=cui_name, player_number=player_number) 37 elif ai_name == "intentional": 38 return IntentionalAgent(name=cui_name, player_number=player_number) 39 elif ai_name == "human": 40 return HumanCUIAgent(name=cui_name, player_number=player_number) 41 42def set_players(game_num,ai_args, is_reverse): 43 """ 44 指定された AI でプレイヤーリストを作成する関数. 45 46 - `is_reverse` が False の場合,固定の順序でプレイヤーを設定する. 47 - `is_reverse` が True の場合,ゲーム番号が偶数か奇数かによってプレイヤーの順序を変更する. 48 49 Args: 50 game_num (int): ゲームの番号 51 ai_args (list): 2つの AI の名前が入ったリスト 52 is_reverse (bool): 順序をランダムにするかどうか 53 54 Returns: 55 list: 作成されたプレイヤーリスト 56 """ 57 if is_reverse is False: 58 return [set_ai_ins(ai_args[0], 0),set_ai_ins(ai_args[1], 1)] 59 else: 60 if game_num%2 == 1: 61 # print(ai_args[0],ai_args[1]) 62 return [set_ai_ins(ai_args[0], 0),set_ai_ins(ai_args[1], 1)] 63 elif game_num%2 == 0: 64 # print(ai_args[1],ai_args[0]) 65 return [set_ai_ins(ai_args[1], 0),set_ai_ins(ai_args[0], 1)] 66 67 68def main(num_games, ai_args): 69 """ 70 指定された回数分,AI 同士の対戦をシミュレーションする関数. 71 72 - `num_games` が `CUI_VIEW_GAME_NUM` を超える場合,CUI モードを無効化する. 73 - 各ゲームのスコアを記録し,複数回の対戦結果の統計情報(平均・標準偏差)を表示する. 74 - 10,000 ゲームのシミュレーションを行った場合,結果を pickle ファイルに保存する. 75 76 Args: 77 num_games (int): 実行するゲームの回数 78 ai_args (list): 2つの AI の名前が入ったリスト 79 """ 80 CUI_VIEW_GAME_NUM = 10 81 82 if num_games > CUI_VIEW_GAME_NUM: 83 is_cui = False 84 else: 85 is_cui = True 86 87 score = [] 88 for j in range(num_games): 89 90 players = set_players(j+1,ai_args, True) 91 92 # game = Game(players,seed = j+1, turn_time_limit =500,is_cui=is_cui) 93 game = Game(players,seed = None, turn_time_limit =500,is_cui=is_cui) 94 game.cui_game_run() 95 score.append(game.get_score()) 96 # time.sleep(1) 97 98 print("Number of games:", num_games) 99 100 if num_games <= CUI_VIEW_GAME_NUM: 101 print("Scores:", score) 102 103 if num_games > 1: 104 print("Mean: ", numpy.mean(score)) 105 print("Stdev: ", numpy.std(score,ddof=1)) 106 107 if num_games == 10000: 108 with open(f'hanabiapp_{ai_args[0]}_{ai_args[1]}.pkl', 'wb') as f: 109 pickle.dump(score, f) 110 111if __name__ == "__main__": 112 """ 113 コマンドラインから AI シミュレーションを実行するためのエントリポイント. 114 115 - `num_games`(シミュレーションするゲームの回数)を引数として受け取る. 116 - `ai_args`(2つの AI の種類)を引数として受け取る. 117 """ 118 parser = argparse.ArgumentParser(description="Hanabi simulation") 119 parser.add_argument("num_games", type=int, help="Number of games to simulate") 120 parser.add_argument("ai_args", nargs=2, help="AI names for the players (e.g., 'random simple')") 121 122 args = parser.parse_args() 123 main(args.num_games, args.ai_args)
def
set_ai_ins(ai_name, player_number):
18def set_ai_ins(ai_name, player_number): 19 """ 20 指定された AI のインスタンスを作成する関数. 21 22 Args: 23 ai_name (str): 使用する AI の名前(例: "random", "simple", "internal") 24 player_number (int): プレイヤーの番号 25 26 Returns: 27 Agent: 指定された AI のインスタンス 28 """ 29 cui_name = ai_name + "-" + str(player_number) 30 if ai_name == "random": 31 return RandomAgent(name=cui_name, player_number=player_number) 32 elif ai_name == "pyrandom": 33 return PyhanabiRandomAgent(name=cui_name, player_number=player_number) 34 elif ai_name == "simple": 35 return SimpleAgent(name=cui_name, player_number=player_number) 36 elif ai_name == "internal": 37 return InternalStateAgent(name=cui_name, player_number=player_number) 38 elif ai_name == "intentional": 39 return IntentionalAgent(name=cui_name, player_number=player_number) 40 elif ai_name == "human": 41 return HumanCUIAgent(name=cui_name, player_number=player_number)
指定された AI のインスタンスを作成する関数.
Arguments:
- ai_name (str): 使用する AI の名前(例: "random", "simple", "internal")
- player_number (int): プレイヤーの番号
Returns:
Agent: 指定された AI のインスタンス
def
set_players(game_num, ai_args, is_reverse):
43def set_players(game_num,ai_args, is_reverse): 44 """ 45 指定された AI でプレイヤーリストを作成する関数. 46 47 - `is_reverse` が False の場合,固定の順序でプレイヤーを設定する. 48 - `is_reverse` が True の場合,ゲーム番号が偶数か奇数かによってプレイヤーの順序を変更する. 49 50 Args: 51 game_num (int): ゲームの番号 52 ai_args (list): 2つの AI の名前が入ったリスト 53 is_reverse (bool): 順序をランダムにするかどうか 54 55 Returns: 56 list: 作成されたプレイヤーリスト 57 """ 58 if is_reverse is False: 59 return [set_ai_ins(ai_args[0], 0),set_ai_ins(ai_args[1], 1)] 60 else: 61 if game_num%2 == 1: 62 # print(ai_args[0],ai_args[1]) 63 return [set_ai_ins(ai_args[0], 0),set_ai_ins(ai_args[1], 1)] 64 elif game_num%2 == 0: 65 # print(ai_args[1],ai_args[0]) 66 return [set_ai_ins(ai_args[1], 0),set_ai_ins(ai_args[0], 1)]
指定された AI でプレイヤーリストを作成する関数.
is_reverse
が False の場合,固定の順序でプレイヤーを設定する.is_reverse
が True の場合,ゲーム番号が偶数か奇数かによってプレイヤーの順序を変更する.
Arguments:
- game_num (int): ゲームの番号
- ai_args (list): 2つの AI の名前が入ったリスト
- is_reverse (bool): 順序をランダムにするかどうか
Returns:
list: 作成されたプレイヤーリスト
def
main(num_games, ai_args):
69def main(num_games, ai_args): 70 """ 71 指定された回数分,AI 同士の対戦をシミュレーションする関数. 72 73 - `num_games` が `CUI_VIEW_GAME_NUM` を超える場合,CUI モードを無効化する. 74 - 各ゲームのスコアを記録し,複数回の対戦結果の統計情報(平均・標準偏差)を表示する. 75 - 10,000 ゲームのシミュレーションを行った場合,結果を pickle ファイルに保存する. 76 77 Args: 78 num_games (int): 実行するゲームの回数 79 ai_args (list): 2つの AI の名前が入ったリスト 80 """ 81 CUI_VIEW_GAME_NUM = 10 82 83 if num_games > CUI_VIEW_GAME_NUM: 84 is_cui = False 85 else: 86 is_cui = True 87 88 score = [] 89 for j in range(num_games): 90 91 players = set_players(j+1,ai_args, True) 92 93 # game = Game(players,seed = j+1, turn_time_limit =500,is_cui=is_cui) 94 game = Game(players,seed = None, turn_time_limit =500,is_cui=is_cui) 95 game.cui_game_run() 96 score.append(game.get_score()) 97 # time.sleep(1) 98 99 print("Number of games:", num_games) 100 101 if num_games <= CUI_VIEW_GAME_NUM: 102 print("Scores:", score) 103 104 if num_games > 1: 105 print("Mean: ", numpy.mean(score)) 106 print("Stdev: ", numpy.std(score,ddof=1)) 107 108 if num_games == 10000: 109 with open(f'hanabiapp_{ai_args[0]}_{ai_args[1]}.pkl', 'wb') as f: 110 pickle.dump(score, f)
指定された回数分,AI 同士の対戦をシミュレーションする関数.
num_games
がCUI_VIEW_GAME_NUM
を超える場合,CUI モードを無効化する.- 各ゲームのスコアを記録し,複数回の対戦結果の統計情報(平均・標準偏差)を表示する.
- 10,000 ゲームのシミュレーションを行った場合,結果を pickle ファイルに保存する.
Arguments:
- num_games (int): 実行するゲームの回数
- ai_args (list): 2つの AI の名前が入ったリスト