CompetitionProtocolDivision

第5回人狼知能国際大会プロトコル部門レギュレーション

Version 2023.05.10-ja

第5回人狼知能国際大会における人狼ゲームのルール

クローズルール

本大会では, ゲーム終了まで役職が公開されない, いわゆる「クローズルール」を採用しています。

村の構成

本大会では,15人および5人のプレイヤーで村を構成します。 各村における役職とその人数は以下の通りです。

  村人 占い師 霊媒師 狩人 人狼 裏切り者
15人村 8 1 1 1 3 1
5人村 2 1 0 0 1 1

役職

村人側の役職

人狼側の役職

対話の仕様

ターン制の導入

対話はターン制となります。 各プレイヤーはターンごとに一回発言することができます(発言しないことも可能)。 ただし,発言の順番はターンごとにランダムに決められ, 各プレイヤーは自分の順番より前の発言しか知ることができません。

発言は1日に10回まで行うことができます。 ただし,SkipとOverは発言に含まれません。 すべてのプレイヤーがOverを発言するか, 全てのプレイヤーがSkipをするターンが3回連続すると, その日の昼のフェーズは終了します。 また,昼のフェーズは最大20ターンです。 20ターン経過した時点で昼のフェーズは終了します。

初日対話

初日に対話はできません。

人狼の囁き

人狼の囁きは襲撃投票前(追放者決定後)にのみ行うことが可能です。 昼フェーズの対話と同じようにターン制で行われます。 初日は襲撃がありませんが,囁きは可能です。 偽COなどをする際に初日の囁きを使って相談することが可能です。

人狼が一人になると囁きは行われません。 サーバから囁きのリクエスト自体が来なくなる (Javaの場合whisperメソッド自体が呼ばれなくなる)のでご注意ください。

追放投票と再投票

追放のための投票は昼フェーズの最後に行われます。 有効な投票先(自分以外の生存プレイヤー)以外に投票することは可能ですが, その場合はランダムに投票先が選ばれます。

投票によって決定した追放者の情報は, 夜フェーズの占い・護衛・襲撃投票に利用することが可能です。

最多得票者が複数となった場合は1回に限り再投票となります。 再投票の前に対話はできません。 再投票でも同点だった場合は再投票での最多得票者からランダムに追放者が決定されます。 再投票では,最多得票者も投票権を持ち,投票者は最多得票者以外にも投票可能です。

襲撃投票と再投票

襲撃投票でも最多得票者が複数となった場合は1回に限り再投票となります。 再投票の前に囁くことはできません。 再投票でも同点だった場合は再投票での最多得票者からランダムに襲撃先が決定されます。

生存人間プレイヤー以外に襲撃投票した場合, その投票は無効となります。 人狼全員の投票が無効である場合には, 生存人間プレイヤーからランダムに襲撃先が決定されます。

予選,本戦の方式

セット

本大会では固定メンバーによる100回のゲームを1セットとし, これを単位として対戦を行います。 1セットの流れは以下の通りです。

  1. 全参加チームから5または15チームをランダムに選択して村を構成する。
  2. 村の各チームにランダムに役職を振り分け1ゲームを行う。
  3. 2.を100回繰り返す。

なお,各チームのエージェントのインスタンスは1セットごとに破棄され, セットごとに各チームの番号(AgentIdx)はランダムに割り振られます。 言い換えると,1セットの100ゲームの間は同じインスタンスなのでゲームをまたいだ情報のやり取りが可能で, さらに番号も固定(指定席)です。

エージェント更新可能期間と予備対戦(デイリーコンテスト)

参加チームは,エージェント登録から予選開始までの間と, 予選終了から本戦開始までの間, 登録エージェントを更新することができます。 エージェント更新可能期間中, 対象エージェント(予選前はすべてのエージェント,予選後は予選通過エージェント)による 予備対戦(デイリーコンテスト)が開催されます。 15人村の予備対戦5人村の予備対戦の結果は 各対戦終了後すぐに公開されます。 予備対戦では,各チームが少なくとも1セット(100ゲーム)を行い, エージェントがエラー無く動いたチームのみが次の予備対戦に参加できます。 エラーで失格となったチームは,修正したエージェントを新たに登録すれば, 予備対戦に再び参加することができます。 自チームが参加した予備対戦のゲームログと, エージェントが標準出力に出力したテキスト(エージェントログ)がダウンロードできます。 提出したエージェントがサーバ上で正しく動作するかどうかの確認や エージェントの改良に予備対戦をご利用ください。

