エージェントクラスによるエージェントのつくり方 - aharalabMeiji/fireplaceAharaLab GitHub Wiki

このページに書かれていることが現状バージョンの仕様です。

  1. まず、プレーヤ(以下ではエージェントと呼ぶことにします)専用のファイルを作ってください。

  2. エージェントの名前を決めてください。ここではたとえばAdorableCatであるとします。新しく作ったファイルのファイル名は「agent_AdorableCat.py」にしてください。(これはマストではないのですが、そろえておくと、他の人がわかりやすいと思います。)

  3. クラスとその中に関数を2つ作ります。

    import random
    from utils import *
         
    class AdorableCatAgent(Agent):    
         def __init__(self, myName: str, myFunction, myOption = [], myClass: CardClass = CardClass.HUNTER, rating =1000 ):
              super().__init__(myName, myFunction, myOption, myClass, rating )
         def AdorableCatAI(self, game: Game, option=[], gameLog=[], debugLog=False):
             player = game.current_player
             while True:
                  myCandidate = getCandidates(game)#実行できることがらをリストで取得
                  if len(myCandidate)>0:
                       myChoice = random.choice(myCandidate)#ランダムに一つ選ぶ
                       if myChoice.type ==ExceptionPlay.TURNEND:#何もしないを選択したとき
                           return
                       executeAction(game, myChoice, debugLog=debugLog)#選択したものを実行
                       postAction(player)#後処理
                  else:
                       return
    

とりあえずこれだけ書いておいて、あとで中身を作ります。optiongameLogdebugLogは一応引数として(無意味であっても)入れておいてください。

  1. start.pyをいじります。main()関数をみつけてください。20行目あたりの空いているところに、

     from agent_AdorableCat import AdorableCatAgent
     AdorableCat=AdorableCatAgent("AdorableCat", AdorableCatAgent.AdorableCatAI)
    

のように書いておいて、33行目あたりを

    play_set_of_games(Human, AdorableCat, gameNumber=1, debugLog=True) 

としておくと、AdorableCatと人間との対戦ができるようになります。(各行の書き始めのインデント(桁下げ)をそろえる必要があります)

  1. 上記プログラム中でmyCandidate = getCandidates(game)という変数の中に「取りうる行動すべてのリスト」が代入されます。上記プログラムmyChoice = random.choice(myCandidate)では「ランダムに選ぶ」ことがおこなわれていますが、ここを変更して賢いエージェントを作ってください。またexecuteActionでアクションの実行、postActionはアクション後の追加アクション(追加でもらえるカードをチョイスしたりする)を自動的に行う命令です。

  2. 上記でファイル名agent_AdorableCat.pyと関数名AdorableCatAIとエージェント名AdorableCatAgentは区別したほうがいいようです。なお、自己対戦させるときには、

     from agent_AngryCat import AdorableCatAgent
     AdorableCat1=AdorableCatAgent("AdorableCat1", AdorableCatAgent.AdorableCatAI)
     AdorableCat2=AdorableCatAgent("AdorableCat2", AdorableCatAgent.AdorableCatAI)
    

のように二つ作ってください。

  1. AdorableCatAIの引数ですが、エージェントを生成する段階でオプションをつける設計にしたい場合には、optionを用いてください。また、このバージョンから、「exectActionでどのようなactionが実行されたか、というリスト」が引数gameLogに代入されることになりました。ゲームの履歴を参考に作戦を立てることも可能になりました。gameLogはリストですが、その要素はclass Candidateの変数です。

  2. class AdorableCatAgent にはメンバー変数を自由に設定できます。これにより、他のエージェントとの重複を気にせず、ターンを超えて使用可能な、エージェント内で使用できる変数を自由に設定できます。

  3. マリガンルールにも対応したい場合にはマリガンもできるエージェントを参照して作ってください。

  4. 発見にも対応したい場合には発見もできるエージェントを参照して作ってください。

  5. エージェントを作る際に「ゲームの複製」を作る必要があるでしょう。組み込み関数を使って

     import copy
     tmp_game = copy.deepcopy(game)
    

で実行することができますが、この方法だとまれにdeepcopy内で無限ループを起こす可能性があります。fireplace内の関数

    from utils import *
    tmp_game = fireplace_deepcopy(game)

を使ったほうが(たぶん)安定的に動きます。