Kaggle Pokemon TCG参加記録

programming
2026
AI
Kaggle
Author

Serika Yuzuki

Published

August 9, 2026

ルールベース、探索、模倣学習、強化学習、Transformer、LLMまで。2026年6月17日から8月9日までの開発記録。

この記事は2026年8月9日時点の中間総括。勝率は対戦相手、試合数、実行条件と一緒に読む必要があり、Kaggle本番での普遍的な強さを保証するものではない。

AIのコンペに参加して、結局一番大きく勝率を伸ばしたのは、巨大なニューラルネットでも長時間の強化学習でもなかった。

当時の上位プレイヤーが使っていた60枚のデッキを公開対戦から復元すること。それから、見えていないカードの並びを複数作って、それぞれで少し先まで試すこと。

せっかく色々な学習モデルを作ったのに、最初に書く結論がこれだった。

もちろん、強いデッキを持ってくれば終わりという話でもなかった。カードごとの使い方を決めるルール、見えない情報を扱う探索、山札切れと勝利までの速さを比べる小さな補正も必要だった。

そこへたどり着くまで、もっともらしい案をかなり捨てた。

何を作るコンペだったのか

Kaggleは、データ分析やAIの性能を競うオンラインの競技プラットフォーム。今回の舞台は、公式シミュレータ上でポケモンTCGのプログラム同士を戦わせるコンペだった。

参加者が提出するのは、対戦に使う60枚のカードの組み合わせと、対戦中にどの行動を選ぶか決めるプログラム。このプログラムを、この記事ではエージェントと呼ぶ。

エージェントには、その場で選べる行動の一覧が渡される。カードを出す、攻撃する、番を終える、といった候補から、ルール上許されている行動を一つ返す。

ただし、相手の手札は見えない。自分の山札がどの順番で並んでいるかも分からない。伏せられたカードもある。

分からないものを抱えたまま、次の一手を選ばないといけない。

この記事で使う言葉も、先に最低限だけ整理しておく。

言葉 この記事での意味
ルールベース 「この場面では攻撃を優先する」のように、人が判断規則を書く方式
探索 候補の行動を実際に少し先まで試し、結果を比べる方式
学習モデル 過去の対戦例から、良さそうな行動や盤面を学ぶニューラルネット
比較元 変更前のエージェント。英語ではbaseline
変更案 比較元へ新しいルールやモデルを加えた候補
サイド 相手のポケモンを倒した時などに取る、勝利点に近いカード
山札切れ 山札から次のカードを引けなくなって負けること
1ptの差 勝率50%が51%になるような、1パーセントポイントの差
timeout 考えるのに時間がかかりすぎ、対戦を正常に終えられなかった状態

この記事の勝率は、特に書いていない限り、手元のコンピュータで相手と試合数を固定して測ったものだ。対戦相手が変わり続けるKaggle本番の評価値とは直接比べられない。

同じ初期条件を指定しても、シミュレータ内部の偶然までは完全に揃わない。なので「変更だけが原因で必ずこの差が出る」とは書かず、実際に観測した差として扱っている。

まずルールベースを作った

6月17日、最初に作ったのは、公式シミュレータをPythonから動かして、選べる行動の中からランダムに一つ返すだけのものだった。

そこから、複数試合を自動で回す仕組み、勝敗の集計、学習コード、提出用ファイル、対戦ログ、試合を見返す画面を順に作った。

最初に必要だったのは、高度なAIより比較するための土台だった。

先攻と後攻を入れ替える。勝敗だけでなく、途中停止やエラーも残す。変更前と変更後を同じ条件で戦わせる。

既存エージェント同士を小さな総当たりで戦わせると、Alakazam(アラクサム)を中心にした公開デッキのルールベースが暫定首位になった。

一方、ニューラルネットを使う一部のエージェントは、学習済みデータを読み込めていなかった。

プログラム自体は普通に起動する。でも実際には、毎回「一覧の先頭にある行動」を選んでいた。

AI、どこ行った。

起動できることと、意図したモデルが動いていることは別だった。この問題は、その後の学習実験でも何度か踏むことになる。

既存実装を直接壊さず、Alakazam用のルールエージェントを別に作った。攻撃、進化、カード検索、エネルギーの付け方、退却、ベンチ展開を点数にして、対戦ログを見ながら直していった。

