Оптимальный алгоритм выигрыша виселицы

В игре Hangman, так ли, что жадный алгоритм с буквенной частотой эквивалентен алгоритму с наилучшим шансом выигрыша?

Есть ли когда-нибудь случай, когда стоит пожертвовать сохранением оставшихся жизней, ради лучшего шанса угадать правильный ответ?

Дальнейшее уточнение проблемы:

  • Выбранное слово, которое нужно угадать, было взято из известного словаря.
  • Вам даны N жизней и, следовательно, необходимо максимизировать вероятность угадывания всех букв в слове без ошибок N (т.е. у вас может быть неограниченное количество правильных догадок).
  • Каждое слово в словаре имеет равную вероятность, ради этого упражнения (т.е. слово выбирается случайным образом)
    • более сложное упражнение - это разработать стратегию против злонамеренного, всезнающего слова-выборщика (я не прошу об этом здесь).

Мотивация: этот вопрос вдохновлен интересным обсуждением на http://www.datagenetics.com/blog/april12012/index.html

Они предлагают оптимальный алгоритм решения игровой игры "Hangman".

Их стратегия может быть суммирована таким образом (отредактировано для уточнения):

  • Мы можем предположить, что слово взято из определенного словаря
  • Мы знаем количество букв в слове
  • Устранить все слова в словаре, которые не имеют правильного количества букв.
  • Выберите еще не угаданную букву, которая встречается в наибольшем количестве слов в остальном подмножестве словаря.
  • Если это письмо встречается, мы знаем его местоположение.
  • Если это письмо не встречается, мы знаем, что оно не встречается в слове.
  • Устраните все слова в подмножестве словаря, которые не соответствуют точно этому правильному шаблону и повторяются.
  • Если есть 2 (или более) буквы, которые появляются одинаково часто, алгоритм может выполнить более глубокий анализ позиций, чтобы определить, какой из них является предпочтительным (если это разумно?)

На каждом этапе мы угадываем букву (ранее не догадывающуюся), которая встречается в наибольшем количестве оставшихся возможных слов.

Есть некоторая мотивация, чтобы понравиться этот алгоритм - мы всегда минимально можем потерять жизнь.

Но мне кажется, что это не обязательно лучшее решение: если мы пытаемся угадать слово (в пределах определенного количества жизней), это не обязательно всегда случай, когда наиболее часто встречающимся письмом является самое полезное письмо, чтобы различать оставшиеся доступные слова.

Я не уверен, хотя, как представляется, целесообразно избегать потери жизни, где это возможно. Будет ли когда-нибудь так, что оптимальная стратегия позволяет нам жертвовать жизнью для лучшей возможности выиграть?

Вопрос: это тот случай, когда этот жадный алгоритм эквивалентен алгоритму с наилучшим шансом выигрыша или нет? И вы можете это доказать?

Пример словаря + игры был бы идеальным, чтобы показать запрет.

14
30 марта '12 в 15:23
источник поделиться
6 ответов

Предположим, что следующий словарь: ABC ABD AEF EGH. (Я воспользуюсь неприкрытыми буквами.)
Предположим, что у вас есть только 1 жизнь (делает доказательство намного проще...).

Алгоритм, предложенный выше:

Начиная с A, вы теряете (1/4) или остаетесь с aBC aBD aEF (3/4).
Теперь угадайте B и проиграйте (1/3) или останетесь с abC abD (2/3).
Теперь угадайте C или D, и вы проиграете (1/2) или выиграете (1/2).
Вероятность победы: 3/4 * 2/3 * 1/2 = 1/4.

Теперь попробуйте что-то еще:

Начиная с E, вы теряете (1/2) или остаетесь с AeF eGH (1/2).
Теперь вы знаете, что угадать и победить.
Вероятность победы: 1/2.

Очевидно, что предложенный алгоритм не является оптимальным.

8
31 марта '12 в 0:36
источник

Есть некоторые критические предположения, которые вы должны сделать относительно того, что такое игра "Hangman".

  • У вас есть только одно слово, которое вам нужно угадать, или вам нужно угадать фразу?
  • Являются ли некоторые слова более вероятными, чем другие?

Следует помнить, что если вы выберете правильное письмо, вы не потеряете предположение.

Я предоставлю решение для случая с одним словом и с вероятностью. Случай с двумя словами можно обобщить, создав новый словарь, равный декартовому произведению вашего текущего словаря и т.д. Более вероятный, чем другие, случай может быть обобщен с небольшой вероятностью.

