Od dětství jsem se divil, jak funguje elektronická hra 20Q . Myslíte na předmět, věc nebo zvíře (např. brambor nebo osel ). Zařízení vám poté položí řadu otázek, například:
- Je větší než bochník chléb?
- Nachází se venku?
- Používá se k rekreaci?
Na každou otázku můžete odpovědět ano , no , možná nebo neznámý . Vždycky jsem si představoval, že to funguje s ohromnými vnořenými podmíněnostmi (if
-statements). Myslím si však, že je to nepravděpodobné vysvětlení kvůli jeho složitosti pro programátora.
Jak bych takový systém implementoval?
Odpověď
Nevím, jak to konkrétně udělal 20Q, ale existuje spousta informací o tom, jak implementovat hru 20 otázek .
Existuje mnoho způsobů řešení, ale popíšu jeden způsob . Tyto hry mohou implementovat jakýsi rozhodovací strom . Pro elektronickou hru, jako je 20Q, by byl tento strom předpočítaný a bylo by ho snadné procházet. Existují způsoby použití učení rozhodovacích stromů , kde hra může na konci otázek přijímat nové objekty, pokud nedokáže uhodnout, o co jde ptát se.
Když jsou otázky sérií odpovědí ano nebo ne, dostanete binární strom. Každý uzel je otázka a listy jsou odpovědi. Pokud jsou otázky zodpovězeny neznámo nebo si nejste jisti, lze podřízené uzly kombinovat a jejich dotazy pokládat v sérii, aby se možné odpovědi dále utratily.
Jedná se v zásadě o tento proces:
- Začněte s úplným seznamem objektů. Všechny mohou začínat stejně pravděpodobně, nebo je lze řadit podle toho, jak pravděpodobný byl objekt při testování.
- Začněte první otázkou v rozhodovacím stromě. Posuňte jej do fronty otázek.
- Položte otázku na frontu.
- Odpověď procesu:
- Ano / Ne odpovědi odstraní / přidá předem určené množství pravděpodobnost z každé odpovědi na základě otázky.
- Odpověď „Možná“ odstraní / přidá zlomek předem určeného množství „ano“.
- „Neznámý“ nemění pravděpodobnosti
- Odpověď „Neznámý“ nebo „Možná“ posílá otázky obou následujících uzlů do fronty otázek. Odpověď „Ano“ nebo „Ne“ pouze přidá jeden příslušný uzel ano / ne do fronty otázek.
- Pokračujte krokem 3, dokud z otázek nebo pravděpodobnosti jediné odpovědi nepřekročí předem definovanou „jistotu“ “ práh.
- Poskytněte nejpravděpodobnější odpověď.
Generování stromu je pravděpodobně tématem jiné otázky. Ale v zásadě jde o výběr otázek, které odpovědi rozdělují, jak je to jen možné. Položte otázky, které otázky rozdělují nejvíce rovnoměrně na začátek, aby bylo možné co nejvíce otázek vyřídit nejrychleji.
Odpověď
Jednoduchá odpověď je, že ruční hra 20Q byla vytvořena z umělé inteligence, která žije v http://20Q.net . Na webu 20Q.net můžete hrát různé verze hry Twenty Questions, podobně jako hračka, až na to, že se hra učí z každé hrané hry. Ruční hračka používá stejné algoritmy neuronové sítě. Neuronová síť vybírá otázky, které se mají zeptat, a provádí odhady. Tento přístup znamená, že AI bude často správně hádat, i když na otázku odpovíte odlišně od toho, co se AI naučila. Další výhodou je, že hra bude každou hru klást otázky jinak, i když uvažujete o stejné věci.
Algoritmy a neurální síť klasické anglické hry (Animal, Vegetable, Mineral) vytvořil v roce 1988 Robin Burgener. . . já.
Děkujeme za váš dotaz.
Komentáře
- Dobrý den Robin, vítejte na webu. Kdo by měl na tuto otázku odpovědět lépe než sám vynálezce. Je ' zajímavé vědět, jak složitá je ve skutečnosti 20Q. Děkujeme za váš příspěvek na web a ještě více za váš příspěvek k umělé inteligenci. Doufejme, že ' web občas navštívíte a odpovíte A.I. otázky :).
- hehe, miluju, když k tomu dojde xD.
odpověď
Vyhledal jsem „kód 20q“ a našel jsem toto: http://mosaic.cnfolio.com/B142LCW2008A197
Tato verze je pouze pro zvířata, ale skutečných 20 otázek má pravděpodobně podobný algoritmus.
Zde je rychlý přehled kódu, na který jsem odkazoval:
Existuje několik různých odpovědí pevně zakódovaných do programu.Poté jim je přiřazeno několik atributů PRAVDA nebo NEPRAVDA:
#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" ...
Jak vidíte, včela není savec, ale létá atd.
Pro každou skupinu existuje pole:
int mammals[ TOTAL_ANIMALS ] = { 0 }; int flying_animals[ TOTAL_ANIMALS ] = { 0 }; int water_animals[ TOTAL_ANIMALS ] = { 0 }; ...
Když je položena každá otázka:
askUserQuestion( guesses, "\nQuestion %d: Is your animal a mammal? \n", mammals );
Program sleduje definici příslušné kategorie a sleduje, které zvíře je nejpravděpodobnější, na které myslíte, na základě hodnot PRAVDA nebo NEPRAVDA a vaší zadané odpovědi Ano nebo Ne na otázku.
Toto se provádí za:
void askUserQuestion( int guessNumber, char* question, int* animalData );
Odpověď
Je to ne masivní rozhodovací strom nebo spousta pevně zakódovaných výroků if / else. Vynálezce Robin Burgener svůj algoritmus zcela zdokumentoval ve své přihlášce patentů z roku 2005. To „je důmyslně jednoduchý.
Komentáře
- Místo toho, abyste zkoumali další odpovědi, možná budete chtít uvést krátký popis algoritmu namísto pouhéhozveřejněním odkazu.
- v případě, že jste zmeškali další odpovědi, učinil výše uvedený komentář! Možná by zde @ user22025 mohl také stručně vysvětlit: D