あるポケモンの攻撃は特殊な処理でダメージを与えるため、単純なカードデータ上では威力0に見えていた。実質100ダメージとして評価すると、短い90試合で56勝から60勝へ改善した。

逆に、「支援役を置きすぎない」「山札が少なければカードを引かない」「攻撃役が準備できたら追加展開をやめる」といった直感的なルールは、必要な勝ち筋まで消すことが多かった。

山札を使い切らせて勝つ別のデッキも改良したが、一つの相手へ強くするほど別の相手に弱くなった。

苦手な相手だけに勝てても、全体が強くなったとは限らない。ここから、必ず複数種類の相手で比べるようになった。

少し先読みさせたら伸びた

次に、ルールベースへ短い先読みを足した。

まずルールで有望な行動を4個まで選ぶ。それぞれを約0.15秒だけシミュレータ上で試して、少し先の盤面が一番よくなる行動を採用する。

直感で候補を数個に絞って、その候補だけ頭の中で試すようなもの。

代表的な8種類の相手と各100試合、合計800試合を行うと、元のルールは勝率40.6%、短い先読みを加えた版は48.0%だった。特に苦手だった山札切れ戦術への勝率は14%から30%へ上がった。

この固定相手では、観測上かなり伸びた。

ただ、その苦手相手だけをさらに対策すると、今度は800試合全体の勝率が下がった。

短い試験でたまたま勝った案を、そのまま改善扱いしないため、評価を三段階に分けた。

段階 対戦内容 試合数 目的
基本確認 単純な行動をする相手 600試合 ルール違反や進行停止がないか見る
実力比較 特徴の異なる8種類の相手 800試合 戦術、相性、苦手な相手を見る
提出前確認 競争力の高い10種類の相手 1,000試合 Kaggleへ提出するか決める

先攻と後攻は半分ずつ入れ替える。最初は160試合の安い確認を行い、有望な案だけ800試合へ進める。最後は、それまで使っていない初期条件で走らせた。

勝率だけでなく、timeoutや不正な行動が一件もないことも採用条件にした。

学習モデルは思ったより弱かった

次は、ニューラルネットに強いルールエージェントの行動を真似させた。いわゆる模倣学習だ。

記録済みデータに対する正解率は、複数のネットワーク構造を試して約75%まで上がった。

さすがに少しは強いだろうと思って実際に戦わせると、勝率は28.75%や32.5%。ルールと先読みを組み合わせた約50%へ全然届かない。

この固定相手では普通に弱かった。

学習時間だけの問題でもなかった。

  • 11枚目以降の手札が入力から落ちていた。
  • カード固有の効果を判断する情報が足りなかった。
  • 選べる行動が31個以上あると、後ろの候補が見えていなかった。
  • AIからは同じ入力に見えるのに、実際には別の判断が必要な場面があった。

人間には違う盤面に見えても、AIへ渡した説明では同じ盤面になっていた。

模倣学習から始めて、試合の勝敗を報酬にするPPOも試した。最初の実験では、勝率が32.5%から15%まで崩れた。

長く学習すれば直りそうな兆候もなく、ニューラルネットだけで行動を決める路線は一旦止めた。

上位デッキを真似したら一気に伸びた

学習実験と並行して、2026年7月14日に公開された上位対戦から、当時の首位プレイヤーが使っていた60枚を復元した。

ここでいう首位デッキは、俺のエージェントが1位になったという意味じゃない。外部の首位プレイヤーが使っていたカード構成のこと。

数枚入れ替えただけに見えても、60枚全体の噛み合わせは大きく変わる。手札を整えるカード、相手を妨害するカード、使い終わったカードを戻すカードなどが調整されていた。

同時に、短い先読みをbelief searchへ変えた。

beliefは、ここでは「見えていないカードは、こう並んでいるかもしれない」という仮説を指す。

処理はだいたいこんな感じ。

  1. ルールベースで有望な行動を6個ほど選ぶ。
  2. すでに見えているカードを60枚の一覧から除く。
  3. 残ったカードから、見えていない山札や伏せカードの並びを2通り作る。
  4. すべての行動を、同じ二つの仮想世界で試す。
  5. 最初の試行で悪かった候補を落とし、有望な候補へ計算時間を寄せる。
  6. 0.30秒以内に終わらなければ、既存ルールへ戻る。

