子供の頃から、 20Q の電子ゲームはどのように機能するのか疑問に思いました。あなたは物、物、動物について考えます。 (例:ポテトまたはロバ)次に、デバイスは次のような一連の質問をします。
- 一杯よりも大きいですか。パン?
- 屋外で見つかりましたか?
- レクリエーションに使用されていますか?
質問ごとに、はい<と答えることができます。 / em>、 no 、 maybe 、または unknown 。私はいつも、それが巨大なネストされた条件(if
-ステートメント)。ただし、プログラマーにとって複雑であるため、これはありそうもない説明だと思います。
このようなシステムをどのように実装しますか?
回答
20Qが具体的にどのように行ったかはわかりませんが、 20の質問。
これを解決する方法はたくさんありますが、1つの方法について説明します。 。これらのゲームは、ある種の決定木を実装できます。 20Qのような電子ゲームの場合、このツリーは事前に計算されており、トラバースするのはかなり簡単です。 学習決定木を使用する方法があり、ユーザーが何であるかを推測できない場合、ゲームは質問の最後に新しいオブジェクトを受け入れることができます。質問します。
質問が一連の「はい」または「いいえ」の回答である場合、最終的には二分木になります。各ノードは質問であり、葉は答えです。質問が不明または不明で回答された場合、子ノードを組み合わせて、それらの質問を連続して質問し、可能な回答をさらに選別することができます。
基本的にこれはプロセスです:
- オブジェクトの完全なリストから始めます。これらはすべて同じ可能性で開始することも、テストでオブジェクトが選択される可能性で並べ替えることもできます。
- 決定木の最初の質問から始めます。質問キューにプッシュします。
- キューの一番上に質問をします。
- プロセスの応答:
- はい/いいえの回答は、所定の量を削除/追加します。質問に基づく各回答からの確率。
- 「たぶん」の回答は、「はい」の所定の量の一部を削除/追加します。
- 「不明」は確率を変更しません
- 「不明」または「たぶん」の応答は、次のノードの両方の質問を質問キューにプッシュします。 「はい」または「いいえ」の応答は、それぞれのはい/いいえノードを質問キューに追加するだけです。
- 質問がなくなるか、単一の回答の確率が事前定義された「確実性」を超えるまで、手順3に進みます。 “しきい値。
- 最も可能性の高い答えを提供します。
ツリーの生成は、おそらく別の質問のトピックです。ただし、基本的には、回答を可能な限り分割する質問を選択します。質問を最も均等に分割する質問を最初の近くに配置して、最も多くの質問を最速で選別できるようにします。
回答
簡単な答えは、ハンドヘルドゲーム20Qは、
アルゴリズム古典的な英語のゲーム(動物、野菜、鉱物)のニューラルネットワークは、1988年にRobinBurgenerによって作成されました。 。 。私。
お問い合わせいただきありがとうございます。
コメント
- こんにちは、ロビン、サイトへようこそ。発明者自身よりもこの質問に答える方が良い人。 ' 20Qが実際にどれほど複雑かを知ることは興味深いことです。サイトへの貢献、そして人工知能への貢献に感謝します。うまくいけば、'時々サイトにアクセスして、A.I。に答えてください。質問:)。
- これが起こったらxDが大好きです。
回答
「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の値と、質問に対する入力された「はい」または「いいえ」の回答に基づいて、考えている動物である可能性が最も高い動物を追跡します。
これは次の場所で行われます:
void askUserQuestion( int guessNumber, char* question, int* animalData );
回答
大規模な決定木やハードコードされたif / elseステートメントの束ではありません。発明者のRobinBurgenerは、2005年の特許出願でアルゴリズムを完全に文書化しました。 「非常にシンプルです。
コメント
- 他の答えを突く代わりに、単にアルゴリズムの簡単な説明を与えることをお勧めします。リンクを投稿してください。
- 他の回答を見逃した場合に備えて、彼は上記のコメントをしました。たぶん@ user22025もここで簡単な説明をすることができます:D