Как я могу реализовать алгоритм «20 вопросов»?

16

Еще с детства я удивлялся, как работает электронная игра 20Q . Вы думаете о предмете, вещи или животном (например, картофель или осел ). Затем устройство задает вам ряд вопросов, таких как:

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

На каждый вопрос вы можете ответить да , нет , может быть , или неизвестно . Я всегда представлял, как это работает с огромными вложенными условными ifвыражениями. Однако я думаю, что это маловероятное объяснение из-за его сложности для программиста.

Как бы я внедрил такую ​​систему?

Даниэль говорит восстановить Монику
источник

Ответы:

19

Я не знаю, как 20Q сделал это конкретно, но есть много информации о том, как реализовать игру из 20 вопросов .

Есть много способов решения этой проблемы, но я опишу один из них. Эти игры могут реализовать своего рода дерево решений . Для электронной игры, такой как 20Q, это дерево будет предварительно вычислено и достаточно легко пройдено. Существуют методы использования деревьев решений для обучения, где игра может принимать новые объекты в конце своих вопросов, если она не может угадать, о чем спрашивает пользователь.

Когда вопросы представляют собой серию ответов «да» или «нет», получается двоичное дерево. Каждый узел - это вопрос, а листья - ответы. Когда на вопросы отвечают с неизвестными или не уверенными, дочерние узлы могут быть объединены, и их вопросы заданы последовательно, чтобы далее отбросить возможные ответы.

введите описание изображения здесь

В основном это процесс:

  1. Начните с полного списка объектов. Все они могут начинаться с одинаковой вероятностью, или они могут быть отсортированы по вероятности выбора объекта при тестировании.
  2. Начните с первого вопроса в дереве решений. Вставьте его в очередь вопросов.
  3. Задайте вопрос в верхней части очереди.
  4. Ответ процесса:
    1. Да / Нет ответов удаляет / добавляет заранее определенное количество вероятностей из каждого ответа на основе вопроса.
    2. «Возможно» ответ удаляет / добавляет часть заранее определенного количества «да».
    3. «Неизвестно» не меняет вероятности
  5. Ответ «Неизвестно» или «Возможно» помещает оба вопроса из следующих узлов в очередь вопросов. Ответ «Да» или «Нет» просто добавляет один соответствующий узел «да / нет» в очередь вопросов.
  6. Переходите к шагу 3 до тех пор, пока количество вопросов или вероятность одного ответа не превысят заранее установленный порог "определенности".
  7. Предоставьте наиболее вероятный ответ.

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

MichaelHouse
источник
15

Простой ответ заключается в том, что портативная игра 20Q была создана на основе искусственного интеллекта, который находится на http://20Q.net . На 20Q.net вы можете играть в разные версии игры «Двадцать вопросов», похожие на игрушку, за исключением того, что игра учится на каждой игре. Ручная игрушка использует те же алгоритмы нейронной сети. Нейронная сеть выбирает вопросы, чтобы задать, а также делать предположения. Этот подход означает, что ИИ часто будет правильно угадывать, даже если вы ответите на вопрос не так, как его научили. Еще одним преимуществом является то, что игра будет задавать вопросы по-разному в каждой игре, даже если вы думаете об одном и том же.

Алгоритмы и нейронная сеть классической английской игры (Animal, Vegetable, Mineral) была создана в 1988 году Робином Бургенером. , , мне.

Спасибо за вопрос.

user22025
источник
1
Привет Робин, добро пожаловать на сайт. Кто лучше ответит на этот вопрос, чем сам изобретатель. Интересно узнать, насколько сложен 20Q на самом деле. Спасибо за ваш вклад в сайт и тем более за вклад в искусственный интеллект. Надеюсь, вы будете время от времени посещать сайт и отвечать на вопросы AI.
MichaelHouse
1
хе-хе, люблю, когда это происходит xD.
Jmacedo
6

Я погуглил "20q код" и нашел это: http://mosaic.cnfolio.com/B142LCW2008A197

Эта версия предназначена только для животных, но фактические 20 вопросов, вероятно, имеют аналогичный алгоритм.

Вот краткий обзор кода, который я связал:
Есть несколько различных ответов, жестко запрограммированных в программе. Затем им присваивается несколько атрибутов TRUE или FALSE:

#define ANIMALS_LIST      "daddylonglegs bee penguin eagle giraffe octopus tiger elephant jellyfish bull \nparrot dolphin python crocodile cat leopard monkey zebra sheep rat \nowl spider frog polarbear snail tortoise rabbit salmon rhino fox"
#define MAMMALS                    "0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 1 1 1 0 0 0 1 0 0 1 0 1 1"
#define FLYING_ANIMALS             "1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
#define WATER_ANIMALS              "0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0"
#define BEAK                       "0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0"
...

Как видите, пчела не млекопитающая, а летает и т. Д.

Для каждой группы есть массив:

int   mammals[ TOTAL_ANIMALS ] = { 0 };
int   flying_animals[ TOTAL_ANIMALS ] = { 0 };
int   water_animals[ TOTAL_ANIMALS ] = { 0 };
...

Когда задают каждый вопрос:

  askUserQuestion( guesses, "\nQuestion %d: Is your animal a mammal? \n", mammals );

Программа просматривает определение соответствующей категории и отслеживает, какое животное наиболее вероятно является тем, о котором вы думаете, на основе значений ИСТИНА или ЛОЖЬ и вашего предполагаемого ответа «Да» или «Нет» на вопрос.

Это сделано в:

void askUserQuestion( int guessNumber, char* question, int* animalData );
eazimmerman
источник
0

Это не массивное дерево решений или набор жестко закодированных операторов if / else. Робин Бургенер, изобретатель, полностью задокументировал свой алгоритм в своей заявке на патент 2005 года. Это гениально просто.

Cerin
источник
4
Вместо того, чтобы искать другие ответы, вы можете дать краткое описание алгоритма, а не просто опубликовать ссылку на него.
Яри ​​Комппа