Probleme mit A* Pfadfindung



  • Thorbenn schrieb:

    Wüsste ich wo mein Fehler liegt würde ich auch hier nicht posten, denn dann würde das ganze Teil funktionieren und ich bräuchte keine Hilfe!

    Das ist klar. Es geht aber darum, dass du dich mehr bemühen könntest, den Fehler zu suchen, oder zumindest eine bessere Problemstellung lieferst. Siehe auch hier.

    Thorbenn schrieb:

    Ja ich bin mit dem Debugger drüber und habe mir anzeigen lassen was in den variablen drin steht wenn er die einzelnen Schritte abarbeitet.

    Und was ist dabei herausgekommen? Hast du auch überprüft, ob die angezeigten Werte den erwarteten entsprechen, und wo der Fehler auftritt?

    Ansonsten hilft bei grössen Programmen, Schritt für Schritt zu implementieren. Bei mehreren hundert Zeilen auf einmal musst du dich über Fehler nicht wundern...



  • nur mal so um eine deiner fragen zu beantworten:

    //print path 
    for(int t=0;t<path.closedList.size();t++) 
    { 
        temp[path.closedList[t].x][path.closedList[t].y] = '#'; 
    }
    

    glaube irgendwie nicht, das du den code selbst geschrieben hast, sonst wüsstest du, warum der tiles "hinzufüt"^^
    hab ich btw mit nem einfachen strg+f gefunden...



  • anti-freak schrieb:

    nur mal so um eine deiner fragen zu beantworten:

    //print path 
    for(int t=0;t<path.closedList.size();t++) 
    { 
        temp[path.closedList[t].x][path.closedList[t].y] = '#'; 
    }
    

    glaube irgendwie nicht, das du den code selbst geschrieben hast, sonst wüsstest du, warum der tiles "hinzufüt"^^
    hab ich btw mit nem einfachen strg+f gefunden...

    Genau super Analyse 👍 .Hätte ich den Code woher kopiert hätte ich darauf geachtet einen funktionierenden zu nehmen von den tausenden im Netz und dann hätte ich hier nicht gepostet -.-

    Sogar wenn ich vom Finish Point ausgehe und mich von Parent zu Parent zurück an den Start hangele kommt die kürzeste Route nicht bei raus. Ich vermute das da noch etwas falsch ist!
    Vorher hatte ich es nämlich so implementiert

    Skym0sh0 schrieb:

    Dass manche Leute einfach keien Ahnung haben wie man Debugt und Fehler findet.
    Lieber mal wen ansprechen und sagen, dass es nicht geht...

    Ich möchte mich auch herzlichst dafür entschuldigen das ich kein Meister bin und was programmieren/debuggen angeht ein Anfänger bin!
    Vielen Dank dein Post hat mir wirklich geholfen!

    Ganz ehrlich ein bisschen Freundlichkeit würde manchmal nicht schaden! Wenn man nichts zum Thread beitragen kann und helfen möchte dann lasst es mit dem posten einfach sein.

    Ich probiere mich zu bemühen und meinen Code zum laufen zu bringen und hatte gehofft wenn einer schnell drüber schaut er vielleicht den Fehler sieht den ich nicht sehe. Gibt ja manchmal solche Momente wo man solange auf den Bildschirm starrt und den kleinsten Fehler nicht sieht!
    Ich wurde aber hier schon des besseren belehrt...

    Viele Grüße und schönen Sonntag!



  • Ich glaube deine Heuristik ( = Schritt 2 berechne f-Kosten) ist falsch.
    Ist dafür PathFinding::getgScore zuständig? Sieht nicht richtig aus. Sag mal wie und wo die Kosten berechnet werden.



  • Thorbenn schrieb:

    Ganz ehrlich ein bisschen Freundlichkeit würde manchmal nicht schaden! Wenn man nichts zum Thread beitragen kann und helfen möchte dann lasst es mit dem posten einfach sein.

    Dann bleibt der Thread heeir aber aller wahrschinlichkeit leer. Keiner schaut sich so viel Code genau an. 0 Informationen gar nichts. Genau dann ist ein "nutz den Debugger" angebracht. Aber darauf kommt ein "hab ich schon" - sicheres zeichen, dass du nicht ordentlich debuggt hast und dir nicht einmal genau angeschaut hast, ob der Algorithmus in jedem Schritt die richtigen Werte berechnet(sonst hättest du ja eine konkrete Idee, was falsch ist).

    Warum sollen wir unsere(!) Zeit in deinen(!) Code stecken, wenn du es nicht einmal selbst tust? Wir haben mehr als genug eigenen Code, den wir gerne zum laufen bringen wollen.

    Also, hier ein paar Allgemeinplätze:
    1. schaue ob deine Heuristik stimmt
    2. teste die Invarianten des Algorithmus in jeder Iteration
    3. erzeuge verschiedene kleine Testfälle, rechne sie von Hand durch und Vergleiche mit deinem Algorithmus.
    4. kreise den Fehler auf wenige Codezeilen ein
    5. Wenn dann noch Bedarf an Hilfe -> fragen.



  • nwp3 schrieb:

    Ich glaube deine Heuristik ( = Schritt 2 berechne f-Kosten) ist falsch.
    Ist dafür PathFinding::getgScore zuständig? Sieht nicht richtig aus. Sag mal wie und wo die Kosten berechnet werden.

    Die Heuristik berechne ich so:
    nCheck ist die Koordinate die ich gerade anschaue

    abs(finish.x-nCheck.x) + abs(finish.y-nCheck.y)

    Die Funtkion getgScore holt sich die Wertigkeit des Tiles an der gegebenen Stelle.
    Ich möchte nämlich einen Unterschied haben für die Kosten um den Tile zu erreichen jenachdem ob an der Stelle ein Leerzeichen im 2dArray ist was als belaufbar gilt und somit leicht zu erreichen gilt. Falls an der Stelle schon ein Stück Pfad wäre dann würden die Kosten um den Punkt zu erreichen höher sein. Bei einer Wand ist der Wert viel höher das dieser nicht in Betracht kommt.

    Folglich ist f dann daraus die Heuristik + der Gscore.

    Immerhin eine nette Person hier nwp3 danke!

    otze schrieb:

    Warum sollen wir unsere(!) Zeit in deinen(!) Code stecken, wenn du es nicht einmal selbst tust? Wir haben mehr als genug eigenen Code, den wir gerne zum laufen bringen wollen.

    Wenn du keine Zeit hast hör auf hier zu schreiben und geh an die Arbeit die du zu erledigen hast!
    Dann lasst den Thread leer mein gott! Das wäre mir lieber als andauerd sowas zu lesen!
    Ich stecke meine Zeit schon in meinen Code aber wenn ich meinen verdammten Fehler nicht finde dann komme ich nicht weiter. Du würdest dann doch auch wollen das dir jemand hilft indem er über deinen Code drüber schaut oder nicht?



  • Thorbenn schrieb:

    Skym0sh0 schrieb:

    Dass manche Leute einfach keien Ahnung haben wie man Debugt und Fehler findet.
    Lieber mal wen ansprechen und sagen, dass es nicht geht...

    Ich möchte mich auch herzlichst dafür entschuldigen das ich kein Meister bin und was programmieren/debuggen angeht ein Anfänger bin!
    Vielen Dank dein Post hat mir wirklich geholfen!

    Ganz ehrlich ein bisschen Freundlichkeit würde manchmal nicht schaden! Wenn man nichts zum Thread beitragen kann und helfen möchte dann lasst es mit dem posten einfach sein.

    Ich probiere mich zu bemühen und meinen Code zum laufen zu bringen und hatte gehofft wenn einer schnell drüber schaut er vielleicht den Fehler sieht den ich nicht sehe. Gibt ja manchmal solche Momente wo man solange auf den Bildschirm starrt und den kleinsten Fehler nicht sieht!
    Ich wurde aber hier schon des besseren belehrt...

    Du gehst da (wie leider sehr viele andere auch) falsch an das Problem dran.
    Viele denken, sie müssten 100%igen Code einfach so runterschreiben können, das muss aber nicht so sein.

    Viel ist nachdenken, probieren, abändern und anpassen.
    Selbst wenn ich hier (wie auch viele andere) kurz was ohne Compilerprüfung als Beispiel posten, wimmelt das meistens von vielen kleinen Fehlern.

    Will man das compilen, wird man eines Besseren belehrt und verbessert den Code.

    Danach kommt die logische Fehlerfindung, wie bei dir hier.
    Es gibt beliebig viele Algorithmen in allen Komplexitätsklassen, man kann nicht alle kennen, aber man kann sie trotzdem schrieben und auch Fehler finden. Nur dauert das, und wieso sollen wir für diene Arbeit den Fehler finden in deinem gesamten Code?

    Stell dir mal folgendes Szenario vor:
    Du schreibst deinen Algorithmus so runter. Dann lässt du ihn laufen und merkst: "Hä? das ist doch falsch!" Was hast du dann gemacht?
    Richtig, du hast Code geschrieben der etwas macht, offensichtlich macht er aber nicht das, was du willst. Ok, hier liegt irgendwo ein Fehler den es zu finden gilt.
    Das kann zum einen daran liegen, dass du vielleicht ein Variable mit einer anderen vertauscht hast oder dich irgendwo (syntaktisch korrekt) vertippt hast.
    Es wird in den meisten Fällen aber eher so sein, dass der Fehler nicht so simpel zu finden ist.

    Dann geht man normalerweise so vor:
    Du lokalisierst deinen Fehler grob (mann kann ja ungefähr abschätzen oder sehen, ob wo ein Fehler entstehen kann und das auf einige Zeilen eingrenzen, und wenn nicht, fängt man vorne an). Dann setzt du an diese Stelle in deiner Entwicklungsumgebung einen Debug-Breakpoint und startest dein Programm.
    Ab hier gehst du deinen Quellcode schritt für Schritt (Zeile für Zeile also) On-The-Fly durch, heisst, dein Programm wird sequenziell so schnell ausgeführt wie du es willst.
    In jeden Schritt kannst du sämtliche Variablen anschauen und siehst deren Inhalt.

    Und genau das ist der Punkt, du erwartest, dass deine Variable irgendeinen bestimmten Wert annimmt, wenn sie das tut ist alles ok, wenn nicht hast du den/einen Fehler, den du korrigieren kannst/musst.

    Aber woher weisst du, welcher Wert in der Variablen stehen musst?
    Tja, das muss man auf dem Papier (oder im Kopf) nachrechnen oder nachvollziehen.

    Deswegen testet man anfangs auch mit kleinen nachvollziehbaren Beispielen.

    Und wenn du dann immer noch nicht weisst, warum irgendwas nicht läuft (du hast ja mittlerweile den Fehler auf sagen wir 10-20 Zeilen eingrenzen können), dann kannst du in so ein Forum wie das hier kommen, diese 10-20 Zeilen posten, sagen was rein kommt und was du eigentlich erwartest.

    Und dann kommen wir an und sagen dir deinen Fehler (oder fragen genauer nach).
    Wenn das aber mal z.B. nicht reicht mit den 10-20 Zeilen, dann poste ruhig den gesamten Code und sag: "Hier in Zeile x-y passiert nicht, das was ich erwarte"

    Wir wollen dir nichts böses, aber wir wollen Interesse und Eigeninitiative.
    Hier kommen täglich so viele Leute an, die wollen das wir ihre (simplen) Aufgaben lösen für ihre Schule/Ausbildung oder Prüfung, da wird Misstrauen quasi gesät.



  • Wir wollen dir nichts böses, aber wir wollen Interesse und Eigeninitiative.
    Hier kommen täglich so viele Leute an, die wollen das wir ihre (simplen) Aufgaben lösen für ihre Schule/Ausbildung oder Prüfung, da wird Misstrauen quasi gesät.

    Das weiss ich, aber die Leute die Anfangen fresch zu werden sollen dann einfach den Post ignorieren als darauf zu kommentieren! Ganz einfach, aber nein sie müssen ihre 2 Cent dazugeben nur um irgendwas an dem Tag produktives gemacht zu haben.
    Aber genug davon

    Habs nämlich nun hinbekommen 🙂

    Hatte noch einiges an Fehlern drin und habe sie alle beseitigen können.

    Gruß



  • Well done.



  • Was manchmal eine nicht aktualisierte Coordinate beim rückverfolgen der Route alles machen kann ^^


Anmelden zum Antworten