見えていない重要カードが「山札の上にある世界」と「下にある世界」を作って、どちらでも大崩れしにくい行動を選ぶイメージだ。

同じ条件で各800試合を行った結果がこれ。

構成 勝数 勝率 直前との差
旧デッキ+短い先読み 443/800 55.38%
旧デッキ+複数世界の探索 509/800 63.63% +8.25pt
首位デッキ+複数世界の探索 608/800 76.00% +12.38pt

一番大きかったのは、モデルを複雑にすることではなく、強い60枚へ合わせることだった。その次が、既存のカード知識を残したまま、見えない情報を複数の世界で比べる探索。

この版は三段階の評価をtimeout 0で完走し、最終1,000試合では791勝した。

ただし、この79.1%には特に相性のいい相手への200勝が含まれている。それを除けば73.88%になる。

どんな相手にも79.1%勝てる、という数字ではない。用意した相手の組み合わせ込みの成績だった。

強い比較元を学習で超えられなかった

強い比較元ができたあと、設定を慎重にしたPPOをもう一度試した。最初のような急激な崩壊は抑えられ、学習用の相手には前より勝てるようになった。

でも固定した8種類の相手では、模倣学習版が33.54%、PPO版が39.38%。一番よかった学習モデルでも42.5%で、ルールと探索の75.75%には遠かった。

計算資源は約5.5時間で止めた。

PPOが何も学んでいないわけではない。学習中の限られた相手には改善していた。でも提出候補に欲しいのは、そこだけの強さではない。

次はルールを捨てず、探索した先の盤面評価だけをTransformerへ手伝わせた。

記録済みデータ上では、勝ち、負け、引き分けの予測精度が86.67%まで上がった。探索が選ぶ行動との一致率も73.45%から74.48%へ少し改善した。

ところが実戦を調べると、その前にバグが見つかった。探索が時間内に終わらないと、本来の強いルールではなく、単純な行動選択へ戻っていた。

戻り先を直すと、勝率は比較元の水準まで戻った。

正式な800試合では、学習補助版609勝、比較元618勝。計算時間は3.46倍だった。

しかも、その設定でニューラルネットが最終行動を変えた回数は0。

重い仕組みを追加したのに、最終行動の変更には一度もつながっていなかった。

別の学習方法も5回試したが、昇格はゼロだった。勝敗が同じ候補を、残ったサイド数や勝利までの速さで順位付けしようとしても、差が小さすぎて安定した教師にならない。

教師となる探索が選んだ行動の94.8%は、すでに既存ルールが作った候補の中にあった。

うまく真似できたときは既存候補と同じになり、外れたときだけ危険な新候補を持ち込みやすい。なので学習モデルを候補へ足す路線も止めて、探索の弱点を直接直す方へ移った。

山札切れ対策とP2-S

このゲームでは、山札を使い切ると負ける。苦手な相手との対戦では、それが特に目立っていた。

そこで最初は、山札が少ないときだけ、追加でカードを引く攻撃を使わないルールを作った。

短い160試合では、比較元128勝に対して変更版129勝。苦手な相手には20勝から26勝へ改善し、山札切れの敗戦も19件から10件へ減った。

短い試験だけを見ると有望だった。

でも正式な800試合では、変更版607勝、比較元620勝。別の976試合でも、勝率は0.717pt下がった。

ルールは狙いどおりに動いた。エラーもない。それでも弱くなった。

カードを引く行動は山札を減らすけど、強い攻撃、進化、次の攻撃役の準備にもつながる。一律で禁止するのが雑すぎた。

そこで作ったのがP2-Sという小さな補正だった。

探索した先の盤面ごとに、「山札が尽きるまであと何回攻撃できるか」と、「サイドを取り切って勝つまで最短であと何回攻撃が必要か」を比べる。

山札切れの方が先に来そうな盤面だけ、評価を少し下げる。勝敗やサイド差のような大きな判断は上書きせず、分からないときは補正しない。

最初の800試合では、P2-Sが615勝、比較元が599勝。勝率は2pt高かった。

それでも当初は不採用にした。

事前に「特定の相手に山札切れで負けた件数が増えないこと」を条件にしていて、その件数が41から46へ増えたからだ。

