ゲシェンク
2026-01-11 @ GPCC slack
小さいゲームで学習させたいが、トークン総量とカードの枚数と伏せカードの枚数によって「手の良さの関数」のピークがシフトしそう
それ自体をニューラルネットの入力として与えるとどうなるか気になる
着手可能な手は「引き受ける」と「1トークン支払って先送りにする」の2つだけ
引き受けることのデメリットが先送りされるごとに減っていく
最終的な点数を評価関数にするなら引き受けることが特になることはほぼ皆無
トークンがなくなると「引き受ける」しか選択できなくなる
この自体を避けたい、オプションを持っておきたい、という気持ちによってゲーム中にトークンの価値が上昇する
この原理でトークンに追加価値が生まれている関係上、トークンの価値はトークン量に比例しない
傾き1より高く始まって、傾き1に漸近すると思う
引き受けることにも追加の価値がある
それは隣接領域に「他の人と違ってデメリットがない」という効果を発生させること
これがトークンを得る機会になる
相手のチップ数はゲーム上は非公開情報だが完全な記憶力を持つAIにとってはカウンティングで正しく把握できる情報なので公開情報と考えて良い
No Thanks!(Geschenkt)強いAI設計のための事前考察メモ
1. ゲームの位置づけ
No Thanks! は
行動が Take / Pass(1チップ消費) の2択のみ
得点は 連番による非線形圧縮+チップの加点
e伏せカード(除外9枚)を含む不完全情報ゲーム
であり、戦略の本質は「今の損失を時間とチップでどう変形するか」にある。
2. 情報構造の整理
公開情報として扱えるもの
これまでに公開されたカード(山の進行)
各プレイヤーの取得カード(完全公開)
各プレイヤーのチップ数
→ 初期枚数が既知で、支払い・回収はすべて公開イベント
→ 完全記憶のAIならカウンティングにより正確に復元可能
→ 実質的に公開情報とみなしてよい
真の不確実性
除外された9枚のカード
連番が将来成立するかどうか / 特定の「橋渡しカード」が存在しない可能性
⇒ 本ゲームの不完全情報性は ほぼこの一点に集約される
3. 評価関数の基本構造
Take の価値は以下の差分で評価される:
_Take価値
=(カード取得による損失)
−(場のチップ回収による即時利益)
−(将来の拒否権=チップを失うことの機会損失)
重要な非線形性
連番に吸収されるカードは 損失が0
チップは単なる点数ではなく 「選択権(拒否権)」
チップ残量が少ないほど 限界価値が急激に上がる
「詰み(強制Take)」を避けたい心理が価値を押し上げる
チップ価値は 線形ではなく、逓減型
4. 時間構造(なぜ先送りが強いか)
残り手数が減りカード取得によるダメージが将来的に連番に吸収される確率が減少
よって多くの局面でTakeする合理的理由はほぼ無い / 「チップがある限りPassしたい」構造になる
5. 人間上級者の戦略知識(抽象化)
カードを取らずに勝つことはほぼ不可能
チップ0のカードでも「相手に得をさせる」なら取る
ブロックして得する条件が揃うなら取る
チップが乗っていないカードでも、それを相手に渡すことで相手の損失が大きく減る(=相手が得する)一方、自分の損失増分が小さいなら、ブロック目的で取ることがある。
取る理由は「自分の損失増分」と「相手に渡した場合の損失(=相手の得)」の比較で決まる
自分の損失増分が小さい(例:連番に吸収される/連番の端を伸ばす)
そのカードを相手が取ると大きく得する(連番完成、損失がほぼ0になる等)
さらに、取らないと 自分が後でより悪い形で取らされる可能性がある
具体的には相手が30と32を持っている時に31をチップを置いて回して取られると+33の得点であり、自分が即座にこれをとった場合自分が-31だから、2者間のトップ争いの場合は自分がとった方が得
自分にとって0増分のカードを あえて取らずに回すことで他のプレイヤーにチップを積ませる(ミルキング)
相手の「耐えられるチップ残量」を常に意識する
⇒ AI評価関数に落とすと:
相手の連番欲求
相手がTakeせざるを得なくなる閾値
が重要な特徴量になる
6. AI設計への含意(実装しない前提での整理)
状態はほぼ完全情報化できる
探索や学習で本当に扱うべき隠れ状態は 除外9枚のみ
これは推定する材料がない
「強さ」は以下で決まる:
1. チップの非線形価値を正しく評価できるか
2. 相手にとってのカード価値を読むか
特に、「相手の得になるカードのTakeを行う」判断ができるかどうかが単純戦略と強い戦略の分水嶺になる。
7. まとめ(設計思想の一文要約)
No Thanks! のAI設計は「チップ=拒否権」という
オプションバリューを、除外カードという
不確実性の下でどう配分するかを評価関数として記述する問題である。
---
ゲーム終盤におけるチップ価値は低い
スコアと同等の-1に収束する
序盤には「オプションバリュー」の分だけ高くなる
が、これはオプションの価値なのだからたくさんあっても意味がない
最初の一枚のカードをどこまで競り上げていいのか
:========================================================================
[29]-14 (Active card: 29 Tokens on card: 14 Deck left: 23)
------------------------------------------------------------------------
>[0] YOU tokens= 7 cards=(none) cardPts= 0 score= -7
[1] Player1 tokens= 6 cards=(none) cardPts= 0 score= -6
[2] Player2 tokens= 6 cards=(none) cardPts= 0 score= -6
========================================================================
15のダメージを受けて14のチップを得る
14のチップの価値の見積もり
残りの2人が6チップしかないので2回の破産を起こさせるのに12チップで良い
カードの待値は3~35の平均なので19であり、破産させるまでに6チップ乗せるとして13ダメージ
(他プレイヤーの間でやり取りされるチップはカウントしていない)
もう一歩行くと [29]-17 で相手は5チップ
3回破産させられる
流石に得では?
このタイミングではユーザ間に状況の差がないので、この立場を得たい度合いのオークションにすぎない
現状のAIの序盤のチップが持つオプションバリューの見積もりが低すぎて人間が簡単にチップリッチ状況に入ることができる
これはプレイのバリエーションを落としてしまうので、序盤のみんな同じ状況でのオークションにもう少しランダムな振る舞いを入れるべきだ
ただし、序盤のオークションの勝敗で大きく勝率に影響する可能性があるので、それを確認しないまま単にランダムにすると単に複雑なじゃんけんをしているだけになってしまう。
「誰にとっても得でないカード」が現れた時のオークションの適切入札額に関する関数の推定が必要そう。
盤面の差がない序盤だけに限定してもいいかもしれない。
序盤のオークションの入札戦略だけが違うAIで自己対戦?
序盤において、passをすることで「それを他人が取った時に発生するチップ格差(とそれが将来もたらすカードの押し付け)を嫌う効果が発生してもっと早くtakeが選ばれるべきなんだな