Разработка алгоритма из 20 вопросов

15 IVlad [2011-02-06 23:12:00]

Мне интересно написать алгоритм двадцать вопросов, аналогичный тому, что akinator и, в меньшей степени, 20q.net. Последнее, по-видимому, больше сосредотачивается на объектах, явно говорящих вам не думать о людях или местах. Можно сказать, что akinator является более общим, позволяя вам думать буквально о чем угодно, включая абстракции, такие как "мой брат".

Проблема заключается в том, что я не знаю, какой алгоритм используют эти сайты, но из того, что я читал, они, похоже, используют вероятностный подход, в котором задаются вопросы о том, что много раз они приводят к правильные догадки. Этот вопрос qaru.site/questions/60640/... предлагает несколько методов, но скорее смутно, и мне было бы интересно узнать подробнее.

Итак, что может быть точным и эффективным алгоритмом для игры на двадцать вопросов?

Мне интересны детали относительно:

  • Какой вопрос задавать дальше.
  • Как сделать наилучшее предположение в конце 20 вопросов.
  • Как вставить новый объект и новый вопрос в базу данных.
  • Как эффективно выполнять запрос (1, 2) и обновлять (3) базу данных.

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

algorithm artificial-intelligence puzzle


4 ответа


9 Решение IVlad [2014-05-31 10:48:00]

Хорошо, через три года я сделал это (хотя я не работал на нем полный рабочий день). Я принимал грубую реализацию на http://twentyquestions.azurewebsites.net/, если кто-то заинтересован (пожалуйста, не научи слишком много неправильного материала!).

Это было не так сложно, но я бы сказал, что это неинтуитивный вид, который не сложно, о чем вы не сразу думаете. Мои методы включают в себя некоторые тривиальные оценки на основе фитнеса, идеи из обучения подкреплению и round-robin метод планирования новые вопросы, которые необходимо задать. Все это реализовано в нормализованной реляционной базе данных.

Мои основные идеи следуют. Если кто-то заинтересован, я также поделюсь кодом, просто свяжитесь со мной. Я планирую сделать его открытым исходным кодом в конце концов, но как только я проведу немного больше тестирования и переделки. Итак, мои идеи:

  • a Сущности таблица, в которой хранятся символы и объекты;
  • a Вопросы таблица, в которой содержатся вопросы, которые также представлены пользователями;
  • Таблица EntityQuestions содержит отношения сущности-вопроса. Это содержит количество ответов каждого ответа на каждый вопрос по отношению к каждому объекту (ну, впрочем, те, для которых в любом случае был задан вопрос). Он также имеет поле "Фитнес", которое используется для ранжирования вопросов от "более общих" до "более конкретных";
  • Таблица GameEntities используется для ранжирования объектов в соответствии с ответами, данными до сих пор для каждой текущей игры. Ответ A на вопрос Q подталкивает все сущности, для которых большинство отвечает на вопрос Q A;
  • Первый заданный вопрос выбирается из тех, у кого наибольшая сумма занятий по таблице EntityQuestions;
  • Каждый следующий вопрос выбирается из тех, у которых максимальная пригодность связана с текущими верхними записями в таблице GameEntities. Вопросы, для которых ожидаемый ответ "Да", предпочтительнее даже до фитнеса, потому что у них больше шансов консолидировать нынешний топ-рейтинг объекта;
  • Если система полностью уверена в ответе, даже до того, как будут заданы все 20 вопросов, она начнет задавать вопросы, не связанные с ее ответом, чтобы узнать больше об этом объекте. Это делается круговым способом из глобального набора вопросов прямо сейчас. Обсуждение: округло-рубино, или должно быть полностью случайным?
  • Преждевременные ответы также даются при определенных условиях и вероятностях;
  • Угадываются на основе ранжирования в GameEntities. Это позволяет системе также учитывать ложь, потому что она никогда не устраняет никакой возможности, просто уменьшает ее вероятность быть ответом;
  • После каждой игры соответственно обновляются статистика по фитнесу и ответам: значения пригодности для ассоциаций с субъектами уменьшаются, если игра была потеряна, и увеличиваются в противном случае.

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


4 Karoly Horvath [2012-03-27 14:26:00]

