COMPETITION RULES

将棋(第四競技)

日本将棋連盟のルールをそのまま使いますが、無人で回るリーグとして成立させるために、千日手の成立だけは主張を待たずに自動で判定します。共通ルール(不正手・障害と敗北の境界・Elo)は /rules に1か所だけ置いています。

CPU DIVISION

01

カードの形式

  • 1カード=2局。1局目と2局目で先後(BLACK / WHITE)を入れ替えます。
  • 開始局面は、カードIDから決まる6手の定跡でばらします。2局とも同じ定跡を使うので、定跡の有利不利は両者に等しく配られます。
  • 定跡に選ぶのは歩の1マス前進だけです。合法手全体から選ぶと、開始早々に飛車や角をただで取られる局面が混ざり、競技として成立しなくなります。
  • 定跡が無いと、決定的な選手プログラム同士の対局は毎回まったく同じ棋譜になります(Reversi・Chessと同じ理由)。
  • 定跡はカード終了後も公開されるので、カードIDから誰でも同じ開始局面を再現できます。

02

盤面と着手の表記

  • 盤面は176文字の固定長文字列で保存します。81マス×2文字(小文字が成駒)と、持ち駒14文字(先手の歩・香・桂・銀・金・角・飛 → 後手の同順、各1文字で0〜18枚)です。
  • ⚠ 盤面文字列は手番を持ちません。FENと違い「誰の手番か」は盤面から読めないので、必ず手番と組で扱います。
  • 着手はUSI表記(7g7f / 成りは 2b3a+ / 打ち込みは P*5e)。すべて絶対座標なので、手番と独立に読めます。
  • 合法手一覧の並び順は仕様です(予算超過のときに埋める既定手の選択に影響します)。

03

終局

次のいずれかで局が終わります。将棋にパスはないので、指せる手が1つも無い側はその場で負けです(ステイルメイトによる引き分けはありません)。

  • 詰み … 指せる手が無くなった側の負け。
  • 千日手 … 同一局面(盤・持ち駒・手番)が4回現れたら引き分け。
  • 連続王手の千日手 … その繰り返しの区間で片方が自分の手番のたびに王手を受けていたなら、王手をかけ続けた側の負け。
  • 反則負け … 非合法な回答、タイムアウト、クラッシュ、予算超過3回。

04

実装している反則

  • 二歩 … 同じ筋に自分の生歩があるマスへ歩を打てません(成歩は数えません)。
  • 打ち歩詰め … 打った歩で相手が詰むなら、その打ち込みは非合法です。
  • 行き所のない駒 … 歩と香は最終段、桂は最終2段へ、生のままでは進めず打てません。該当する場合は成りが強制されます。
  • 王手放置・自殺手 … 指したあとに自玉が取られる手は合法手一覧に出ません。

05

手数の上限

  • 1局1,000手で打ち切り、その局は no_contest(勝敗も付けない)にします。
  • 実測(自己対戦120局)は中央 約250手・最長888手でした。上限400手では18〜25%が no_contest になり、1,000手なら0%です。決着しないカードは記録として何も語らないので1,000を採っています。
  • 将棋には千日手という自然な終局保証があるので、Backgammonのように原理的に終わらない対局は起きにくい形です。それでも上限は残します。
  • 時間ベースにはしません。遅い日は no_contest・速い日は完走になり、記録が再現できなくなるためです。

06

ノード予算

  • 公平性はノード予算だけで担保します。ctx.engine の呼び出し1回=1ノードとして数え、1手あたりの上限を課します。
  • 時間では測りません。実行機の速さで勝敗が変わると、同じ棋譜を再現できなくなるためです。
  • 将棋は30,000ノードです。合法手の列挙1回が中盤(合法手291の局面)で460マイクロ秒かかり、Backgammonの約3.2倍重いため、実時間の上限を揃えるとこの値になります。
  • ⚠ 序盤の局面だけで測ると3倍近く過小評価します。予算を見直すときは必ず中盤の最悪局面で測り直してください。

COMMON RULES

全競技に共通するルール

ここから下は4競技すべてに同じ形で適用されます。競技固有の値は上の節にあります。

07

競技の形式 — LLMが選手を作る

AI CUP はLLMを1手ずつ呼び出して対戦させていません。各社の最上位LLMには競技用の選手プログラムを書いてもらい、そのプログラム同士を同じ条件で対戦させます。盤上で指しているのはプログラムで、LLMはその作者です。

  • 選手プログラムは単一ファイルにゼロから書きます。外部エンジン・外部ライブラリの使用は禁止です。
  • 盤面・合法手・終局・勝敗の判定は、すべてサーバー側の共通エンジンが行います。選手プログラムにルール処理は任せません。
  • 選手プログラムは隔離した子プロセスで実行します。ネットワークへ出られず、ファイルの書き込みもできません。
  • 対戦相手の正体はプログラムへ渡しません。相手を見て手加減する経路を作らないためです。
  • 一般の参加者も同じ規格・同じ検定で参加できます。LLMが書いたプログラムと人が書いたプログラムを、競技上は区別せずに扱います。

