「20の質問」アルゴリズムを実装するにはどうすればよいですか?


16

子供の頃から、私は20Q電子ゲームがどのように機能するのか疑問に思っていました。オブジェクト、物、または動物(例えば、ジャガイモロバ)を思い浮かべます。次に、デバイスは次のような一連の質問をします。

  • パンの塊よりも大きいのですか?
  • 屋外で見つかりますか?
  • レクリエーションに使用されていますか?

各質問に対して、yesno多分、またはunknownと答えることができます。私は、それが巨大なネストされた条件(if-statements)で機能することを常に想像していました。ただし、プログラマにとっては複雑であるため、これは考えにくい説明だと思います。

そのようなシステムをどのように実装しますか?

回答:


19

20Qが具体的にどのように行ったかはわかりませんが、20問のゲームを実装する方法に関する情報はたくさんあります。

これを解決する方法はたくさんありますが、1つの方法を説明します。これらのゲームは、ある種の決定木を実装できます。20Qのような電子ゲームの場合、このツリーは事前に計算されており、かなり簡単にたどることができます。ユーザーが何を求めているのか推測できない場合、ゲームは質問の最後に新しいオブジェクトを受け入れることができる学習決定ツリーを使用する方法があります。

質問が「はい」または「いいえ」の一連の答えである場合、バイナリツリーになります。各ノードは質問であり、葉は回答です。不明または不明の質問に回答する場合、子ノードを組み合わせて、質問を順番に尋ねて、可能な回答をさらに選別することができます。

ここに画像の説明を入力してください

基本的にこれはプロセスです:

  1. オブジェクトの完全なリストから始めます。これらはすべて同じ可能性から開始することも、テストでオブジェクトが選択される可能性の高い順にソートすることもできます。
  2. 意思決定ツリーの最初の質問から始めます。質問キューにプッシュします。
  3. キューの上に質問をしてください。
  4. プロセス応答:
    1. [はい] / [いいえ]の回答は、質問に基づいて各回答から所定の確率を削除/追加します。
    2. 「たぶん」答えは、「はい」の所定量の一部を削除/追加します。
    3. 「不明」は確率を変更しません
  5. 「不明」または「未定」の応答は、次の両方のノードの質問を質問キューにプッシュします。「はい」または「いいえ」の応答は、それぞれの1つのyes / noノードを質問キューに追加するだけです。
  6. 質問がなくなるか、単一の回答の確率が事前定義の「確実性」しきい値を超えるまで、ステップ3に進みます。
  7. 最も可能性の高い答えを提供してください。

ツリーの生成は、おそらく別の質問のトピックです。しかし、基本的には、回答を可能な限り分割する質問を選択することです。質問を最も均等に分けることができるように、質問を最も均等に分割する質問を最初の近くに配置します。


15

簡単な答えは、ハンドヘルドゲーム20Qはhttp://20Q.netにある人工知能から作成されたということです。です。20Q.netでは、Twenty Questionsのゲームのさまざまなバージョンをプレイできますが、ゲームはプレイするすべてのゲームから学習する点を除き、おもちゃに似ています。ハンドヘルドグッズは、同じニューラルネットワークアルゴリズムを使用します。ニューラルネットワークは、推測するだけでなく、尋ねる質問を選択します。このアプローチは、AIが教えられたものとは異なる質問に答えても、AIはしばしば正しく推測することを意味します。別の利点は、同じことを考えている場合でも、ゲームごとに異なる質問をすることです。

古典的な英語ゲーム(動物、野菜、鉱物)のアルゴリズムとニューラルネットワークは、1988年にロビンバーゲナーによって作成されました。。。私。

質問してくれてありがとう。


1
こんにちはロビン、サイトへようこそ。発明者自身よりもこの質問に答えた方が良い人。20Qが実際にどれほど複雑かを知るのは興味深いことです。サイトへの貢献、さらには人工知能への貢献に感謝します。たまにサイトにアクセスして、AIの質問に答えてください:)。
マイケルハウス

1
hehe、これが起こるときそれを愛してください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 );

プログラムは適切なカテゴリーの定義を見て、TRUEまたはFALSEの値と質問に対する入力されたYesまたはNoの回答に基づいて、あなたが考えている動物である可能性が最も高い動物を追跡します。

これは以下で行われます。

void askUserQuestion( int guessNumber, char* question, int* animalData );

0

大規模な意思決定ツリーでも、ハードコーディングされたif / elseステートメントの束でもありません。発明者のロビン・バーゲナーは、2005年の特許出願でアルゴリズム完全に文書化しました。それは独創的にシンプルです。


4
他の答えに突っ込む代わりに、単にアルゴリズムへのリンクを投稿するのではなく、アルゴリズムの簡単な説明を提供することができます。
ヤリコンパ14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.