Есть несколько критических предположений относительно игры «Палач».
- У вас есть только одно слово, которое вам нужно угадать, или вам нужно угадать фразу?
- Некоторые слова более вероятны, чем другие?
Следует помнить, что если вы выберете правильную букву, вы не потеряете предположение.
Я предоставлю решение для одного слова - и - одинаково вероятный случай. Случай из двух слов можно обобщить, создав новый словарь, равный декартовому произведению вашего текущего словаря и т. Д. Случай с большей вероятностью, чем другие, можно обобщить с некоторой долей вероятности.
Прежде чем мы определим наш алгоритм, мы определим концепцию редукции. Если бы нам нужно было угадать буквы L1, L2, L3, ... LN в ОДНОМ, то мы бы сократили словарь до меньшего словаря: некоторые слова были бы исключены , и дополнительно некоторые буквы также может быть исключено. Например, если бы у нас был словарь {dog, cat, rat}
и мы угадали a
, мы удалили бы {d, g}, если предположение было верно, или также исключили бы {c, r, t}, если это было ложно.
Оптимальный алгоритм выглядит следующим образом:
- Рассмотрим игровое дерево
- Посмотрите на все узлы, где [#guesses left == 1]
- Если нет узла, игра невозможна; если есть узел, это ваш ответ
Конечно, именно так вы решаете любую игру, и по большей части она неразрешима из-за экспоненциальных требований к размеру. Вы не можете достичь оптимальности, если не будете идеально копировать это, и я серьезно сомневаюсь, что стратегия, которая не «смотрит» на два или более шагов вперед, может надеяться повторить это. Однако вы можете попытаться приблизить оптимальную стратегию следующим образом.
Повторите следующее на каждом шаге:
- Рассмотрим каждую букву: выберите букву, которая максимизирует ожидаемое словарное сокращение на ожидаемый штраф: то есть выберите букву L, которая максимизирует (
frac words with L
#words without L
+ frac words without L
#words with L
) / (# words without L
/ # words total
) ... обратите внимание, что это может быть бесконечно, если все слова имеют определенную букву, и в этом случае продолжайте и угадывайте, так как штраф отсутствует.
- Догадайся, получи обновленное состояние доски
- Исключить все слова, недействительные новой доской
Конечно, если ваш словарь содержит более 2^[max number of guesses]
записей, игра «Палач» в большинстве случаев невозможна в мире равных вероятностей (если только словарь не сильно ограничен), поэтому вы должны работать в мире неравных вероятностей. , В этом мире вместо того, чтобы максимизировать количество исключений, которые вы делаете, вы максимизируете «ожидаемый сюрприз» (также называемый энтропией). Каждое слово, которое вы связываете с предыдущей вероятностью (например, скажем, есть вероятность 0,00001 слова «гнилостный» и вероятность 0,002 слова «палач»). Неожиданность равна шансу, измеренному в битах (отрицательный логарифм шанса). Ответ на предположение не даст никаких букв, одной буквы или более одной буквы (много возможностей). Таким образом:
- Для каждого возможного предположения, рассмотрите эффект, который будет иметь предположение
- Для каждого возможного результата предположения учитывайте вероятность этого результата. Например, если вы угадали «А» для трехбуквенного слова, вам нужно будет рассмотреть каждый возможный результат в наборе
{A__, _A_, __A, AA_, A_A, _AA, AAA}
. Для каждого результата вычислите вероятность, используя правило Байеса , а также новые возможные словари (например, в одном случае у вас будет словарь _A_:{cAt, bAt, rAt, ...}
и A__:{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=='___')
; если это бесконечность, терять нечего, и мы автоматически выбираем ее.
Итак, чтобы ответить на ваш вопрос:
> В игре Палач, является ли случай, когда жадный буквенно-частотный алгоритм эквивалентен алгоритму наилучшего шанса на выигрыш?
Очевидно, нет: если словарь был
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 шанс уменьшить ваш словарь до 3/8 размера по цене 1. Это строго лучше.
edit: Я хотел использовать пример словаря английского языка (выше), чтобы продемонстрировать, как это не искусственно, и предположил, что люди могут экстраполировать этот пример, не зацикливаясь на нестрогом равенстве. Однако вот однозначно контрпример: у вас 2000 слов. 1000 слов содержат букву A
на первом месте. Другие 1000 слов содержат уникальную комбинацию B
s, встроенную в другом месте. Например, ?B???
, ??B??
, ???B?
, ????B
, ?BB??
, ?B?B?
и т. Д. ?
s представляют случайно выбранные символы. В первом? Нет ни одного A
с, за исключением одного слова (чье? Это 'A'), так что частота A
с строго больше, чем частота B
с. Предложенный алгоритм будет угадывать A
, что приведет к {50%: choices_halved, 50%: choices_halved & lost_one_life}, тогда как этот алгоритм будет диктовать выбор B
, что приведет к {50%: YOU_WIN, 50%: choices_halved & lose_one_life}. Проценты были округлены очень немного. (И нет, слово с двойными буквами не вносит двойной вклад в «частоту», но даже если это произошло в безумном определении, вы можете тривиально изменить этот пример, начав слова с AAA...A
.)
(в отношении комментариев: в этом примере нецелесообразно жаловаться на строгое равенство, например, «999/2000», поскольку вы можете сделать вероятности произвольно близкими друг к другу.)
(Что указывает на забавную заметку: если словарь достаточно велик, чтобы иногда сделать палача невозможным, стратегия должна отбрасывать догадки, которые она не может угадать. Например, если она имеет только 2 двигаясь влево, следует сделать предположение с наибольшей вероятностью, которое может исключить поддеревья с долей неожиданности более чем в 2 шагах.)