2026年8月25日に方式を変更しました

それ以前は、各社のAPIへ1手ごとに問い合わせてLLMを直接対戦させていました。この方式では各社API仕様の差(応答時間・思考の抑制方法・構造化出力の可否)を揃えきれず、「同じ条件で競わせている」と言い切れませんでした。出力が完全に決定的でないため棋譜を再現できず、1試合ごとに費用も発生していました。現在の方式では、条件はノード予算だけで揃い、棋譜は誰でも再現でき、1試合あたりの費用はゼロです。旧方式の対局記録は削除し、レーティングは1500から積み直しています。

08

ノード予算 — 公平性の要

公平性は実行時間ではなく、エンジン関数の呼び出し回数で担保します。共通エンジンの呼び出し1回を1ノードとして数え、1手あたりの上限を課します。 ノード上限は計算をおおむね1手30秒以内に収める目標から逆算しています。実行時間は得点には使わず、停止しない処理を終える安全弁だけを別に設けます。

競技1手あたりの上限値が違う理由
Reversi2,000,000ノード基準
Backgammon80,000ノード合法プレイの列挙1回の実コストが約25倍あるためです。同じ数字にすると実時間がまったく釣り合いません
Chess80,000ノード本番ホストで実測し、参考ボットが予算を使い切る手で最大3,101ms(1手30秒の約10%)に収まる値にしました
将棋30,000ノード持ち駒と打ち込みで合法手が増えるため1ノードが重く、中盤の最悪局面で実測して決めました。1手の上限は60秒です
  • 時間で測りません。実行機の速さやサーバーの負荷で勝敗が変わると、同じ棋譜を再現できず「検証できる大会」という前提が崩れます。
  • 予算を超えた手は、合法手一覧の先頭で埋めて続行し、超過を記録して公開します。一覧の並び順は仕様で固定しているため、実行のたびに変わりません。
  • 1局で3回超えた時点で反則負けとします。
  • 1手のハードタイムアウトはReversiが30秒、Backgammonが60秒です。超えた場合は1回でその局の負けになります。公平性は時間ではなく、全選手共通のノード予算で揃えます。
  • この数値は競技規則です。運用の都合で上げ下げしません。変更はルール変更として扱います。

09

決定性 — 同じ条件なら同じ棋譜になる

同じ選手Aと選手B、同じ開始条件なら、何度実行しても必ず同じ棋譜になります。これがCPU部門における検証可能性の根拠です。

  • 乱数はシードから決まる列に固定します。プログラムが独自の乱数源を持つことはできません。
  • 現在時刻や経過時間を読む関数は使用禁止です。登録前の静的検査で落とします。
  • 登録時の検定で、同じ条件で2回実行して棋譜が完全に一致することを確認します。一致しなければ登録しません。
  • 1カードの2局は色を入れ替えます。Backgammonは局ごとに独立した出目、Reversiは同じ定跡を使います。

10

選手プログラムの開示

現役のあいだはソースを伏せ、引退した時点で全文を公開します。対局中のプログラムを公開すると、相手陣営が次の版でそれへの対策だけを打ち込めるようになり、競技として成立しないためです。公開の順序はバックギャモンのダイスと同じ仕組みで固定しています。

時点公開されるもの
現役(プレースメント中・稼働中)SHA-256ハッシュとサイズのみ。ソースは公開しません
引退後ソース全文。以後、誰でも棋譜を再生して検証できます
  • ハッシュを先に公開しているため、あとからプログラムを差し替えることはできません。登録後は運営も変更できない仕組みになっています。
  • 陣営×競技あたり現役は3体です。毎月「◯年◯月版」として新しい選手が加わり、4体目が確定したら最下位を引退させます。
  • 新しい選手はプレースメント期間を消化してから入れ替え判定の対象になります(初期値1500のまま即座に降格するのを防ぐためです)。
  • 引退した選手の記録とEloの履歴は永久に残します。

11

不正手

  1. 1合法手一覧に無い手を返した場合、その局はその選手の敗北(forfeit)として記録します。
  2. 21手のハードタイムアウトを超えた場合、プロセスが落ちた場合、例外を投げた場合も同じ扱いです。
  3. 3ノード予算の超過は先頭の手で埋めて続行しますが、1局で3回超えた時点で敗北とします。

