「ハングマン」のゲームとは何かについて、いくつかの重要な仮定をしなければなりません。
- 推測する必要がある単語は 1 つだけですか、それともフレーズを推測する必要がありますか?
- いくつかの単語は他の単語よりも可能性が高いですか?
覚えておくべきことの 1 つは、正しい文字を選択すれば、推測を失うことはないということです。
1 単語 & 等確率のケースの解決策を提供します。2 単語のケースは、現在の辞書のデカルト積に等しい新しい辞書を作成することなどによって一般化できます。他よりも可能性が高いケースは、少しの確率で一般化できます。
アルゴリズムを定義する前に、リダクションの概念を定義します。文字 L1、L2、L3、...LN をすべて 1 回で推測する場合、辞書をより小さな辞書に減らします。一部の単語が削除され、さらに一部の文字も削除される可能性があります。たとえば、辞書が{dog, cat, rat}
あり、 を推測a
した場合、推測が真の場合は {d,g} を除外し、偽の場合は {c,r,t} も除外します。
最適なアルゴリズムは次のとおりです。
- ゲームツリーを考える
- [#guesses left == 1] のすべてのノードを確認します。
- ノードがない場合、ゲームは不可能です。ノードがある場合、それがあなたの答えです
もちろん、それがどのゲームでも解決する方法であり、ほとんどの場合、指数関数的なサイズ要件のために扱いにくいものです。これを完全に再現しない限り、最適化することはできません。また、2 つ以上先を「見ない」戦略でこれを再現できるとは思えません。ただし、次のように最適な戦略を近似することを試みることができます。
各ステップで次の手順を繰り返します。
- 各文字を検討してください: 期待されるペナルティごとに期待される辞書削減を最大化する文字を選択してください: つまり、(
frac words with L
#words without L
+frac words without L
#words with L
)/( # words without L
/ # words total
) を最大化する文字 L を選択してください... すべての場合、これは無限になる可能性があることに注意してください。単語には特定の文字が含まれています。この場合、ペナルティはないので推測してください。
- 推測して、更新されたボードの状態を取得します
- 新しいボードによって無効にされたすべての単語を削除します
もちろん、あなたの辞書に複数の2^[max number of guesses]
エントリがある場合、「ハングマン」ゲームは等確率の世界ではほとんど不可能なので (辞書が非常に制約されていない限り)、不等確率の世界で作業する必要があります。この世界では、あなたが行う除去の量を最大化するのではなく、「期待される驚き」(エントロピーとも呼ばれます) を最大化します。各単語に事前確率を関連付けます (たとえば、単語が「putrescent」である確率が 0.00001 で、単語が「hangman」である確率が 0.002 であるとします)。サプライズは、ビット単位で測定されたチャンス (チャンスの負の対数) に等しくなります。推測に対する答えは、文字がないか、1 文字か、または複数の文字 (多くの可能性) のいずれかになります。したがって:
- 可能な推測ごとに、その推測がもたらす効果を検討します
- 推測の可能な結果ごとに、その結果の確率を検討します。たとえば、3 文字の単語の「A」を推測した場合、セット内の考えられる結果をそれぞれ考慮する必要があります
{A__, _A_, __A, AA_, A_A, _AA, AAA}
。各結果について、ベイズの規則と新しい可能な辞書を使用して確率を計算します (たとえば、_A_:{cAt, bAt, rAt, ...}
andA__:{Art, Ark, Arm, ...}
などの辞書がある場合)。これらの新しい辞書のそれぞれには、次の形式の尤度比もありsize(postOutcomeDictionary dictionary)/size(preOutcomeDictionary)
ます。この比率の負の対数は、選択によって伝えられる情報量 (ビット単位) です。
- したがって、予想されるコストごとに、得られる情報量 (ビット単位) の比率を最大化する必要があります (コスト ペナルティは、失敗した場合は 1、失敗した場合は 0 です)。推測ごと、および推測の結果ごとに得られる情報ビットは です
bitsGainedFromOutcome[i] = -log(size(postOutcomeDictionary)/size(preOutcomeDictionary))
。これらの加重合計を取りsum{i}( prob(outcome[i])*bitsGainedFromOutcome[i] )
、次に、間違っている確率で割ります: prob(outcome=='___')
。
- 最小の文字を選択し
sum{i}( prob(outcome[i])*bitsGainedFromOutcome[i] )/prob(outcome=='___')
ます。これが無限大の場合、失うものは何もなく、自動的に選択されます。
あなたの質問に答えるには:
> Hangman というゲームでは、貪欲な文字頻度アルゴリズムは、勝率が最も高いアルゴリズムと同等でしょうか?
明らかにそうではありません: 辞書が
cATs
bATs
rATs
vATs
sATe
mole
vole
role
a
あなたのアルゴリズムはまたはを推測しますt
。これにより、5/8 の確率で無料で辞書が 5/8 サイズに縮小され、3/8 の確率で辞書が 3/8 サイズに縮小され、コストは 1 になります。最も多くの情報を明らかにする文字。この場合、S を推測する必要があります。これは、4/8 の確率で無料で辞書を 4/8 サイズに縮小し、1/8 の確率で無料で辞書を 1/8 サイズに縮小し、3/ 8 の確率で、コスト 1 で辞書を 3/8 サイズに縮小します。これは厳密に優れています。
編集:英語の辞書の例(上記)を使用して、これが人為的ではないことを示したいと思い、非厳密な平等にとらわれることなく例から推定できると想定しました。ただし、明確な反例があります。2000 語あります。A
1000語には、そもそも文字が含まれています。他の 1000 語には、他の場所にB
埋め込まれた s の一意の組み合わせが含まれています。たとえば、、、、、、、などです。 は、ランダム?B???
に選択された文字を表します??B??
。最初の ? には 1 つの単語 (? が「A」) を除いて sがないため、 s の頻度は s の頻度より厳密に大きくなります。提案されたアルゴリズムは???B?
????B
?BB??
?B?B?
?
A
A
B
A
{50%: Choices_halved, 50%: Choices_halved & lose_one_life} という結果になりますが、このアルゴリズムではB
、{50%: YOU_WIN, 50%: Choices_halved & lose_one_life} という結果になる選択が指示されます。パーセンテージはごくわずかに四捨五入されています。(いいえ、2 文字の単語が「頻度」に 2 回寄与することはありませんが、非常識な定義の下であったとしても、単語を で開始することで、この例を簡単に変更できますAAA...A
。)
(コメントに関して: この例では、確率を互いに任意に近づけることができるため、「999/2000」などの厳密な平等について文句を言うのは不合理です。)
(これは面白い補足説明を指摘しています: 辞書が時々絞首刑執行人を不可能にするほど大きい場合、戦略は推測できるとは思わない推測を破棄する必要があります。たとえば、残りの手数が 2 つしかない場合、可能な限り高い確率の仮定を行うべきであり、2 回以上の移動に相当する驚きのビットを持つサブツリーを排除します。)