予選

予選では,参加全チームのセット回数が一定回数以上となるまでセットを繰り返し, 勝率上位15チームを選出します。 なお,15人村のセット数と5人村のセット数は揃え, 順位の有意性を高めるため,セットは時間の許す限り多く行います。

本戦

予選で選出された15チームに対し, ランダムに役職を割り当てながらセットを多数回行い, 勝率によって順位を決定します。 予選同様,15人村のセット数と5人村のセット数は揃えます。

エージェント提出方法

参加登録

本大会に参加を希望される方(チーム)は, 人狼知能大会のウェブサイト (http://contest.aiwolf.org/)にアクセスし, まずはアカウントを作成してください。 アカウントの作成をもって参加登録となります。

エージェントの提出

参加登録後, すべての役職を実装したエージェントのファイルを 大会ウェブサイトの「マイページ」より提出(アップロード)して下さい。 提出するファイルは実装に用いるプログラミング言語によって以下のように異なります。

Javaエージェント

提出可能なファイルはjarファイル一つです。 機械学習などのライブラリなどを利用する場合は jarファイルの中に含めておいてください。 自動的にクラスパスに追加されます。

データファイルなどはjarファイルの中に含めておいて, 読み込むことができます。 たとえば,zipファイル内の/data/hoge.datを読み込みたい場合は,

InputStream is = getClass().getClassLoader().getResourceAsStream("data/hoge.dat");

と書くことで, ファイルへのInputStreamを得ることができます。

なお,aiwolf-client.jar, aiwolf-server.jar, aiwolf-common.jar, aiwolf-viewer.jar, jsonic-xxxx.jarを含めていると クラス名の衝突(コンフリクト)が発生し, 正しく動作しない可能性があるため,お控え下さい。

また,人狼知能エージェント簡易生成器が稼働していないため, 簡易生成器により生成されたエージェントの提出もお控えください。

対戦サーバにおけるJavaのバージョンは17です。 それ以降のバージョンを利用してエージェントを作成した場合, 正常に動作しない可能性があります。

C#(.NET)エージェント

ランタイムをlinux-x64に指定してself-containedでpublishした 自己完結コンソールアプリケーションのディレクトリの内容を zipファイルに固めたものを提出してください。 zipファイルのルートディレクトリに実行ファイルを配置してください。 ファイル名の制限はありません。 提出時に実行ファイル名を指定していただきます。 実行ファイルは以下のコマンドライン引数を正しく受け付けるように実装してください。

データファイルなどは埋め込みリソースとしてアセンブリに埋め込んでおけば, 実行時にAssembly.GetManifestResourceStreamメソッドで Streamを得ることができます。

Pythonエージェント

提出可能なファイルはzipファイルです。 zipファイルのルートディレクトリに起動スクリプトファイルを配置してください。 ファイル名の制限はありません。 提出時に起動スクリプトファイル名を指定していただきます。 起動スクリプトは以下のコマンドライン引数を正しく受け付けるように実装してください。

ソースファイルとアルゴリズム概要文書の提出

決勝進出チームには,大会ウェブサイトから提出した実行ファイルの他に, エージェントのソースファイルおよびアルゴリズムの概要を記述した 文書の提出が義務付けられています。 実行ファイルとソースファイルが同一であるPythonエージェントも例外ではなく, 改めてソースファイルの提出が必要です。 ソースファイルとアルゴリズム概要文書の提出方法は予選の後に連絡します。

これらを提出しなかったチームは失格となります。

オープンソースライセンス

エージェントのソースコードは 大会終了後にオープンソースソフトウェアとして公開されます。 したがってソースコードには,

を認めるオープンソースライセンスを付けてください。 参加意思確認フォーム記入時に, 付けたライセンスを回答していただきます。 参考までに,現在人気の高いオープンソースライセンスは Apache License 2.0とMIT Licenseです。 迷ったらMIT Licenseにすると良いでしょう。

禁止事項

本大会では,以下の項目に該当するエージェントを提出したチームは, 原則として予選不戦敗となります(場合によっては個別に連絡を差し上げた上で対処します)。

プレイヤーのプログラム実装について(Java版)

ここではJavaエージェントを例にとって説明します (C#とPythonの場合も基本的な考え方は同じです)。

第5回人狼知能国際大会では 人狼知能プラットフォーム0.6.xの利用を想定しています。 AIWolfCommon.jar内のorg.aiwolf.common.data.Playerインターフェースを 継承したクラスがプレイヤーとしてゲームに参加することができます。

Playerインターフェースの実装すべきメソッド

Playerインターフェースを継承したクラスは11個のメソッドを実装する必要があります。 これらのメソッドは以下の4種類に分類されます。

情報処理メソッド(initialize, update, dayStart, finish)

これらは情報を処理するためのメソッドで,何も戻り値を返す必要がありません。

対象指定メソッド(vote, attack, guard, divine)

対象となるAgentを戻り値として返すメソッドです。 attack, guard, divineは特定の役職の場合のみ呼ばれるメソッドです。

会話メソッド(talk, whisper)

発言する内容(String型)を返すメソッドです。 whisperは人狼の場合のみ呼ばれます。 本大会で有効な発言内容は org.aiwolf.client.lib.ContentBuilderで生成できるStringのみです (詳しくは「5.3 発言可能な内容」を参照)。

命名メソッド(getName)

各メソッドの呼ばれるタイミング

getName以外の10個のメソッドは下図のタイミングで呼び出されます。 なお,updateはinitialize以外の全てのメソッドの前に呼び出されますので, 図中では省略されています。

発言可能な内容

本大会では, org.aiwolf.client.lib.ContentBuilderの サブクラスで生成可能な発言のみで会話を行います。 生成可能な発言は以下の23種類です。

Playerクラスのパッケージについて

Playerクラスはチーム独自の物を作成してください。 人狼知能プラットフォーム付属のクラス (org.aiwolf.sample.player.SampleRoleAssignPlayerなど) を直接書き換えることは避けてください。

クラス名の衝突を避けるため, Playerクラスはチーム固有のパッケージに配置するようにしてください。 一般に,パッケージ名をドメイン名またはメールアドレスの逆順で命名します。 例えば,gm@aiwolf.orgというメールアドレスをお持ちの方が MyPlayerというPlayerクラスを作成する場合, パッケージとしてorg.aiwolf.gmを指定し,

package org.aiwolf.gm;
import org.aiwolf.sample.lib.AbstractRoleAssignPlayer;

public class MyPlayer extends AbstractRoleAssignPlayer {

}

という書き方になり, クラスパスはorg.aiwolf.gm.MyPlayerとなります。

他の言語で参加する場合

Java以外の言語はPython,C#(.NET)を想定しています。 これらの言語で参加する場合は,それぞれのライブラリを参照して下さい。 独自のライブラリでもTCP/IP接続ができ, エージェントが正しく動けば参加することができますので 事前に運営側にご相談(gm@googlegroups.com)ください。

なお,対戦サーバのOSはLinuxなので, その点に注意して,特殊な環境に特化したエージェントでの参加はご遠慮下さい。 サーバ上で動かなかったエージェントは自動的に失格となります。 そのようなことを避けるためにも事前の予備予選への参加を強く推奨します。 また,対戦サーバと同環境のdockerイメージを提供しています。 エージェントの検証にお役立てください。

更新

レギュレーションは予告なく変更される可能性があります。 変更された場合はプロジェクトページ (http://aiwolf.org/), 開発者メーリングリスト(aiwolfdev@googlegroups.com) あるいはTwitterアカウント(@aiwolf_org)で告知いたしますので, 登録あるいはフォローをしておいてください。


更新履歴