Come posso implementare un algoritmo "20 domande"?


16

Fin da bambino, mi chiedevo come funzionasse il gioco elettronico 20Q . Pensi a un oggetto, una cosa o un animale (ad es. Patata o asino ). Il dispositivo ti pone quindi una serie di domande come:

  • È più grande di una pagnotta?
  • Si trova all'aperto?
  • È usato per la ricreazione?

Per ogni domanda, puoi rispondere , no , forse o sconosciuto . Ho sempre immaginato che funzionasse con immensi condizionali nidificati ( if-statements). Tuttavia, penso che sia una spiegazione improbabile a causa della sua complessità per il programmatore.

Come implementerei un tale sistema?

Risposte:


19

Non so come 20Q lo abbia fatto in modo specifico, ma ci sono molte informazioni su come implementare un gioco di 20 domande .

Esistono molti modi per risolverlo, ma descriverò un modo. Questi giochi possono implementare una sorta di albero decisionale . Per un gioco elettronico come il 20Q, questo albero sarebbe precompilato e abbastanza facile da attraversare. Esistono metodi per utilizzare gli alberi decisionali di apprendimento in cui il gioco può accettare nuovi oggetti alla fine delle sue domande se non è in grado di indovinare ciò che l'utente sta chiedendo.

Quando le domande sono una serie di risposte sì o no, si finisce con un albero binario. Ogni nodo è una domanda e le foglie sono risposte. Quando le domande ricevono una risposta sconosciuta o incerta, i nodi figlio possono essere combinati e le loro domande poste in serie per eliminare ulteriormente le possibili risposte.

inserisci qui la descrizione dell'immagine

Fondamentalmente questo è il processo:

  1. Inizia con un elenco completo degli oggetti. Tutti questi possono iniziare con la stessa probabilità, oppure possono essere ordinati in base alla probabilità che l'oggetto debba essere scelto durante il test.
  2. Inizia con la prima domanda nell'albero decisionale. Inseriscilo nella coda delle domande.
  3. Poni la domanda in cima alla coda.
  4. Risposta al processo:
    1. Sì / No risposte rimuove / aggiunge una quantità predeterminata di probabilità da ciascuna risposta in base alla domanda.
    2. La risposta "Forse" rimuove / aggiunge una frazione della quantità predeterminata di un "sì".
    3. "Unknow" non cambia le probabilità
  5. Una risposta "Sconosciuto" o "Forse" inserisce entrambe le domande dei nodi successivi nella coda delle domande. Una risposta "Sì" o "No" aggiunge semplicemente il rispettivo nodo sì / no alla coda delle domande.
  6. Andare al passaggio 3 fino a quando per domande o probabilità che una singola risposta superi una soglia di "certezza" predefinita.
  7. Fornisci la risposta più probabile.

Generare l'albero è probabilmente l'argomento di un'altra domanda. Ma fondamentalmente è scegliere domande che dividano il più possibile le risposte. Metti le domande che dividono le domande più equamente vicino all'inizio in modo che il maggior numero di domande possa essere eliminato il più velocemente.


15

La semplice risposta è che il gioco portatile 20Q è stato creato dall'intelligenza artificiale che vive su http://20Q.net . Su 20Q.net puoi giocare a diverse versioni del gioco di Twenty Questions, simile al giocattolo, tranne per il fatto che il gioco impara da ogni gioco giocato. Il giocattolo portatile utilizza gli stessi algoritmi di rete neurale. La rete neurale raccoglie le domande da porre oltre a fare ipotesi. Questo approccio significa che l'IA spesso indovina correttamente anche se si risponde a una domanda in modo diverso da ciò che l'IA è stata insegnata. Un altro vantaggio è che il gioco farà domande in modo diverso ad ogni gioco anche se stai pensando alla stessa cosa.

Gli algoritmi e la rete neurale del classico gioco inglese (Animal, Vegetable, Mineral) è stato creato nel 1988 da Robin Burgener. . . me.

Grazie per avermelo chiesto.


1
Ciao Robin, benvenuto nel sito. Chi meglio di rispondere a questa domanda se non l'inventore stesso. È interessante sapere quanto sia complesso il 20Q. Grazie per il tuo contributo al sito e ancora di più per il tuo contributo all'intelligenza artificiale. Spero che visiterai il sito di tanto in tanto e risponderai alle domande dell'IA :).
MichaelHouse

1
hehe, lo adoro quando succede xD.
jmacedo,

6

Ho cercato su Google "codice 20q" e ho trovato questo: http://mosaic.cnfolio.com/B142LCW2008A197

Questa versione è solo per animali, ma le attuali 20 Domande probabilmente hanno un algoritmo simile.

Ecco una rapida panoramica del codice che ho collegato:
Ci sono molte risposte diverse codificate nel programma. A loro vengono quindi assegnati diversi attributi TRUE o 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"
...

Come vedi un'ape non è un mammifero ma vola, ecc.

C'è un array per ogni gruppo:

int   mammals[ TOTAL_ANIMALS ] = { 0 };
int   flying_animals[ TOTAL_ANIMALS ] = { 0 };
int   water_animals[ TOTAL_ANIMALS ] = { 0 };
...

Quando viene posta ogni domanda:

  askUserQuestion( guesses, "\nQuestion %d: Is your animal a mammal? \n", mammals );

Il programma esamina la definizione della categoria appropriata e tiene traccia di quale animale è probabilmente quello a cui stai pensando in base ai valori VERO o FALSO e alla risposta Sì o No inserita alla domanda.

Questo viene fatto in:

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

0

Non è un enorme albero decisionale o un mucchio di istruzioni if ​​/ else codificate. Robin Burgener, l'inventore, documentò completamente il suo algoritmo nel suo deposito di brevetto del 2005. È ingegnosamente semplice.


4
Invece di dare un'occhiata alle altre risposte, potresti voler dare una breve descrizione dell'algoritmo invece di pubblicare un link ad esso.
Jari Komppa
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.