【前版の記録】
この資料は2026年11月3日の版を説明しています。現在の追加学習結果は
「追加学習と検証.txt」を参照してください。前版の対戦比較を再現する場合、
benchmark.py に --new-profile strong --old-profile baseline --start 42000
--key 21901103 を追加してください。

Muse vs Mortal S42+ — 改良内容と検証
2026-11-03

【変えたこと】
1. 萬子・筒子を交換した観測を追加し、元の観測と二重に評価します。
   2つのQ値を元の牌の座標に戻して平均し、合法手の中から選びます。
   赤五萬・赤五筒の別扱い、各プレイヤーの捨て牌、ドラ、鳴き、
   受け入れ表の縦軸と横軸も交換します。索子・字牌は固定です。
   これは同一モデルを2つの見方で使う方法であり、モデルを2倍の強さに
   したり、先を2手読んだりするものではありません。

2. 半荘ではMortal本来の終盤ガードを有効にしました。
   オーラス等で、裏ドラの最善条件を考慮してもラス確定になる和了を
   避けます。途中の局、親の連荘、順位上昇・西入の可能性は考慮します。
   この処理は半荘の順位を目的にしています。東風・一局では無効です。

3. 最終選択にも合法手マスクを適用します。不正な数値が出た場合は
   エラーで停止します。弱い代替AIやランダム打牌への切り替えはしません。

S42+ は本キットの推論設定の名称です。公開モデルの新しい版ではありません。
Mortal-S42の重み、同梱ONNXファイル、Mortal上流ソースは変更していません。
追加学習は行っていません。自分の手牌と公開情報だけで判断します。

【旧版との対局比較】
同じ乱数種で新旧の席を交換する2対2の半荘を、16組・合計32半荘実施。
各AIについて64席分の結果です。小さい平均順位が良い成績です。

                  改良版 strong       旧版 baseline
平均順位          2.4375              2.5625
1着 / 2着         17 / 16             15 / 16
3着 / 4着         17 / 14             15 / 18

このサンプルでは改良版の平均順位が上回りました。
平均順位差（改良版－旧版）は -0.1250。
同じ種の2半荘を一組として再抽出するブートストラップ95%区間は
[-0.4375, +0.15625] です。0を含むため、統計的な優位は確認できません。
「必ず旧版より強い」「段位が上がった」「Eloが上がった」とは言えません。
点数最大化ではなく順位を中心に評価しており、平均得点は改良版の方が
低い結果でした。生の得点と全結果もsummary.jsonに残しています。

検証設定:
・libriichiのTwoVsTwo / 天鳳半荘ルール
・seed_start=42000、seed_count=16、seed_key=21901103
・4組ずつ実行、CPU推論5スレッド
・全32半荘を集計し、都合のよい対局だけを選んでいません。
・この検証は同梱のbenchmark.pyで再実行できます。
・比較用のlibriichiシミュレータと、画面のRiichiEnvは別の実装です。
  画面の対局環境でこの平均順位差を再測定したものではありません。

比較方法の対照試験:
同じ旧版AI同士でも席を交換した2半荘を実施し、双方の平均順位が
2.5000、順位差が0であることを確認しました。

【動作・正しさの確認】
・7件の自動テストが成功。
・実際の対局から524個の通常判断／槓選択の観測を作り、萬筒交換後の
  合法手、赤牌、鳴き、受け入れ表をネイティブの再エンコードと比較。
  単独探索由来の特徴には同点時の牌順依存があるため、その特徴まで
  再エンコードと完全一致するとは主張していません。
・ラス確定和了の回避と、順位上昇時・親・途中の局の和了許可を確認。
・不正な評価値、非合法手、非公開情報を使わない設定を検証。
・HTTPで対局開始・手の選択・古い選択の拒否・手牌の公開範囲を確認。
・実際の画面用RiichiEnvでも強化版3人とテスト用プレイヤーの
  半荘・東風・一局が最後まで終了。テキスト対局の起動も確認。
・JavaScript構文と、開始前・対局中・終了時の画面生成処理を確認。
  実ブラウザの見た目、およびMeta Muse自身の操作は今回未検証です。

画面用エンジンでの完走例（0席目はテスト用の合法手選択）:
半荘 seed=6051:  [7200, 49200, 26600, 17000]
東風 seed=6052:  [9300, 19800, 55600, 15300]
一局 seed=6053:  [25000, 25000, 37000, 13000]
上記は動作確認であり、棋力比較には含めていません。

【再検証】
まず README.txt に従い、python launch.py で初回準備を済ませます。
以下は展開先で実行します。Windowsでは .venv/bin/python の代わりに
.venv\Scripts\python.exe を使ってください。

正しさのテスト:
  .venv/bin/python -m unittest test_ai -v

同条件の比較:
  .venv/bin/python benchmark.py --seeds 16 --threads 5 --output 新しい検証結果

同一AI同士の対照試験:
  .venv/bin/python benchmark.py --seeds 1 --start 17001 --threads 1 --self-check --output 新しい対照試験

評価出力は既存の空でないフォルダには書き込まないため、再実行時は
別の出力先を指定してください。対局ログと集計JSONが保存されます。
同梱の実測結果は evaluation/comparison と evaluation/control にあります。

【参照とライセンス】
モデル: https://huggingface.co/haor/Mortal-S42
ONNX: https://huggingface.co/xzhe121/Mortal-S42-onnx
エンジン: https://github.com/Equim-chan/Mortal
モデルの重みはApache-2.0、推論コードとMortalはAGPL-3.0-or-laterです。
NOTICE.txt と同梱ライセンスを参照してください。
