Einfügen von Daten in einen Suchbaum

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Einfügen von Daten in einen Suchbaum

    Hallo Leute,

    ich stehe vor folgendem Problem:

    Ich möchte/soll ein Akinator-ähnliches Programm basteln.
    Allerdings nicht wie der Akinator selbst, der nebenbei die Antworten auf seine Fragen googlet (soweit ich weiß), sondern einen Akinator, der eine gewisse "Datenbank" besitzt, aus der er anhand der Antworten auf seine Fragen die richtige "Person" findet.
    Ich dachte, das ließe sich mit einem binären Suchbaum lösen und habe begonnen zu programmieren. :D

    Jetzt bin ich an dem Punkt angelangt, dass das Programm (hoffe ich zumindest...) laufen könnte, aber die Datenbank noch fehlt, die ich einfach manuell per Form1.load - Sub einfügen möchte, damit ich nicht immer die dazugehörige Textdatei laden muss..

    Meine Sub zum Einfügen in der Klasse "Akinatorbaum.vb*" sieht wie folgt aus:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub fügeein(ByRef neuerinhalt As String, links As Boolean)
    2. If links = True Then
    3. If Me.linkeskind Is Nothing Then
    4. Me.linkeskind = New Akinatorbaum(neuerinhalt)
    5. Else
    6. fügeein(neuerinhalt, links)
    7. End If
    8. Else
    9. If Me.rechteskind Is Nothing Then
    10. Me.rechteskind = New Akinatorbaum(neuerinhalt)
    11. Else
    12. fügeein(neuerinhalt, links)
    13. End If
    14. End If
    15. End Sub


    Wenn der User eine Frage mit "Ja" beantwortet, wird links auf TRUE gesetzt und der Sucher schließt somit also den rechten Teilbaum aus und begrenzt sich auf den linken Teilbaum. Wird halt "Nein" geantwortet, wird links auf FALSE gesetzt und und und...

    Achso, vielleicht ist es wichtig zu wissen, dass die Fragen von vornherein festgelegt sind und parallel zum Suchbaum verlaufen, also nicht abhängig von diesem sind. Sie dienen also praktisch nur zur "Fallunterscheidung" und zum Finden des richtigen "Falls".
    -> Skizze davon im Anhang!



    MEINE FRAGE:
    Wenn ich jetzt in Antwort 1 (siehe Skizze) "Mr. X" als Inhalt einfüge, dann zeigt der Zeiger doch theoretisch mit "Me" auf Antwort 1, oder?
    Wie könnte ich es schaffen, in Antwort 4 (siehe Skizze) "Mrs. Y" einzufügen?



    Ich brauche eine relativ schnelle Antwort.. :D
    Danke also schonmal dafür!! :)
    Bilder
    • akinator.JPG

      27,63 kB, 570×250, 201 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „willeilll“ ()

    VB.NET-Quellcode

    1. Public Sub fügeein(ByRef neuerinhalt As String, links As Boolean)
    2. If links = True Then
    3. If Me.linkeskind Is Nothing Then
    4. Me.linkeskind = New Akinatorbaum(neuerinhalt)
    5. Else
    6. linkeskind.fügeein(neuerinhalt, links)
    7. End If
    8. Else
    9. If Me.rechteskind Is Nothing Then
    10. Me.rechteskind = New Akinatorbaum(neuerinhalt)
    11. Else
    12. rechteskind.fügeein(neuerinhalt, links)
    13. End If
    14. End If
    15. End Sub
    danke, ich probiers mal aus. :)

    //EDIT: Scheint zu funzen, stürzt zumindest nicht mehr ab! :)

    Meine Frage, wie ich nun diesen "Baum" implementieren könnte bleibt trotzdem.. :/

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „willeilll“ ()

    Ich glaube der Ansatz ist falsch.
    Du musst eher in die andere Richtung denken. Du hast ein Tupel mit Menschen, z.B. 100 Menschen mit verschiedenen Attributen.

    In Schritt 1 kannst du alle weiblichen ausgrenzen -> Rest Tupel 60 Menschen.
    In Schritt 2 grenzt du alle aus die dunkle Haare haben -> Rest Tupel 25
    usw.
    Also mich irritiert an deim Bildle, dass die Fragen nicht im Baum sind.

    IN meiner Welt wären die Fragen im Baum, und die beiden Unterknoten würden die beiden möglichkeiten der Antwort repräsentieren.
    Auf der untersten Ebene hätte man dann auch Fragen, aber ohne Unterknoten.
    Diese müsste man dann als letzte Antwort auffassen.

    Also überarbeite erstmal dein Bild - dann ändert sich auch dein Bild im Kopf, und dann findest du glaub auch eher eine Lösung:
    Also links die 3 Fragen kommen weg, und alle Antwort-Kästle, die Unterknoten haben, da musst du "Frage" reinschreiben.
    Bereits richtig gemacht scheinen mir die Ja/Nein - Kringeln, die die Verbindungen zwischen den Fragen beschriften.

    Aber vlt. verstehe ich den Akinator auch nicht richtig.
    In meinem Akinator wird einem erst die Root-Frage vorgelegt, und je nachdem was man antwortet, gelangt man zu unterschiedlichen Folge-Fragen. Habe ich Akinator richtig verstanden, oder geht das iwie anders?
    Nein, du hast den akinator richtig verstanden, ich soll/will ja aber auch nur eine "abgespeckte" version erstellen, da ich noch nicht ganz so viel erfahrung habe..

    Problem:
    Wenn ich statt die Antworten nun die Fragen da reinschreibe, wo sind dann die Antworten?
    Meine Idee war ja eben, das Ganze ähnlich einem Stammbaum (den wir bereits implementiert haben, der mir aber nicht viel hilft...) aufzubauen, wo halt "nur" der Inhalt in einem Knoten drinsteht.

    bei einem 5-stufigen Baum würde es also letztendlich 32 verschiedene Pfade geben (2^5 = 32), ich könnte meinen Akinator also auf 32 bestimmte personen "ansetzen".
    Das ganze wird natürlich erweiterbar (fragen sowie antworten) programmiert. :D


    Meine eigentliche Frage war ja, wie ich diese 32 verschiedenen Pfade in der Sub Form1.load einfügen kann..
    Weil wenn ich einmal
    akinator.fügeein("inhalt", True)
    gemacht habe, kann ich ja leider nicht mehr den rechten Teilbaum bearbeiten... wie resete ich also praktisch den zeiger auf die jeweiligen knoten?

    willeilll schrieb:

    Meine eigentliche Frage war...
    Was nützt die "eigentliche Frage", wenn sie auf einem Konzept aufbaut, was nicht aufgeht?

    Also müssen wir beim Konzept bleiben, und hier zu deiner Frage:

    willeilll schrieb:

    wo sind dann die Antworten?
    Die sind nicht im Akinator, sondern die gibt doch der User.
    Und es gibt doch nur 2 Antworten: Ja/Nein - was willst du da groß in' Akinator einspeichern? Die beiden Unterknoten repräsentieren doch ja und nein - das ist ja nix zum Speichern, sondern jeder AkinatorNode hat doch per se 2 Unterknoten, und kann daher auf Ja/Nein spezifisch reagieren.

    bring das Bild in Ordnung (poste am besten die korrigierte Fassung), und verstehe das Konzept - dann kann man Fragen zur Umsetzung angehen.
    Der Akinator funktioniert aber nicht mit einem Binären Baum, denn der würde widerrum andere Fragen ausschließen.

    Der Akinator hat 5 Antwortmöglichkeiten
    - Ja
    - Nein
    - Eher Ja
    - Eher Nein
    - Weiß nicht

    Anahand deiner Antwort werden ganz einfach die Personen eingegrenzt auf die die Antwortkriterien zutreffen. Da kann ein Suchbaum eigentlich gar nicht funktionieren, bitte korrigiert mich sofern ich falsch liege....
    In seiner abgespeckten Version könnte das funktionieren. Wie ErfinderDesRades schon gesagt hat müsste man das so oder so ähnlich angehen, wenn man davon ausgeht, dass es in seiner Version nur die Antwortmöglichkeiten Ja/Nein gibt.

    Man definiert sich einen Baum so, dass er eine Frage und zwei Kinder (Baum oder Blatt) speichern kann. Ein Blatt kann eine Person, aber keine Kinder speichern.
    Um eine passende Person zu finden, stellt man die Frage, die im aktuellen Baum gespeichert ist und wechselt je nach Antwort (Ja/Nein) in einen der Kinderbäume. Kommt man an ein Blatt kann man die gefundene Person ausgeben.
    genau, danke @ponmalka!

    Der Baum mit seinen Inhalten ist nun eingefügt - mittels Schlüsseln, die ich den einzelnen knoten auf dem Papier zugeordnet habe.
    Muss ich dann mal schauen, wie das dann mit dem generieren von neuen Schlüsseln beim hinzufügen einer Person funktionieren wird. hab immer so um die 50 freigelassen, also könnten noch so 3-4 Ebenen hinzugefügt werden, was für die abgespeckte version reichen sollte. :)

    Danke für eure Hilfen und Anworten! :)