大阪大学医学部 Python会

Now is better than never.

清麗戦の研究:早く負けるが得か?

2022-03-31(Thu) - Posted by 小川 in 技術ブログ    tag:Simulation tag:Python

Contents

    本稿は第2期以降の清麗戦の予選方式「再挑戦トーナメント」の妥当性に関する研究です。 敗退回別に敗者トーナメントを行う現行形式では、1回戦負けが却って得となるような逆転現象が生じるのではないか?という仮説に対し、女流棋士レーティング値に基づくシミュレーションと確率計算により検証を行いました。

    序論

    清麗戦の予選方式

    2022年3月末現在、第4期清麗戦予選が進行中です。

    この棋戦は、どれも一度負けたら終わりの女流棋戦(正棋士棋戦も殆どがそう)の中で、画期的な予選2敗失格方式を掲げて登場。 女流順位戦創設の伏線になったと言えるかもしれない棋戦です。 最高棋戦の地位は白玲戦・女流順位戦(正棋士の名人戦・順位戦に相当)に譲ったものの、序列2位、うっすらと竜王戦を思わせる棋戦でもあります。

    第1期予選はスイス式でしたが、わかりにくかったからなのか、第2期から現行の「再挑戦トーナメント」方式となりました。 竜王戦1組と同じく、予選トーナメント(以下、本予選と呼称)での1回戦負け同士のトーナメント、2回戦負け同士のトーナメント、、を独立に行います。 再挑戦トーナメントの組み合わせ順は本予選と同じです(お互い勝っていれば本予選で当たっていた者同士が、お互いに負けても当たる)。

    最後にそれぞれの優勝者(本予選決勝敗者は無条件)計6名から2名ずつ抽選でプレーオフを行い、本戦決勝トーナメント進出者3名(あと1名は予選優勝者)を決める、というものです。

    今期はちょうど64名で、加藤桃子清麗(強さを表すレーティング値は2021年12月末時点で3位 [注1]。以下順位表示については全て同じ)への挑戦権を争っています。

    死の再挑戦トーナメント

    今回の主なテーマはこの再挑戦トーナメントです。 あとのない潰し合いになるわけですが、実際の主要メンバーを見ていきます。

    まずは1回戦負けトーナメント(32名)。 レート最上位は清水市代女流七段(14位タイ)。 すでに準決勝まで終わり、決勝は【清水女流七段 vs 中澤沙耶女流初段(24位)】です。

    2回戦負けトーナメント(16名)は石本さくら女流二段(11位)、中井広恵女流六段(12位) [注2]、加藤圭女流二段(13位)、中村真梨花女流三段(14位タイ)が4トップで、決勝【中井女流六段 vs 中村女流三段】を残すところまで進みました。

    そして本予選3回戦(ベスト16)では【里見香奈女流四冠(1位) vs 西山朋佳白玲・女王(2位)】、【甲斐智美女流五段(6位) vs 渡部愛女流三段(10位) [注3]】、がありました。 3回戦負けトーナメント(8名)の1回戦はその敗者同士、【里見四冠 vs 渡部女流三段】で、渡部女流三段の予選敗退が決定。 鈴木環那女流三段(9位)も同じく別の山で敗退。

    さらに上にいくと、4回戦(準々決勝)敗退トーナメント(4名)は西山白玲、上田初美女流四段(7位タイ) [注4]、 香川愛生女流四段(7位タイ)、本田小百合女流三段(19位)。

    準決勝敗退は、【甲斐女流五段 vs 伊藤沙恵女流名人(4位)】の決戦です。

    本予選決勝は【山根ことみ女流二段(5位) vs 山口恵梨子女流二段(20位)】になりました。 山口女流二段の活躍が光ります。

    以上、敗者組プレーオフ枠も6名なので厳しくなるのは仕方ないけれど、上にいくほど死のブロックにもみえます。 どうでしょうか?

    負けるが得?

    上位敗退者再挑戦トーナメントの壮絶さを見たところで、タイトルにもある通りの疑問が頭をかすめます。

    本予選の序盤(特に1回戦)で敗退した方が、むしろ本戦進出のハードルが下がる可能性があるのでは?

    理由は主に、全体の実力差(レート差)が大きいからです(竜王戦1組と比べると顕著)。 だからといって彼女らが故意に負けるなどは勿論ありえませんが、それでも本当にそんな現象があれば問題ですね。

    とはいえ今のところ、それは少ない実例からの印象論にすぎません。 そこで実際にレーティング値を用いたシミュレーションを行い、検証してみよう!というのが本稿の趣旨となります。

    シミュレーション

    条件と設定

    第4期清麗戦の出場メンバー64名レーティング値(2021年12月末時点)を固定し、トーナメントをシミュレートします。 各局の勝利確率は単純にレーティングに従って決まると仮定します。 (もちろん実際には相性などもありますが、大勢に影響はないとみてここでは無視します。)

    これにより各女流棋士の予選優勝、プレーオフ進出、本戦進出、挑戦権獲得、の確率をそれぞれ求めます。

    また、各女流棋士について、自分だけ1回戦で必ず負ける場合、についてもそれぞれシミュレートおよび計算を行います。 これで本人の本戦進出や挑戦の確率が最初のシミュレーションを上回るケースが出てくるか否か、確認できるわけです。

    トーナメント表については、 1. 実際の第4期清麗戦のトーナメント組み合わせによる場合 2. レーティング順にシードを決めていった場合 3. ランダムに抽選し直した場合

    の3通りを別々に考えてみることにします。

    方法と実装

    本節は将棋とほぼ何も関係ないので、全部飛ばしても大丈夫です。

    コードはすべてPythonで実装しました。 なお著者のプログラミングスキルはAtCoder水色です [注5]

    レーティングのデータと勝率計算

    レーティング値は shogidata.infoで計算・公開されているもの(こちら、2021年12月末時点の数値)を使用させていただきました。 開幕時の方がいいのかもしれませんが、大差はないはずです。

    例えば里見香奈女流四冠(レート1964、1位)と里見咲紀女流初段(レート1499、38位)が対戦した場合、レート差465なのでオッズは\(10^{465/400} \simeq 14.54\)。 よって里見香奈四冠の勝利確率はおよそ 93.6% となります。

    レーティングはこの値で固定であり、勝敗による変動はないものとします。

    トーナメントのシミュレートと確率計算

    挑戦者決定までの全対局は、本予選トーナメント63局、再挑戦トーナメント57局、プレーオフ3局、本戦決勝トーナメント3局、合計126局です。

    このうち、実際にサイコロを振ってシミュレーションを行うのは本予選63局のみです。

    def simulate_match(a: int, b: int, rates: dict, rng: np.random.Generator) -> tuple:
        if win_prob(rates[a], rates[b]) > rng.random(): # 期待勝率が[0,1)乱数より大きければ勝ち
            return a, b # 勝者, 敗者
        else:
            return b, a
    

    残りは単純な1敗失格式トーナメントになるので、厳密な確率計算が可能です。 プレーオフは15通り、本戦は3通りの組み合わせ抽選結果があり得ますが、全ての場合を単純に平均すればよいです。

    def prob_match(A: dict, B: dict, rates: dict) -> dict:
        ret = defaultdict(float)
        for a, pa in A.items():     # 左の山に登場する女流棋士とその確率
            for b, pb in B.items(): # 右の山について同様
                p = win_prob(rates[a], rates[b])
                ret[a] += pa * pb * p       # 左が勝つ場合
                ret[b] += pa * pb * (1-p)   # 右が勝つ場合
        return ret  # 勝者の分布リストを返す
    

    1局の確率計算はこのようになります。 ここに出てくる辞書 A, B, ret はいずれも、各女流棋士がその対局に登場する確率を保持しています。 各再挑戦トーナメントの一番下には該当する本予選対局の敗者を確率1とする辞書を入れます。 また本戦の枠のひとつには予選優勝者が同様に確率1で入ります。

    辞書を並べて配列にし、隣同士順番に当てていけば自動的にトーナメントができます。 今期は出場者がちょうど64名で半端な山がないこともあり、実装がとても楽です。

    def prob_match_together(players: list, rates: dict) -> list:
        return [prob_match(*players[i*2:i*2+2], rates) for i in range(len(players)//2)] # 勝ち残り者の分布リストを返す
    
    def prob_tournament(players: list, rates: dict) -> dict:
        while len(players) > 1:
            players = prob_match_together(players, rates)
        return players[0]   # 優勝者の分布を返す
    

    以上のようにして、本予選のシミュレーションを \(10^6\) 回行い、全ての場合についての確率を計算・平均すれば、かなり正確な期待値を得ることができます。

    1条件あたり延べ \(2 \times 10^9\) 局程度。 計算時間は2時間半程度でした。

    トーナメント表

    前述通り、3通りの場合をそれぞれ考えます。

    第4期の組み合わせ

    端から順番にトーナメント1回戦の順番を書き写したリストをファイルに保存しておき、読み込みます。 毎回のシミュレーションで同じものを使います。

    シード方式

    強い者同士ほど後から当たるようにする方式です。 こちらもトーナメント表は固定です。

    「端からの位置(0, 1, 2,...)を2進数で表し、ビット順を逆転した順位の者(0: 里見, 1:西山,...)を入れる」という簡便なアルゴリズムが使われます(表の見た目は里見西山が両端にならないですが、対戦順は同じです)。

    def seed_bracket(players: list, rates: dict) -> list:
        # 引数playersには第4期予選出場メンバー64名を並べて入れる。順番は任意。
        # 実際は第4期の対戦表をそのまま入れればOK。
        N = len(players)
        M = len(bin(N)) - 3
        players = sorted(players, key=lambda x: -rates[x]) # 強い順に並べる
        ret = []
        for i in range(N):
            s = bin(i)[:1:-1]   # iの2進数表記を逆順に並べる
            m = int(s + '0'*(M-len(s)), 2)  # 桁数が足りない分は0埋め
            ret.append(players[m])
        return ret
    
    ランダムドロー

    シミュレーションごとに毎回、 rng.shuffle(players) を行います。

    手抜きの負け

    本予選の特定回戦で、指定した特定の人が確率によらず無条件に負ける、という設定をすればよいです。

    実装として一番安直なのは、上の simulate_match()の中に条件判定を入れることです。 もちろんもっとちゃんとした方法を使ってもよいです。

    結果

    お待ちかねの結果はオムニバス・ストーリー形式でのお届けです。

    Episode 1 : 里見香奈さんの場合

    里見香奈女流四冠のレートは1964(1位)。 女流棋界に君臨するスーパースターです。 西山白玲とはお互いがラスボス。 レート4位の伊藤女流名人に対してですら、67%の期待勝率を誇ります。

    里見香奈女流四冠 挑戦 本戦出場 予選優勝 プレーオフ勝利 プレーオフ出場
    第4期組み合わせ・全力 0.3677 0.6848 0.2622 0.4226 0.5203
    第4期組み合わせ・1回戦負け 0.2587 0.5022 0.0000 0.5022 0.6203
    シード方式・全力 0.3941 0.7538 0.3394 0.4144 0.5062
    シード方式・1回戦負け 0.2597 0.4978 0.0000 0.4978 0.6127
    ランダムドロー・全力 0.3967 0.7492 0.3413 0.4079 0.4984
    ランダムドロー・1回戦負け 0.2515 0.4791 0.0000 0.4791 0.5866

    計算結果は表の通り。

    すさまじい強さですが、第4期のトーナメントはやや当たりがきつく、不利になっているようです。 全力(通常)の場合、予選優勝より挑戦の確率が高いこともポイントです。 一発入れば敗退、とならないところはやはり強者有利。 [注6]

    さて肝心の1回戦手抜きは、全ての場合で成績が下がります。 もともと予選優勝確率が3割前後あり、それを放棄しているのも大きいです。 それだけでなく、「予選優勝できなかった場合のプレーオフ出場割合」でも、全力の場合(7割程度以上)が1回戦手抜き(6割程度)を上回っています。

    そもそも、1回戦負けトーナメントを勝ち抜ける割合が6割程度しかない。 「里見四冠くらい強ければ無双できるのでは?」というのは、やや甘すぎるようです。 あくまでレーティング計算上の話ではありますが。

    結論:里見香奈四冠は1回戦敗退の利点はない。最初から全力で指す方が有利である。

    Episode 2 : 山根ことみさんの場合

    山根ことみ女流二段のレートは1739(5位)。 里見四冠への期待勝率は約21%。

    4位・伊藤女流名人との間には壁(レート100差)がありますが、山根・甲斐・香川・上田の4人で5位集団を形成しています。 まぎれもない強豪。 今期は予選決勝進出を果たし、プレーオフ以上が確定しています。

    山根ことみ女流二段 挑戦 本戦出場 予選優勝 プレーオフ勝利 プレーオフ出場
    第4期組み合わせ・全力 0.0299 0.2082 0.0346 0.1737 0.3228
    第4期組み合わせ・1回戦負け 0.0176 0.1257 0.0000 0.1257 0.2369
    シード方式・全力 0.0314 0.2333 0.0413 0.1920 0.3547
    シード方式・1回戦負け 0.0164 0.1258 0.0000 0.1258 0.2374
    ランダムドロー・全力 0.0302 0.2192 0.0371 0.1821 0.3359
    ランダムドロー・1回戦負け 0.0143 0.1076 0.0000 0.1076 0.2001

    プレーオフ経由の本戦出場確率は全力の方が1.4倍〜1.7倍程度高く、もともと優勝確率もそれなりにあるのでトータルでは2倍前後の違いになります。 1回戦負け32人中での優勝確率は20%〜24%。 可能性をここだけに絞るのはやはり悪手のようです。 どこをどう見ても、1回戦負けが有利になるところはありません。

    結論:山根ことみ女流二段も最初から全力で指す方が有利である。

    Episode 3 : 渡部愛さんの場合

    渡部愛女流三段のレートは1687(10位)。 里見四冠相手の期待勝率は約17%。

    5位グループに次ぐ集団。 ほかに鈴木環那女流三段(9位)、石本さくら女流二段(11位)ら。 この周辺以上が強豪と呼ばれる、という位置かと思います。

    渡部愛女流三段 挑戦 本戦出場 予選優勝 プレーオフ勝利 プレーオフ出場
    第4期組み合わせ・全力 0.0114 0.1120 0.0146 0.0974 0.2092
    第4期組み合わせ・1回戦負け 0.0053 0.0548 0.0000 0.0548 0.1195
    シード方式・全力 0.0111 0.1164 0.0129 0.1035 0.2228
    シード方式・1回戦負け 0.0065 0.0740 0.0000 0.0740 0.1619
    ランダムドロー・全力 0.0127 0.1325 0.0183 0.1142 0.2419
    ランダムドロー・1回戦負け 0.0057 0.0613 0.0000 0.0613 0.1312

    山根女流二段とレート差は大きくないですが、結果は結構差が出ます。

    全力の場合、予選優勝の可能性が少しあります。 1回戦負けするとプレーオフ出場確率自体が約半分に激減。 本戦出場確率も半分前後となります。 やはり1回戦負けの利点はないようです。

    結論:渡部愛女流三段も最初から全力で指す方が有利である。

    Episode 4 : 山口恵梨子さんの場合

    山口恵梨子女流二段のレートは1594(20位)。 里見四冠相手の期待勝率は約11%。

    強豪と呼ばれるにはまだ少し届かない位置ですが、今期清麗戦は山根女流二段とともに決勝進出。 計算上の期待値を上回る活躍を見せています。 山根女流二段への勝利確率は約30%です。

    山口恵梨子女流二段 挑戦 本戦出場 予選優勝 プレーオフ勝利 プレーオフ出場
    第4期組み合わせ・全力 0.0019 0.0398 0.0042 0.0355 0.1006
    第4期組み合わせ・1回戦負け 0.0009 0.0178 0.0000 0.0178 0.0517
    シード方式・全力 0.0016 0.0359 0.0024 0.0335 0.0964
    シード方式・1回戦負け 0.0009 0.0200 0.0000 0.0200 0.0589
    ランダムドロー・全力 0.0020 0.0417 0.0042 0.0375 0.1055
    ランダムドロー・1回戦負け 0.0008 0.0176 0.0000 0.0176 0.0501

    予選優勝確率はほぼ無視でき、プレーオフだけ見ればよいです。 やはり1回戦負けは確率がほぼ半分になっています。 このクラスで既に、1回戦負け32人の中で優勝できる確率は5%程度に下がります。

    結論:山口恵梨子女流二段も最初から全力で指す方が有利である。

    Episode 5 : 武富礼衣さんの場合

    武富礼衣女流初段のレートは1505(35位)。 里見四冠相手の期待勝率は6.6%。

    女流棋士として平均的な強さといえますが、上位進出は難しい位置です。

    武富礼衣女流初段 挑戦 本戦出場 予選優勝 プレーオフ勝利 プレーオフ出場
    第4期組み合わせ・全力 0.0001 0.0058 0.0003 0.0055 0.0218
    第4期組み合わせ・1回戦負け 0.0001 0.0033 0.0000 0.0033 0.0132
    シード方式・全力 0.0001 0.0065 0.0002 0.0063 0.0254
    シード方式・1回戦負け 0.0001 0.0054 0.0000 0.0054 0.0219
    ランダムドロー・全力 0.0002 0.0100 0.0007 0.0092 0.0357
    ランダムドロー・1回戦負け 0.0001 0.0039 0.0000 0.0039 0.0152

    プレーオフ出場は元々厳しめの確率ですが、1回戦で負けるとさらに下がります。 1回戦負け再挑戦トーナメント優勝確率も2%いかないくらいで、32人の平均を下回ります。 正直、初戦で手を抜いている場合ではありません。

    結論:武富礼衣女流初段も最初から全力で指す方が有利である。

    Episode 6 : 中村桃子さんの場合

    中村桃子女流二段のレートは1430(54位)。 里見四冠相手の期待勝率は4.4%。

    上位進出は非常に厳しい位置と言えます。

    中村桃子女流二段 挑戦 本戦出場 予選優勝 プレーオフ勝利 プレーオフ出場
    第4期組み合わせ・全力 0.0000 0.0025 0.0001 0.0024 0.0125
    第4期組み合わせ・1回戦負け 0.0000 0.0014 0.0000 0.0014 0.0076
    シード方式・全力 0.0000 0.0015 0.0000 0.0015 0.0081
    シード方式・1回戦負け 0.0000 0.0010 0.0000 0.0010 0.0058
    ランダムドロー・全力 0.0000 0.0023 0.0001 0.0021 0.0113
    ランダムドロー・1回戦負け 0.0000 0.0008 0.0000 0.0008 0.0045

    こちらも傾向は全く同じ。 プレーオフ出場確率がおよそ半分程度に落ちます。

    結論:中村桃子女流二段も最初から全力で指す方が有利である。

    Episode 7 : 石高澄恵さんの場合

    石高澄恵女流二段のレートは1295(68位)。 里見四冠相手の期待勝率は2%。

    女流棋士中の最下位です。

    石高澄恵女流二段 挑戦 本戦出場 予選優勝 プレーオフ勝利 プレーオフ出場
    第4期組み合わせ・全力 0.0000 0.0000 0.0000 0.0000 0.0005
    第4期組み合わせ・1回戦負け 0.0000 0.0000 0.0000 0.0000 0.0003
    シード方式・全力 0.0000 0.0001 0.0000 0.0001 0.0008
    シード方式・1回戦負け 0.0000 0.0000 0.0000 0.0000 0.0004
    ランダムドロー・全力 0.0000 0.0001 0.0000 0.0001 0.0009
    ランダムドロー・1回戦負け 0.0000 0.0000 0.0000 0.0000 0.0003

    ここでもきれいに同じ傾向となりました。

    結論:石高澄恵女流二段も最初から全力で指す方が有利である。

    みんなの結論

    上に挙げた以外にも全員分を計算していますが、全員が、1回戦負けで本戦出場や挑戦の確率が減少しています。 また表には示していませんが、2回戦以降に必ず負ける場合で計算しても、やはり逆転することはありません。[注7]

    多くの女流棋士で、本戦進出等の確率は1回戦負けの場合、全力の半分程度に下がります。 ただタイトルホルダー級の超強豪(伊藤女流名人以上、特に里見四冠と西山白玲)では、下げ幅が相対的にそこまで大きくありません。

    あらためて考えてみると、本戦出場の椅子はもともと64名に対して4つ。 そのうち、1回戦負け組32名への割り当ては0.5個(プレーオフ枠)です。

    つまり単純比較すると待遇に4倍の開きがあるのに、結果は2倍程度の差にしかならない。 トーナメント表を見たときの「1回戦負けが有利そうな感じ」は、この部分に数字として表れているとは言えます。 差し引きおよそ2倍分、タイトルホルダー級はさらにそれ以上、有利になっている部分があります。

    とはいえ、4倍の待遇差を逆転するまでには至らない、というのが結論となりました。

    まとめ

    本研究の結果、仮説は無事、否定的に解決されました

    実力の上位下位に関わらず、負けても良いことは何もありません。 常に全力の真剣勝負が、理論上も清麗戦の最適戦略であることが明らかになりました。 とても喜ばしい結果だと思います。

    清麗戦の主催者である公益社団法人日本将棋連盟様、大成建設株式会社様、第2期までの主催者であるヒューリック株式会社様には、謹んでお詫び申し上げます。

    「疑ってごめんなさい。」

    今後も清麗戦を楽しみにしております。 またより一層の発展を祈念致しております。

    謝辞

    本研究の数値結果はすべて大阪大学医学部医学科学生用計算機上で、延べ500CPU時間以上を使って計算されました。

    注記

    注1 : レーティングの順位と値

    初見でもわかりやすいよう順位だけ表示していますが、レーティングの値は

    里見(1964) ≒ 西山(1931) >>>> 加藤(1851) ≒ 伊藤(1839) >>>> 山根その他(〜1739)
    

    です。

    1位と5位グループでは昭和東京オリンピックと享保の改革くらいの差があります。 期待勝率で4-1程度です。

    注2 : 中井広恵女流六段

    著者の推しナンバー1。

    昨期倉敷藤花挑戦、女流順位戦現役A級。 まさにレジェンド。

    注3 : 渡部愛女流三段

    わたなべまな。 日本女子プロ将棋協会(LPSA)の生え抜きかつ看板。

    第1期白玲戦挑決では里見香奈四冠にここ一番で勝ち、久々にタイトル戦登場(7番勝負は渡部0-4西山)。 ぜひまたタイトルに返り咲いてほしいです。

    注4 : 上田初美女流四段

    著者は気が強い子は嫌いじゃないです。

    注5 : AtCoder水色

    人類の平均程度らしいです [DeepMind, 2022]。

    注6 : 強者有利

    この「強者」、実は里見四冠と西山白玲の2人しかいません。 伊藤女流名人さえ割を食っています。

    注7 : 2回戦以降に必ず負ける場合

    2回戦以降の特定回戦で必ず負けるように設定した場合、やはり負けるのが遅いほど、成績がよくなります。 1回遅くなると1割から2割程度です。

    第4期トーナメント固定では若干逆転する場合あり。 またタイトルホルダーは、負ける場所による変化がやはり非常に緩やかです。