Як я можу реалізувати алгоритм "20 запитань"?


16

Ще з дитинства я цікавився, як працювала електронна гра 20Q . Ви думаєте про предмет, річ чи тварину (наприклад, картоплю чи осла ). Потім пристрій задає вам ряд питань, таких як:

  • Він більший за буханець хліба?
  • Чи є його на відкритому повітрі?
  • Чи використовується для відпочинку?

На кожне запитання ви можете відповісти так , ні , можливо , або невідомо . Я завжди уявляв, як це працює з величезними, вкладеними умовами ( if-ставленнями). Однак я думаю, що це малоймовірне пояснення через його складність для програміста.

Як би я реалізував таку систему?

Відповіді:


19

Я не знаю, як 20Q це робив конкретно, але є багато інформації про те, як реалізувати гру з 20 питань .

Існує маса способів вирішення цього питання, але я опишу один із способів. Ці ігри можуть реалізувати якесь дерево рішень . Для такої електронної гри, як 20Q, це дерево було б обчисленим і досить легко пройти. Існують методи використання дерев для прийняття рішень, де гра може приймати нові об’єкти в кінці своїх запитань, якщо вона не в змозі здогадатися, що запитує користувач.

Коли на запитання є відповідь "так" або "ні", ви закінчуєте двійкове дерево. Кожен вузол - це питання, а листя - відповіді. Коли відповіді на запитання невідомі чи не впевнені, дочірні вузли можна поєднувати, а їхні питання задавати послідовно, щоб надалі змалювати можливі відповіді.

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

В основному це процес:

  1. Почніть з повного списку об’єктів. Усі вони можуть починатися з однаковою ймовірністю, або їх можна сортувати за тим, наскільки ймовірним буде обраний предмет для тестування.
  2. Почніть з першого питання в дереві рішень. Висуньте його на чергу запитань.
  3. Задайте питання вгорі черги.
  4. Відповідь процесу:
    1. Так / Ні відповіді видаляє / додає заздалегідь певну кількість ймовірностей з кожної відповіді на основі запитання.
    2. Відповідь "Можливо" видаляє / додає частину заздалегідь заданої кількості "так".
    3. "Невідомо" ймовірностей не змінює
  5. Відповідь "Невідомий" або "Можливо" натискає обидва наступні питання на вузли до черги запитань. Відповідь "Так" або "Ні" просто додає відповідний вузол так / ні до черги запитань.
  6. Перейдіть до кроку 3, поки питання або ймовірність однозначної відповіді не перевищить заздалегідь визначений поріг "визначеності".
  7. Надайте найбільш вірогідну відповідь.

Генерування дерева - це, мабуть, тема іншого питання. Але в основному це вибір питань, які максимально розділяють відповіді. Поставте питання, які поділяють питання найбільш рівномірно на початку, щоб найбільше запитань було найшвидше знято.


15

Проста відповідь полягає в тому, що портативна гра 20Q була створена із штучного інтелекту, який живе на веб-сайті http://20Q.net . На 20Q.net ви можете грати в різні версії гри «Двадцять питань», подібну до іграшки, за винятком того, що гра вчиться з кожної гри. Ручна іграшка використовує ті самі алгоритми нейронної мережі. Нейронна мережа підбирає запитання, а також здогадуючись. Такий підхід означає, що ШІ часто здогадується правильно, навіть якщо ви відповісте на питання, що відрізняється від того, про що навчали. Ще одна перевага полягає в тому, що гра буде задавати питання по-різному в кожній грі, навіть якщо ви думаєте про одне і те ж.

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

Спасибі за питання.


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 );

0

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


4
Замість того, щоб роздумувати над іншими відповідями, ви можете дати короткий опис алгоритму, а не просто розмістити посилання на нього.
Jari Komppa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.