Прежде чем мы определим наш алгоритм, определим понятие редукции. Если бы мы должны были угадывать буквы L1, L2, L3,... LN все в ONCE, тогда мы сократили бы словарь до меньшего словаря: некоторые слова были бы устранены, и, кроме того, некоторые буквы также могут быть устранены. Например, если бы у нас был словарь {dog, cat, rat} и мы догадались a, мы исключили бы {d, g}, если бы предположение было истинным, или также устранить {c, r, t}, если оно было ложным.

Оптимальный алгоритм выглядит следующим образом:

  • Рассмотрим дерево
  • Посмотрите на все узлы, где [#guesses left == 1]
  • Если нет node, игра невозможна; если есть node, это ваш ответ

Конечно, именно так вы решаете любую игру, и по большей части это невозможно из-за требований к экспоненциальному размеру. Вы не можете стать оптимальным, если не будете полностью воспроизвести это, и я серьезно сомневаюсь, что стратегия, которая не "смотрит" два или более шагов вперед, может надеяться воспроизвести это. Однако вы можете попытаться приблизить оптимальную стратегию следующим образом.

Повторите на каждом шаге следующее:

  • Рассмотрим каждую букву: выберите букву, которая будет максимизировать ожидаемое-словарь-сокращение на ожидаемый-штраф, т.е. выберите букву 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] записей, игра "Hangman" в большинстве случаев невозможна в мире с равной вероятностью (если словарь не сильно ограничен), поэтому вам нужно работать в мире с неравной вероятностью, В этом мире, а не максимизируя количество элиминации, вы максимизируете "ожидаемый сюрприз" (также называемый энтропией). Каждое слово, которое вы связываете с предыдущей вероятностью (например, предположим, что существует вероятность 0,00001 слова "putrescent" и 0,002 вероятность того, что слово "палач" ). Сюрприз равен шансу, измеренному в битах (отрицательный журнал шанса). Ответ на предположение не даст ни буквы, ни одной буквы, ни более одной буквы (многие возможности). Таким образом:

  • Для каждой возможной догадки рассмотрим эффект, который угадал бы
  • Для каждого возможного результата догадки рассмотрим вероятность этого результата. Например, если вы предположили "A" для 3-буквенного слова, вам нужно было бы рассмотреть каждый возможный результат в наборе {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=='___'); в случае, если это бесконечность, нечего терять, и мы автоматически выбираем ее.

Итак, чтобы ответить на ваш вопрос:

> В игре 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 шанс уменьшить ваш словарь до размера 3/8 для стоимости 1. Это строго лучше.

edit: Я хотел использовать пример английского словаря (выше), чтобы продемонстрировать, как это не является искусственным, и предположил, что люди могут экстраполировать из примера, не будучи зависшим от не строгого равенства. Однако здесь однозначно четкий контрпример: у вас 2000 слов. 1000 слов содержат букву a в первую очередь. Другие 1000 слов содержат уникальную комбинацию B, встроенную в другое место. Например, ?B???, ??B??, ???B?, ????B, ?BB??, ?B?B? и т.д. ? представляют произвольно выбранные символы. В первом? Нет a, кроме одного слова (чье? Является "А" ), так что частота a строго больше частоты B s. Предлагаемый алгоритм угадал бы a, который привел бы к {50%: choice_halved, 50%: choice_halved и lose_one_life}, тогда как этот алгоритм определял бы выбор B, который приводит к {50%: YOU_WIN, 50%: choice_halved и lose_one_life}. Проценты были округлены очень незначительно. (И нет, слово с двойными буквами не вносит двойной вклад в "частоту", но даже если это было сделано по безумному определению, вы могли бы тривиально изменить этот пример, сделав слова начинающимися с AAA...A.)

(в отношении комментариев: нецелесообразно жаловаться на строгое равенство в этом примере, например "999/2000", поскольку вы можете сделать вероятности случайным образом близкими друг к другу.)

(Это указывает на забавную заметку: если словарь достаточно велик, чтобы иногда делать палача невозможным, стратегия должна отбрасывать догадки, которые он не ожидает, чтобы угадать. Например, если у него только 2 движется влево, это должно сделать допущение с наивысшей вероятностью, которое оно может исключить поддеревьям с более чем 2-ходовыми достоинствами удивления.)

6
30 марта '12 в 17:30
источник

Я написал script, что оптимально решает палач [github].

