Programmierung von Akinator

  • 7 Antworten
  • Neuester Beitrag
Diskutiere Programmierung von Akinator im Android App Entwicklung im Bereich Betriebssysteme & Apps.
E

erli2909

Fortgeschrittenes Mitglied
Hallo Leute.

Bin auf dem Weg meine dritte App vorzubereiten, hab schon ein wenig Erfahrung mit der Spiele-Programmierung, nun soll es aber was anderes sein.

Mich interessiert das Prinzip der App Akinator. Viele von euch werden sie kennen: Es werden eine gewisse Zahl an Ja/Nein Fragen gestellt worauf der Akinator "errät" an welche Person man gerade denkt.

Ein ähnliches Verfahren will ich auch in meine nächste App einbauen, mir ist nur die Funktionsweise nicht ganz klar.

Mein Ansatz: Eine Datenbank, in der jeder "zu erratene Namen" steht, weiters eine Vielzahl an Fragen (beim Akinator wohl mehrere 100) die jeden dieser Namen mit Ja/Nein beantwortet. Was haltet ihr davon, wäre dies der beste Weg? Die Datenbank wäre dann ja ziemlich groß und enthält zu 99% die Antwort "Nein"..

Meine Datenbank würde ich auch einfach nur lokal am Gerät speichern um keine Internetverbindung zu brauchen und auch um schneller zu sein. So groß wird meine Datenbank nicht.

Ich würde gern eure Meinung dazu wissen..
 
ui_3k1

ui_3k1

Gesperrt
Hey,

eine Datenbank wird wohl notwendig sein um die "Aussagen" verwerten (speichern/abfragen) zu können.

Wenn das Programm nur "im kleinen" Ablaufen soll, könnte eine Lösung aussehen, dass du dir vorher überlegst in welchen Kategorien zB "Mann / Frau" "real / Fabelwesen" die Abfragen erfolgen, um möglichst schnell Fälle ausschließen zu können.
Mit einer Datenbank wirst du wahrscheinlich eine ganze Reihe an "Eigenschaften" für eine Person brauchen, um sicher eine Zuordnung treffen zu können.

Am besten schreibst du dir erstmal einige Personen (Einträge) auf, die du später erraten lassen willst und überlegst dir, mit welchen Fragen die sich unterscheiden lassen (ggf. legst du noch ein Wertesystem an für Fragen, die viele Ausschlüsse hervorrufen, diese Fragen sollten dann als erstes in der App ablaufen)...
 
Zuletzt bearbeitet:
E

erli2909

Fortgeschrittenes Mitglied
Also vom Grundsatz her ist glaub ich klar: "So lange Fragen stellen, bis nur noch 1 Person in der Datenbank übrig bleibt.

Vom Ansatz der Fragestellung ist es dann (nehme ich an) am besten, immer Fragen zu stellen, welche eine Verteilung von möglichst 50:50 an Ja/Nein haben. Damit kann man schnell viele Dinge ausschließen. Bei 10 Fragen wären das aber gerade mal 1024 unterscheidbare Personen.

Ich denke beim Akinator spielen da viele andere Faktoren auch mit, zum Beispiel die Häufigkeit der Aufrufe..

Hm, einfach wird das nicht^^
 
Z

Zoopa

Stammgast
erli2909 schrieb:
Mein Ansatz: Eine Datenbank, in der jeder "zu erratene Namen" steht, weiters eine Vielzahl an Fragen (beim Akinator wohl mehrere 100) die jeden dieser Namen mit Ja/Nein beantwortet. Was haltet ihr davon, wäre dies der beste Weg? Die Datenbank wäre dann ja ziemlich groß und enthält zu 99% die Antwort "Nein"..
Ich würde in der Datenbank nur korrekte Eigenschaften der Person speichern.

z.B. Haarfarbe: blond, Alter: 32, Beruf: Schauspieler