あとから、この物差し自体に欠陥があると分かった。

P2-Sは、途中で不利な行動を避けて、終盤の山札レースまで試合を続けるための仕組みだ。狙いどおり終盤まで行く試合が増えれば、山札0枚で終わる試合も増える。勝った試合も負けた試合も増え得るのに、負けた件数だけ数えていた。

仕組みが働くほど悪く見える可能性があった。

ただし、古い実験をあとから成功扱いにはしていない。最初の不採用はそのまま残した。P2-Sの計算式と発動条件も変えず、評価指標だけを「対象3種類の相手への合計勝数」へ直した。

そのうえで、まだ使っていない初期条件を使い、比較元とP2-Sをもう一度各800試合走らせた。

再確認 比較元 P2-S
総合 605/800 635/800
勝率 75.625% 79.375%
対象3種類の相手 204/300 217/300
timeout・不正・補正手 0件 0件

観測差は+3.75pt。ただし統計上の幅には0も含まれていて、P2-Sが必ず強いとまでは言えない。

それでも、実験前に決めた五つの採用条件は全部通り、最終1,000試合へ進めることにした。

手元とKaggle本番は別物だった

最初の首位デッキ版をKaggleへ提出すると、エージェント自身との確認対戦を除く外部30試合は17勝13敗だった。

評価値は、10試合時点の715.079から25試合時点の785.411まで大きく動いた。少ない試合数で逐次更新される値を、そのまま強さの即時判定には使えない。

P2-S版の提出後に取れた外部59試合は31勝28敗、勝率52.54%。手元の固定試験で得た78.3%とはかなり違って見える。

でも対戦相手も、相手が選ばれる仕組みも違う。直接比べられる数字ではない。

本番ログを見ると、手元の固定相手では目立たなかったものも出てきた。

  • 同じAlakazam系同士は22試合10勝12敗で、12敗中7敗が山札切れだった。
  • 新しく現れたMarnie Grimmsnarlには7試合2勝5敗だった。
  • 全28敗のうち8敗が山札切れだった。
  • 最初は、さらに16敗を「自分のポケモンがいなくなった敗戦」と分類した。

ところが、その16件を見直すと、本当に場のポケモンがすべていなくなっていたのは6件だけ。残り10件では控えのポケモンが残っていた。

シミュレータの終局画面では、次に前へ出すポケモンを選ぶ表示が省略される。それを見て「攻撃役が全滅した」と勘違いしていた。

つまり、敗因につけた名前まで間違っていた。

Marnieへの敗戦も、特定カードが足りないという単純な話ではなかった。相手が前のポケモンへ大きなダメージを与えつつ、控えにもダメージをためる間に、こちらの攻撃回数が追いついていなかった。

ログの分類だけで直す場所を決めず、実際に何回攻撃できたか、どの資源がいつ尽きたかまで見ないと危ない。

採用しなかった案

P2-Sを採用したあとも、ルール、探索、デッキ、学習モデルを一つずつ変えて試した。

うまくいかなかった案にも色々ある。

そもそも対象場面が少なくて動かないもの。狙いどおり何度も動いたのに弱いもの。情報は増えたけどtimeoutが出るもの。対戦相手を再現できない、結果が欠けているなど、実験そのものが無効なもの。

たとえば行動候補の重複を減らす仕組みは、6,152回の判断で実際に候補を変えた。それでも各512試合の比較では、勝率が3.516pt下がった。

動かなかったのではなく、動いた上で弱かった。

デッキのカードを2枚入れ替えた案は、仕組みと安全性の確認を通ったが、各320試合で9.688pt下がった。

学習した盤面評価は、記録済み139万局面に対する予測性能を大きく改善した。それでも実対戦2,432試合では+0.350ptで、実験前に期待した+2.5ptへ届かなかった。

別のデッキは全体で+5.625ptだったが、一つの相手で事前に決めた停止境界まで悪化したので、正式評価へ進めなかった。

本番41試合を追加分析しようとしたときは、1試合だけ勝敗データが欠けていた。都合よく40試合だけ使ったり、映像から推測して埋めたりせず、分析全体を無効にした。

