Ända sedan barndomen har jag undrat hur det elektroniska spelet 20Q fungerar. Du tänker på ett objekt, en sak eller ett djur (t.ex. potatis eller åsna ). Enheten ställer dig sedan en serie frågor som:
- Är den större än en limpa bröd?
- Finns det utomhus?
- Används det för rekreation?
För varje fråga kan du svara ja , nej , kanske eller okänt . Jag har alltid föreställt mig att det fungerar med enorma, kapslade villkor (if
-uttalanden). Jag tycker dock att det är en osannolik förklaring på grund av dess komplexitet för programmeraren.
Hur skulle jag implementera ett sådant system?
Svar
Jag vet inte hur 20Q gjorde det specifikt, men det finns gott om information om hur man implementerar ett spel med 20 frågor .
Det finns många sätt att lösa detta, men jag kommer att beskriva ett sätt . Dessa spel kan implementera någon form av beslutsträd . För ett elektroniskt spel som 20Q skulle detta träd vara förberäknat och ganska lätt att korsa. Det finns metoder för att använda att lära sig beslutsträd där spelet kan acceptera nya objekt i slutet av frågorna om det inte kan gissa vad användaren är ställer.
När frågorna är en serie med ja eller nej-svar får du ett binärt träd. Varje nod är en fråga och bladen är svar. När frågor besvaras med okända eller osäkra kan barnnoderna kombineras och deras frågor ställs i serie för att ytterligare ta bort eventuella svar.
I grund och botten är detta processen:
- Börja med en fullständig lista över objekten. Dessa kan alla börja lika troligt, eller så kan de sorteras efter hur troligt objektet skulle väljas vid testning.
- Börja med den första frågan i beslutsträdet. Tryck in den i fråkkön.
- Ställ frågan ovanpå kön.
- Processvar:
- Ja / Nej svar tar bort / lägger till en förutbestämd mängd sannolikhet från varje svar baserat på frågan.
- ”Kanske” svaret tar bort / lägger till en bråkdel av den förutbestämda mängden av ett ”ja”.
- ”Unknown” ändrar inte sannolikheten
- Ett ”Okänt” eller ”Kanske” svar skickar båda de följande nodfrågorna in i frågekön. Svaret ”Ja” eller ”Nej” lägger bara till den respektive ja / nej-noden i fråge-kön.
- Gå till steg 3 tills det av frågor eller sannolikheten för ett enstaka svar är bortom en fördefinierad ”säkerhet ”tröskel.
- Ge det mest troliga svaret.
Att generera trädet är förmodligen ämnet för en annan fråga. Men i grund och botten väljer vi frågor som delar upp svaren så mycket som möjligt. Ställ frågorna som delar frågorna lika lika nära början så att flest antal frågor kan tas bort snabbast.
Svar
Det enkla svaret är att det handhållna spelet 20Q skapades från den artificiella intelligensen som lever vid http://20Q.net . På 20Q.net kan du spela olika versioner av spelet Twenty Questions, som liknar leksaken förutom att spelet lär sig av varje spel som spelas. Den handhållna leksaken använder samma neurala nätverksalgoritmer. Neurala nätverk väljer de frågor som ska ställas samt gör gissningar. Detta tillvägagångssätt innebär att AI ofta gissar korrekt även om du svarar på en fråga annorlunda än vad AI har lärt sig. kommer att ställa frågor olika varje spel även om du tänker på samma sak.
Algoritmerna och det neurala nätverket av det klassiska engelska spelet (Animal, Vegetable, Mineral) skapades 1988 av Robin Burgener. . . mig.
Tack för att du frågade.
Kommentarer
- Hej Robin, välkommen till sajten. Vem är bättre att svara på denna fråga än uppfinnaren själv. Det är ’ intressant att veta hur komplex 20Q faktiskt är. Tack för ditt bidrag till webbplatsen och mer så ditt bidrag till artificiell intelligens. Förhoppningsvis besöker du ’ sajten ibland och svarar A.I. frågor :).
- hehe, älskar det när detta händer xD.
Svar
Jag googlade ”20q-kod” och hittade det här: http://mosaic.cnfolio.com/B142LCW2008A197
Denna version är endast för djur men de faktiska 20 frågorna har förmodligen en liknande algoritm.
Här är en snabb översikt över koden jag länkade:
Det finns flera olika svar som är hårda kodade i programmet.Flera SANT eller FALSKA attribut tilldelas dem sedan:
#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" ...
Som du kan se är ett bi inte däggdjur men det flyger osv.
Det finns en matris för varje grupp:
int mammals[ TOTAL_ANIMALS ] = { 0 }; int flying_animals[ TOTAL_ANIMALS ] = { 0 }; int water_animals[ TOTAL_ANIMALS ] = { 0 }; ...
När varje fråga ställs:
askUserQuestion( guesses, "\nQuestion %d: Is your animal a mammal? \n", mammals );
Programmet tittar på definitionen av lämplig kategori och spårar vilket djur som är mest troligt det du tänker på baserat på SANT eller FALSKA värden och ditt inmatade ja eller nej svar på frågan.
Detta görs i:
void askUserQuestion( int guessNumber, char* question, int* animalData );
Svar
It ”s inte ett massivt beslutsträd eller en massa hårdkodade if / else-uttalanden. Robin Burgener, uppfinnaren, dokumenterade fullständigt sin algoritm i sin patentansökan 2005. ”är genialt enkelt.
Kommentarer
- Istället för att peka på de andra svaren kanske du vill ge en kort beskrivning av algoritmen istället för barapublicera en länk till den.
- om du missade de andra svaren kommenterade han ovan! kanske @ user22025 kan också ge en kort förklaring här: D