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_gamesCUI_VIEW_GAME_NUM を超える場合,CUI モードを無効化する.
  • 各ゲームのスコアを記録し,複数回の対戦結果の統計情報(平均・標準偏差)を表示する.
  • 10,000 ゲームのシミュレーションを行った場合,結果を pickle ファイルに保存する.
Arguments:
  • num_games (int): 実行するゲームの回数
  • ai_args (list): 2つの AI の名前が入ったリスト