Я не знаю, как 20Q сделал это конкретно, но есть много информации о том, как реализовать игру из 20 вопросов .
Есть много способов решения этой проблемы, но я опишу один из них. Эти игры могут реализовать своего рода дерево решений . Для электронной игры, такой как 20Q, это дерево будет предварительно вычислено и достаточно легко пройдено. Существуют методы использования деревьев решений для обучения, где игра может принимать новые объекты в конце своих вопросов, если она не может угадать, о чем спрашивает пользователь.
Когда вопросы представляют собой серию ответов «да» или «нет», получается двоичное дерево. Каждый узел - это вопрос, а листья - ответы. Когда на вопросы отвечают с неизвестными или не уверенными, дочерние узлы могут быть объединены, и их вопросы заданы последовательно, чтобы далее отбросить возможные ответы.
В основном это процесс:
- Начните с полного списка объектов. Все они могут начинаться с одинаковой вероятностью, или они могут быть отсортированы по вероятности выбора объекта при тестировании.
- Начните с первого вопроса в дереве решений. Вставьте его в очередь вопросов.
- Задайте вопрос в верхней части очереди.
- Ответ процесса:
- Да / Нет ответов удаляет / добавляет заранее определенное количество вероятностей из каждого ответа на основе вопроса.
- «Возможно» ответ удаляет / добавляет часть заранее определенного количества «да».
- «Неизвестно» не меняет вероятности
- Ответ «Неизвестно» или «Возможно» помещает оба вопроса из следующих узлов в очередь вопросов. Ответ «Да» или «Нет» просто добавляет один соответствующий узел «да / нет» в очередь вопросов.
- Переходите к шагу 3 до тех пор, пока количество вопросов или вероятность одного ответа не превысят заранее установленный порог "определенности".
- Предоставьте наиболее вероятный ответ.
Генерация дерева, вероятно, тема другого вопроса. Но в основном это выбор вопросов, которые максимально разделяют ответы. Поместите вопросы, которые наиболее равномерно разделяют вопросы, в начало, чтобы наибольшее количество вопросов можно было отбирать быстрее.
Я погуглил "20q код" и нашел это: http://mosaic.cnfolio.com/B142LCW2008A197
Эта версия предназначена только для животных, но фактические 20 вопросов, вероятно, имеют аналогичный алгоритм.
Вот краткий обзор кода, который я связал:
Есть несколько различных ответов, жестко запрограммированных в программе. Затем им присваивается несколько атрибутов TRUE или FALSE:
Как видите, пчела не млекопитающая, а летает и т. Д.
Для каждой группы есть массив:
Когда задают каждый вопрос:
Программа просматривает определение соответствующей категории и отслеживает, какое животное наиболее вероятно является тем, о котором вы думаете, на основе значений ИСТИНА или ЛОЖЬ и вашего предполагаемого ответа «Да» или «Нет» на вопрос.
Это сделано в:
источник
Это не массивное дерево решений или набор жестко закодированных операторов if / else. Робин Бургенер, изобретатель, полностью задокументировал свой алгоритм в своей заявке на патент 2005 года. Это гениально просто.
источник