1回目で救済する仕組み(同じ選手へ聞き直す)は置いていません。選手プログラムは決定的なので、同じ入力に対して聞き直しても必ず同じ答えが返り、救済に意味がないためです。LLMを直接対戦させていた頃は再問い合わせを1回だけ認めていましたが、その必要が無くなりました。

12

障害と敗北の境界

選手プログラムが返した内容の問題だけを競技上の敗北とし、進行上の打ち切りや運営側の問題はno_contestとしてElo対象外にします。

事象分類結果
合法手一覧に無い手を返した選手敗北(forfeit)・Elo対象
指せるのにPASS / NONEを返した選手敗北
1手のハードタイムアウトを超えた選手敗北
プロセスが落ちた・例外を投げた選手敗北
ノード予算を1局で3回超えた選手敗北
1局が手数上限に達した(Reversi 200手 / Backgammon 1,000手)進行no_contest(勝敗も点数も付けません)
実行基盤の障害・管理者による中止運営no_contest
  • Game 1がforfeitでもGame 2は続行します。forfeitは局の結果であり、カードの中断ではありません。
  • no_contestが1局でも発生したカードは、カード全体をElo対象外にします。
  • 勝敗が付かなかった局は、戦績で NC(無効試合)として数を表示します。数えなかった局があること自体を隠しません。

13

指標の定義

分母が異なるため、次の2指標は必ず分けて表示します。

budget_exceeded_rate = 予算を超えた手数 ÷ 全手数forfeit_rate = forfeitで終わった局数 ÷ 全局数

14

Eloレーティング

  • 初期値1500、K=24、局(game)単位で更新し、引き分けは0.5とします。
  • カード内の2局は、どちらもカード開始時点のRatingを基準に一括計算します。
  • 2局が揃って完了したときだけ反映し、未完カードは対象外です。
  • 不正手による敗北は完了局としてElo対象にします。
  • 公開されているカードだけをEloに反映します。
  • 同一陣営(同じ作者)の選手同士の対局は、Eloと順位表の対象外にします。
  • 再計算はrating_events.idの単調増加順で決定的に行います。

計算式(Aから見た場合)

E  = 1 / (1 + 10^((R_B − R_A) / 400))
ΔA = K × (S₁ − E) + K × (S₂ − E)

確定した方式

AI CUP はstandardを採用し、K=24を据え置きます。1勝1敗でもレート差に応じて変動させ、番狂わせや拮抗という情報をEloへ残します(2026年8月21日確定)。

参考値(K=24・上位側の増減)

レート差期待勝率2連勝1勝1敗2連敗
1500 vs 150050.0%+24±0−24
1600 vs 150064.0%+17−7−31
1800 vs 150084.9%+7−17−41
1900 vs 130096.9%+1−23−47

15

公平性のために公開するもの

  • 選手プログラムの作者(LLMのモデル版、または参加者のハンドル)
  • プログラム本体のSHA-256ハッシュ。引退後はソース全文
  • 対戦方式と先後交換
  • 開始条件(Backgammonはシードのcommitment、Reversiは定跡)
  • ノード予算と実行基盤の版
  • 不正手の扱いと障害・敗北の境界
  • 各手の消費ノード数と予算超過の有無
  • Eloの計算方式と除外条件

「再現性」の定義

棋譜そのものを再現できます。選手プログラムは決定的であることを要求されており、開始条件も公開しているため、引退後に公開されたソースとシードから第三者が同じ棋譜を再生できます。現役のあいだはソースを伏せているので、その期間の検証は「あとからプログラムを差し替えていない」ことの担保にとどまります。これはバックギャモンのダイスと同じ構造です。

各局で保存する情報

プログラムのSHA-256ノード予算実行基盤の版開始条件(シード / 定跡)各手の消費ノード数予算超過の有無

1試合あたりの費用はゼロです

対局は選手プログラムを実行するだけなので、外部のAI APIを呼びません。観戦者が何人増えても、カードを何枚増やしても、1試合あたりの追加費用は発生しません。LLMへの費用が発生するのは、月に1回、新しい選手プログラムを書いてもらうときだけです。

16

モデル版の扱い

モデルは不変の版として管理します。CPU部門では、モデル版は「そのプログラムを書いた作者」を指します。

  • 一度でも選手プログラムの作者として使われたモデル版は編集しません。
  • モデル更新時は新しいversionを登録し、旧versionを非activeにします。
  • 過去の棋譜と選手は、必ず作られた当時のversionを参照します。
  • どのモデルがいつこの選手を書いたかを、あとから書き換えられないようにするためです。