上位デッキを持ってくる実験も、Alakazam以外ではうまくいかなかった。

  • 上位Crustleデッキを近い既存ルールで動かすと79/160勝で、元のデッキと専用ルールの89/160勝を下回った。
  • 上位Marnieデッキは、比較元156/220勝に対して99/220勝だった。
  • 上位Mega Lucarioデッキは、比較元152/200勝に対して112/200勝だった。

強かったのは60枚だけではなく、その60枚と行動ルールの組み合わせだった。Alakazamでは意味がうまく噛み合ったけど、別の種類へそのまま移せるわけではなかった。

8月6日に上位20人の公開対戦を調べると、復元できたAlakazamデッキ3件は、すべて当時使っていた60枚と完全に同じだった。公開情報からは、新しいAlakazam候補を得られなかった。

一方、自分の新しい本番180試合では、96敗中32件で、終局時にAbra系のポケモンが場から消えていた。

そこで妨害カードを1枚減らし、ポケモンを回収するカードを1枚増やした候補を作った。

短い比較は123/160勝で、比較元の115/160勝よりよかった。別条件の296試合でも192勝対170勝、観測上は+7.432pt。

数字だけを見るとかなり有望だった。それでも不採用にした。

比較元側で、最大手数へ到達するtimeoutが1件起きたからだ。変更版自身のtimeoutは0だったけど、事前に「比較する両方で安全上の問題が0件」と決めていた。

変更版が危険だと分かったわけではない。この比較を、採用の根拠には使えなくなったという話だ。

数字を見たあとで例外を作らず、再試行も基準変更もせず、その候補は閉じた。

LLMにもやらせてみた

8月には、文章生成AI、いわゆるLLMを教師やプレイヤーとして使う実験もやった。提出本線には一切入れていない。

最初はGemma 4 31Bへ「この場面では何を選ぶか」を聞きつつ、危なければ既存ルールへ戻れる形で5試合を行った。結果は5勝。

お、強いじゃんと思ってログを見ると、Gemmaの提案は一度も実行されていなかった。

毎回、既存の強いルールへ戻っていた。

証明できたのは「既存ルールが5勝した」ことだけ。Gemmaの強さではないので、同日中に記録を訂正した。

次は安全網なしでGemma自身に選ばせた。5試合で2勝2敗、技術的な失敗が1件。単純なランダム相手には勝ち、強いルール相手には負けた。

AIが読み書きした文章量は約111万token、費用は約0.155ドル。

別条件の10試合は、全部最後まで動いたけど0勝10敗だった。低価格な3モデルを比べた実験は、15試合すべてが通信や出力形式の問題で失敗し、完了した試合は0。

Codexを教師にする実験では、300種類の盤面すべてで、形式上正しくルール違反のない回答を返した。

ただ、別々に動かした3個のCodexが同じ答えを選んだ割合は63.3%。主要な行動選択では44.4%、選択肢が11個以上ある難しい場面では33.3%だった。先読みで支持できた回答は0件。

小さな対戦でよい数字が出たものもあったが、モデルと条件を固定した別の2試合では0勝2敗。試合数も少なく、相手も一種類なので、強さの根拠にはしていない。

合法な答えを返せること、毎回同じ答えを返すこと、同じ結果を再現できること、最後まで動くこと、安く動くこと、対戦で強いこと。全部別だった。

8月9日時点で残したもの

提出の中心として凍結したのは、次の四つだった。

  • 2026年7月14日に確認した上位Alakazamの60枚
  • カードごとの使い方を書いたルール
  • 見えないカード配置を複数作り、有望な行動へ計算を寄せるbelief search
  • 山札切れまでの攻撃回数と、勝利までに必要な攻撃回数を比べるP2-S

この組み合わせは、修正後の採用条件を五つとも通った。最終1,000試合は783勝216敗1分。10種類すべての相手に勝ち越し、timeoutや不正な行動は0だった。

8月6日には提出用ファイルを別の場所へ展開し直し、プログラムを読み込めること、デッキが60枚あること、主要カードの枚数、必要ファイルの内容が最終版と一致することまで確認して凍結した。

機械学習を完全に諦めたわけではない。

でも次に使うなら、既存の強い探索を丸ごと置き換える役ではなく、安定した教師データと十分な出番を先に確認できる、小さな補助にする。

結局、この2か月で難しかったのは、強そうな候補を作ることより、惜しい数字をちゃんと捨てることだった。

Back to top