“20 Soru” algoritmasını nasıl uygulayabilirim?


16

Çocukluğumdan beri, 20Q elektronik oyununun nasıl çalıştığını merak ettim . Bir nesneyi, şeyi veya hayvanı (örn. Patates veya eşek ) düşünüyorsunuz. Cihaz size aşağıdaki gibi bir dizi soru sorar:

  • Bir somun ekmekten daha mı büyük?
  • Açık havada mı bulundu?
  • Rekreasyon için kullanılıyor mu?

Her soru için evet , hayır , belki veya bilinmeyen cevaplarını verebilirsiniz . Her zaman muazzam, iç içe koşullarla ( if-statements) çalıştığını hayal ettim . Ancak, bunun programcı için karmaşıklığı nedeniyle beklenmedik bir açıklama olduğunu düşünüyorum.

Böyle bir sistemi nasıl uygulayabilirim?

Yanıtlar:


19

20Q'nun bunu nasıl yaptığını bilmiyorum, ancak 20 sorudan oluşan bir oyunun nasıl uygulanacağı hakkında bol miktarda bilgi var .

Bunu çözmenin birçok yolu var, ama bir yolu tarif edeceğim. Bu oyunlar bir tür karar ağacı uygulayabilir . 20Q gibi bir elektronik oyun için, bu ağaç önceden hesaplanmış ve geçişi oldukça kolaydır. Oyunun, kullanıcının ne istediğini tahmin edemediği takdirde sorularının sonunda yeni nesneleri kabul edebileceği öğrenme karar ağaçlarını kullanmak için yöntemler vardır .

Sorular bir dizi evet veya hayır cevabı olduğunda, ikili bir ağaçla sonuçlanırsınız. Her düğüm bir soru ve yapraklar cevaplar. Sorulara bilinmeyen veya emin olmayan bir şekilde yanıt verildiğinde, alt düğümler birleştirilebilir ve olası cevapları daha da kaldırmak için soruları seri olarak sorulur.

resim açıklamasını buraya girin

Temel olarak bu süreç:

  1. Nesnelerin tam listesi ile başlayın. Bunların tümü eşit derecede başlayabilir veya nesnenin test sırasında seçilme olasılığına göre sıralanabilir.
  2. Karar ağacındaki ilk soru ile başlayın. Soru sırasına itin.
  3. Soruyu kuyruğun üstünde sor.
  4. Süreç yanıtı:
    1. Evet / Hayır yanıtları, soruya dayalı olarak her bir yanıttan önceden belirlenmiş bir miktarda olasılık kaldırır / ekler.
    2. "Belki" yanıtı önceden belirlenmiş bir "evet" miktarının bir kısmını kaldırır / ekler.
    3. "Bilinmeyen" olasılıkları değiştirmez
  5. "Bilinmeyen" veya "Belki" yanıtı, sonraki düğüm sorularının her ikisini de soru kuyruğuna iter. "Evet" veya "Hayır" yanıtı, ilgili kuyruğa evet / hayır düğümünü soru kuyruğuna ekler.
  6. Soru dışı veya tek bir cevap olasılığı önceden tanımlanmış bir "kesinlik" eşiğinin ötesine gelene kadar 3. adıma gidin.
  7. En olası cevabı veriniz.

Ağacı oluşturmak muhtemelen başka bir sorunun konusudur. Ama temel olarak cevapları olabildiğince ayıran sorular seçiyor. Soruları en eşit şekilde bölen soruları en başa yakın olacak şekilde yerleştirin, böylece en çok soru en hızlı şekilde cevaplanabilir.


15

Basit cevap şu ki, el tipi oyun 20Q, http://20Q.net adresinde yaşayan yapay zekadan yaratıldı . 20Q.net'te, oyunun oynanan her oyundan öğrenmesi dışında, oyuncağı gibi Yirmi Soru oyununun farklı versiyonlarını oynayabilirsiniz. El tipi oyuncak aynı sinir ağı algoritmalarını kullanır. Sinir ağı, soru sormanın yanı sıra tahmin yapmayı da seçiyor. Bu yaklaşım, AI'ye öğretilenlerden farklı bir soruya cevap verseniz bile AI'nın sıklıkla doğru tahmin edeceği anlamına gelir. Başka bir avantajı, aynı şeyi düşünüyor olsanız bile oyunun her oyunda farklı sorular soracağıdır.

Klasik İngiliz oyununun (Hayvan, Sebze, Mineral) algoritmaları ve sinir ağı 1988'de Robin Burgener tarafından oluşturuldu. . . ben mi.

Sorduğunuz için teşekkürler.


1
Merhaba Robin, siteye hoşgeldiniz. Bu soruyu mucitin kendisinden daha iyi kim cevaplayabilir. 20Q'nun aslında ne kadar karmaşık olduğunu bilmek ilginç. Siteye ve daha fazlasına suni zekâya katkınız için teşekkür ederiz. Umarım siteyi ara sıra ziyaret edip AI sorularını cevaplarsınız :).
MichaelHouse

1
hehe, bu olduğunda xD seviyorum.
jmacedo

6

"20q kodu" nı aradım ve buldum: http://mosaic.cnfolio.com/B142LCW2008A197

Bu sürüm sadece hayvanlar içindir, ancak gerçek 20 Soru muhtemelen benzer bir algoritmaya sahiptir.

İşte ben bağlı kod hızlı bir bakış:
programa sabit kodlanmış birkaç farklı cevaplar vardır. Daha sonra bunlara birkaç TRUE veya FALSE özelliği atanır:

#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"
...

Gördüğünüz gibi bir arı memeli değil, uçuyor vb.

Her grup için bir dizi vardır:

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

Her soru sorulduğunda:

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

Program, uygun kategorinin tanımına bakar ve DOĞRU veya YANLIŞ değerlerine ve soruya girdiğiniz Evet veya Hayır cevabına dayanarak hangi hayvanın büyük olasılıkla düşündüğünüzü izler.

Bu şu şekilde yapılır:

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

0

Büyük bir karar ağacı ya da bir sürü sabit kodlu if / else deyimi değildir. Mucit Robin Burgener, 2005 patent başvurusunda algoritmasını tamamen belgeledi . Ustaca basit.


4
Diğer cevaplara bakmak yerine, algoritmaya sadece bir bağlantı göndermek yerine kısa bir açıklama vermek isteyebilirsiniz.
Jari Komppa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.