Это очень интересный вопрос. К сожалению, у меня нет полного ответа, позвольте мне просто записать идеи, которые я мог бы придумать через 10 минут:

  • Если вы можете вдвое сократить набор доступных ответов по каждому вопросу, вы можете различить 2 ^ 20 ~ 1 млн "объектов". Ваш набор, вероятно, будет больше, поэтому можно предположить, что иногда вам приходится делать предположения.
  • Вы хотите максимизировать полезность. Некоторые объекты выбираются чаще других. Если вы хотите сделать хорошие догадки, вы должны учитывать вес каждого объекта (= вероятность того, что этот объект будет выбран) при создании дерева.
  • Если вы доверяете своим пользователям, вы можете получить знания, основанные на их ответах. Это также означает, что вы не можете использовать статическое дерево, чтобы задавать вопросы, потому что тогда вы получите ответы на одни и те же вопросы.. и вы не узнаете ничего нового, если столкнулись с одним и тем же объектом.
  • Если простой вопрос не может разделить набор на две половины, вы можете комбинировать их для получения лучших результатов: например: "это объект зеленый или синий?". "зеленый или имеет круглую форму?"

4 Anaphory [2012-03-27 14:00:00]

Я пытаюсь написать реализацию python, используя наивную байесовскую сеть для обучения и минимизации ожидаемой энтропии после ответа на вопрос как критерий выбора вопроса (с вероятностью epsilon выбрать случайный вопрос, чтобы узнать подробнее об этом вопросе), следуя идеям http://lists.canonical.org/pipermail/kragen-tol/2010-March/000912.html. Я поставил то, что получил до сих пор на github.

  • Предпочтительно выбирать вопросы с низким остаточным ожиданием энтропии. (Чтобы собрать что-то быстро, я украл у е-жадного многорукого бандита обучение и использование: с вероятностью 1-ε: задайте вопрос с наименьшим оставшимся ожиданием энтропии. С вероятностью ε: задайте любой случайный вопрос. Однако этот подход кажется далеко не оптимальным.)
  • Так как мой подход - байесовская сеть, я получаю вероятности объектов и могу запросить наиболее вероятный объект.
    • Новый объект добавляется как новый столбец к матрице вероятностей с низкой априорной вероятностью и ответами на вопросы, заданные, если они даны или как предполагалось сетью Байеса, если они не указаны. (Я ожидаю, что эта вторая часть будет работать намного лучше, если я добавлю обучение сетевой сети Байеса вместо того, чтобы просто использовать наивные байесов.)
    • Аналогично, новый вопрос представляет собой новую строку в матрице. Если это происходит от ввода пользователем, вероятно, известно только очень мало вероятности ответа, остальное нужно угадать. (В общем случае, если вы можете получить объекты, попросив свойства, вы можете получить свойства, спросив, есть ли у них эти объекты или нет, а трансформация между ними по существу является теоремой Байеса и разбивается на транспозицию в самом простом случае. качество должно улучшиться снова, как только сеть будет иметь соответствующую структуру.)
  • (Это проблема, так как я вычисляю множество вероятностей. Моя цель - сделать это с использованием базисных разреженных тензорных вычислений, оптимизированных для работы с взвешенными направленными ациклическими графами.)

1 Kevin Read [2011-02-07 00:13:00]

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

Чтобы ответить на вопросы:

  • Вы просто ходите по дереву:)
  • Это большой недостаток деревьев решений. У вас будет только одна догадка, которая может быть прикреплена к конечным узлам дерева на глубине 20 (или раньше, если дерево все еще разрежено).
  • Есть целые книги, посвященные этой теме. Насколько я помню из класса AI, вы всегда стараетесь минимизировать энтропию, поэтому вы хотите задать вопросы, которые идеально разделяют набор оставшихся объектов на два набора равного размера. Боюсь, вам придется искать это в книгах AI.
  • Деревья принятия решений очень эффективны во время фазы запроса, так как вы буквально проходите дерево и следуете ветке "да" или "нет" на каждом node. Эффективность обновления зависит от применяемого алгоритма обучения. Вы могли бы сделать это в автономном режиме, как в ночном пакетном обновлении или что-то в этом роде.