Моя основная стратегия такова:

  • Для шаблона, такого как..e.. с проверенными буквами: e, s, t
  • Проверяйте слова только n цифр (в данном случае 5)
  • Создайте список возможных слов
    • Создайте регулярное выражение из предоставленной информации
    • В этом случае это будет [^est][^est]e[^est][^est]
    • Разберите свой список слов для слов, соответствующих этому регулярному выражению
  • Циклируйте каждое слово, подсчитывая количество раз, когда появляется каждая буква
  • Оптимальное следующее предположение - наиболее вероятное письмо
3
31 марта '12 в 22:53
источник

О вашей идее попытаться угадать слово вместо того, чтобы пытаться угадать буквы, наверняка могут быть отдельные случаи, когда вы угадываете слово с первой попытки или что-то в этом роде, но это не делает этот алгоритм лучше средний случай. Это о ожидаемой вероятности.

Некоторое улучшение, которое можно было бы сделать с этим алгоритмом (в версии, опубликованной Lajos), - это еще один более информированный выбор письма для проверки.
Это может быть достигнуто добавлением еще одного веса: рассмотрите использование каждого слова в словаре языка.

Например, технические, медицинские, юридические и т.д. слова имели бы гораздо меньшие шансы.

Возьмите этот словарь (с примерным весом использования):

frost    6
guilt    5
genes    1
fever    2
meter    1

Здесь e - наиболее частая буква, поэтому она будет выбрана. Это означало бы оставить только медицинские термины, которые очень маловероятны. Но если решение принято:

weight(letter) = w * frequency +
              (1 - w) * sum( usage_weight(word) where letter in word )

то, скорее всего, будет выбран t.


Потому что (скажем w = 0.2):

weight(e) = 0.2 * 3   +   0.8 * (1 + 2 + 1)
          = 3
weight(r) = 0.2 * 3   +   0.8 * (1 + 2 + 6)
          = 7.8
weight(t) = 0.2 * 3   +   0.8 * (1 + 5 + 6)
          = 10.2

Примечание. Мы должны, конечно, использовать нормализованные веса, например frequency / num_words для получения точного измерения веса.

Примечание. Этот алгоритм может и должен быть адаптирован к противнику:

  • при игре против человека более обычные слова получают более высокий вес.
  • при игре против AI это зависит от уровня сложности:
    • на простом уровне для обычных слов
    • на жестком уровне для необычных слов
2
30 марта '12 в 16:22
источник

Нет, этот жадный алгоритм не самый лучший, и я могу доказать это, предложив лучшее решение:

На каждом шаге мы знаем количество букв и знаем некоторые буквы. Мы выбираем все слова из нашего набора слов, которые имеют заданные буквы в данных положениях, а их длина соответствует длине рассматриваемого слова. Мы выбираем наиболее частое письмо из выбранного подмножества слов и догадываемся о данном письме. По каждой догадке угаданное письмо будет отмечено как угаданное, и в будущем они не будут угадываться. Таким образом, у вас гораздо лучшие шансы на выживание, чем в жадном алгоритме, описанном в вашем вопросе.

EDIT:

После выяснения вопроса и дальнейших спецификаций я пришел к выводу, что алгоритм оптимален.

Если у нас есть n слов с заданной длиной, содержащих все правильные догадки ( "хорошие буквы" ) и не содержащие каких-либо неправильных догадок ( "плохие буквы" ), x живет, мы можем посмотреть на частоту букв в все еще возможные слова и выберите букву с наибольшей частотой, пусть предположим, что слова y содержат букву.

В этом случае доверительная ставка этого предположения равна y/n, что больше, чем доверительная ставка любых других букв, что дает более высокую вероятность выживания. Таким образом, такой шаг является оптимальным. Если вы сделаете серию шагов, содержащих только шаги в этом духе, серия шагов также будет оптимальной, поэтому этот алгоритм оптимален.

Но, если у нас есть дополнительная информация (например, описание слова или знание того, что вероятность того, что одно слово дважды за короткий период), этот алгоритм может быть усилен на основе дополнительной информации, все слова в наборе слов будет значение пригодности (вероятность основана на дополнительной информации), и все типы букв в словах будут взвешены на основе оценки пригодности.

0
30 марта '12 в 15:46
источник

Выберите букву, которая делит оставшиеся действительные слова в 2 наборах почти равного размера. С позиционной информацией может быть более 2 наборов. Повторяйте, пока ваш набор не будет иметь размер 1. Это лучший способ. Доказательство остается в виде упражнения.

-1
30 марта '12 в 15:55
источник

Посмотрите другие вопросы по меткам или Задайте вопрос