Und die Fragen sind dann unabhängig von irgendwelchen Personen, sondern sind einfach immer einer Eigenschaft zugeordnet.

Die Frage
Hat die Person blonde Haare?
bezieht sich dann auf die Eigenschaft Haarfarbe.

Die Frage
Ist die Person älter als 20?
bezieht sich auf das Alter.

Mit den Ergebnissen erweiterst du immer deine vorherige Datenbankabfrage.

Nach der ersten Frage:
Gib mir alle Personen mit blonden Haaren
Nach der zweiten Frage:
Gib mir alle Personen mit blonden Haaren und Alter grösser als 20
Und immer, wenn du mehr als einen Datensatz findest, musst du noch eine weitere Frage stellen. Dabei kannst du natürlich auch etwas Logik einbauen, statt einfach nur eine zufällige Frage zu wählen. Wenn du z.B. nur noch zwei Personen als Möglichkeit hast, suchst du dir eine Eigenschaft, die bei beiden unterschiedlich ist. Zu dieser Eigenschaft stellst du dann eine passende Frage, die eine der beiden möglichen Personen ausschliesst.

Vermutlich wäre es sogar sinnvoll, wenn du keine fixen Fragen vorgibst, sondern nur "Schablonen", etwa so:
Hat die Person {FARBE} Haare?
Ist die Person älter als {ALTER}?
{FARBE} und {ALTER} kannst du dabei dann dynamisch einsetzen. So brauchst du nicht 10 verschiedene Fragen für 10 verschiedene Haarfarben usw.
 
E

erli2909

Fortgeschrittenes Mitglied
Guter Ansatz, ich denke damit werd ich mal beginnen uns schauen inwiefern es zu Problemen kommt.

Trotzdem ist da immer noch die Sache mit den möglichen 50%, da man sonst nicht sehr schnell weiter kommt.

Denn sehen wir uns diesen Fall an:
1000 Leute, 20% blond, 20% sind über 20 Jahre alt

Nein - noch 800 Leute

Ja - Immer noch 640Leute.

Knapp 2/3 mögliche Leute nach bereits 2 Fragen ist recht viel..

Ich denke daher an eine Möglichkeit erst einmal abfragen, ob die Frage überhaupt Sinn macht zu stellen..
 
A

amfa

Experte
Ich glaube "offline" wird das nicht so gut funktionieren.
Akinator lebt von den unzähligen hinzugefügten Figuren/Personen und Fragen.

Ich glaube wenn du das offline machst wird es zu oft vorkommen, dass jemand eine Person im kopf hat.

Die Datenbank müsste halt sehr groß werden und wenn du die Daten selbst anlegen willst.
Da bist du vermutlich 2 Tage mit der Programmierung und 3 Monate mit Datenbank zusammenstellen beschäftigt ;)

Bei Akinator können die User wie gesagt eigene personen und Fragen zu vorhanden Personen hinzufügen. Damit erweitert sich die Datenbank von denen vermutlich immens, das lässt sich alleine gar nicht bewerkstelligen.
 
StefMa

StefMa

Experte
Zumal du mit diesem Ansatz auch nicht antworten kannst wie:
"Die gesuchte Person ist deine Freundin"
oder
"Die gesuchte Person ist deine Katze"

Gruß
 
E

erli2909

Fortgeschrittenes Mitglied
Es wird in meiner App nicht um Personen gehen, auch eine Ähnlichkeit zum Akinator wird es nicht geben.

Aber eben eine Ähnlichkeit des Algorithmus um auf eine Antwort zu kommen.

amfa schrieb:
Ich glaube wenn du das offline machst wird es zu oft vorkommen, dass jemand eine Person im kopf hat.
In meiner Version wird der Benutzer keinen Einfluss auf das Ergebnis haben..
Zumindest Anfangs nicht.

Ich stelle mir das auch so vor, dass die Datenbank zwar offline gespeichert ist, aber regelmäßig aktualisiert wird.