performance frage



  • Ich verstehe das so, dass er eine Punktwolke hat, dessen Punkte quasi Abtastpunkte von realen Wegen darstellen. (Z.B. Auto fährt durch Stadt; Jede 5 Sekunden wird mittels GPS Position gemessen und in Punktwolke gespeichert.)

    Ausgehend von dieser Wolke will er
    1. die Wege rekonstruieren und
    2. einen kürzesten Pfad (über die rekonstruierten Wege) von einem Startpunkt zu einem Zielpunkt finden.

    Für 1. könnte man z.B. sagen, dass eine Kante zwischen zwei Knoten (Punkten) besteht, wenn der Abstand <= threshold ist. Anschließend lässt man für 2. z.B. A* auf den so konstruierten Graphen los.



  • kantaki schrieb:

    ...
    http://imageshack.us/f/607/nav1.jpg/
    ...
    ich will:
    -mich auf den Wegpunkten bewegen und diese nicht verlassen.
    -keine Wegpunkte überspringen.
    ...

    Das, was Du damit meinst, ist nicht klar.

    Wenn ich mir zwei Punkte, P und Q, aus Deinem Bild raussuchte und Dich frägte, ob es einen direkten Weg von P nach Q gibt, der über keine weiteren Punkte ginge und wo man auch keine Punkte "überspringen" müsste, was würdest Du dann tun, um diese Frage zu beantworten?

    life schrieb:

    [...] könnte man z.B. sagen, dass eine Kante zwischen zwei Knoten (Punkten) besteht, wenn der Abstand <= threshold ist.

    Ja, das könnte man so machen. Das ist eine mögliche Antwort auf meine Frage von oben. Aus dem, was kantaki bisher geschrieben hat, geht das nicht hervor.



  • Dein menschliches Gehirn kann die Punkte natürlich zu Wegen zusammenfügen - strikte Logik nicht!
    Mein Hirn sagt mir z.B., dass Ziel B von zwei Wegen angesteuert wird, deshalb weiß ich, dass die Punkte, die nach links oben weglaufen, ein Weg sind, genau so die, die nach links unten weglaufen. Deine Programmlogik sieht das nicht! Würde sie vom oberen Weg Ziel B ansteuern wollen, würde sie vllt. bei ungünstiger Platzierung der Punkte vom zweiten von oben auf den zweiten von unter lenken statt auf den ersten von oben.

    Bei einer Wegsuche von Kreuzung links nach Kreuzung rechts würde vllt. der untere Weg gewählt werden, da die Logik Ziel B auslässt und direkt überspringt. Das ist ja ein Berg, evtl hat der Weg, der Zeil B von unten ansteuert, ein Gefälle? Dann liegen die Punkte weit auseinander. Danach fährst du von Ziel B zur rechten Kreuzung auf einem Steilanstieg (die Kurve spricht dafür) Dann liegen a) die Punkte unten weit auseinander b) die Punkte oben eng zusammen und c) die beiden Wege die nach Ziel B führen eng beieinander - deine Logik wird dich hier den Steilhang irgendwo vor Ziel B nach oben schicken! Jippie!



  • Häh? Nonsensaussage, du kannst keine Strecke aus endlich vielen Punkten zusammenbauen. Was meinst du wirklich?

    Warum nicht ? ich gehe aus dem Haus und fahre zu einer Hütte, während der fahrt nehme ich alle 10m einen Wegpunkt auf.
    Wenn ich wieder zu dieser Hütte möchte geben ich einfach die Koordinaten zu dieser Hütte ein ( Ziel A).

    Häh? Nonsensaussage. Wie ordnest du Punkte auf einer Fläche? Wie definierst du überspringen? Was meinst du wirklich?
    

    Die Wegpunkte liegen natürlich auf einem Weg und auf diesem Weg möchte ich mich bewegen. Also macht es doch sinn das ich mich von wegpunkt zu wegpunkt bewege oder?

    Häh? Diese beiden Bedingungen sind im Allgemeinen vollkommen inkompatibel. Was meinst du wirklich?

    ZB

    1. ...die kürzeste Entfernung zu meiner momentanen Position hat.

    ich habe die Koordinate von meiner momentanen position zb 1,1,1 jetzt vergleiche ich diese koodinate mit allen von mir aufgezeichneten Koordinaten.
    Beispiel WP_POSITION = 1,1,1 wp_X=2,2,2 ( differenz ist 1,1,1)
    mit der formel sqrt(12+12+1^2) bekomme ich die entfernung heraus.

    Jetzt weiß ich das die kleinste Entfernung der nächstliegende Wegpunkt ist.
    Die 10 nächstliegenden Wegpunkte speichere ich in einem Vector zu.

    2. ...die geringste Entfernung zum Ziel hat.

    Nun greife ich auf den Vector mit den 10 nächstliegenden Wegpunkten.

    jetzt mache ich das selbe wie bei 1. nur vergleiche ich die gespeicherten Wegpunkte mit der endkoordinate
    Beispiel:
    WP_X = 2,2,2 wp_END=10,10,10

    Nun kann ich entscheiden welchen der 10 Wegpunkte ich benutzen möchte.
    Nämlich den Wegpunkt der:
    am nächsten liegt und die kürzeste entfernung zum Ziel besitzt.

    Das mache ich solange bis WP_POSITION == WP_END


  • Mod

    Sabrina S. schrieb:

    Dein menschliches Gehirn kann die Punkte natürlich zu Wegen zusammenfügen - strikte Logik nicht!

    Was du kannst, kann ein Computer auch. In vielen Fällen, wie diesem auch, ist das sogar erschreckend einfach zu programmieren. Man darf halt nicht den Fehler machen, die Regeln zu einfach zu formulieren.

    kantaki schrieb:

    Häh? Nonsensaussage, du kannst keine Strecke aus endlich vielen Punkten zusammenbauen. Was meinst du wirklich?

    Warum nicht ? ich gehe aus dem Haus und fahre zu einer Hütte, während der fahrt nehme ich alle 10m einen Wegpunkt auf.

    Und wo warst du zwischen den beiden Punkten? Teleportiert?

    Häh? Nonsensaussage. Wie ordnest du Punkte auf einer Fläche? Wie definierst du überspringen? Was meinst du wirklich?
    

    Die Wegpunkte liegen natürlich auf einem Weg und auf diesem Weg möchte ich mich bewegen. Also macht es doch sinn das ich mich von wegpunkt zu wegpunkt bewege oder?

    Und dieser Weg wäre? Wenn du den Weg hast, dann überspringst du von ganz alleine keine Punkte auf diesem Weg, weil sie auf einem Weg liegen. Wenn du keinen Weg hast, bringt dir die Bedingung, dass du keine Punkte überspringen möchtest, überhaupt nichts was den Weg einschränkt. Daher: Nonsens.

    Häh? Diese beiden Bedingungen sind im Allgemeinen vollkommen inkompatibel. Was meinst du wirklich?

    ZB

    1. ...die kürzeste Entfernung zu meiner momentanen Position hat.

    ich habe die Koordinate von meiner momentanen position zb 1,1,1 jetzt vergleiche ich diese koodinate mit allen von mir aufgezeichneten Koordinaten.
    Beispiel WP_POSITION = 1,1,1 wp_X=2,2,2 ( differenz ist 1,1,1)
    mit der formel sqrt(12+12+1^2) bekomme ich die entfernung heraus.

    Jetzt weiß ich das die kleinste Entfernung der nächstliegende Wegpunkt ist.
    Die 10 nächstliegenden Wegpunkte speichere ich in einem Vector zu.

    Ach, nun sind es auf einmal nicht mehr nur einer, sondern 10. Das beantwortet schon einmal vieles von der Frage "Was meinst du wirklich?". Es wirft aber neue Fragen auf: Warum 10? Und was ist, wenn 11 Punkte auf einem Kreis liegen?

    2. ...die geringste Entfernung zum Ziel hat.

    Nun greife ich auf den Vector mit den 10 nächstliegenden Wegpunkten.

    jetzt mache ich das selbe wie bei 1. nur vergleiche ich die gespeicherten Wegpunkte mit der endkoordinate
    Beispiel:
    WP_X = 2,2,2 wp_END=10,10,10

    Nun kann ich entscheiden welchen der 10 Wegpunkte ich benutzen möchte.
    Nämlich den Wegpunkt der:
    am nächsten liegt und die kürzeste entfernung zum Ziel besitzt.

    Ach, nun ist es nicht mehr der Punkt am nächsten beim Ziel, sondern der Punkt aus deiner vorher gewählten Menge, der am nächsten beim Ziel ist. Siehst du, wie viel klarer man sich ausdrücken kann?
    Und es wirft nun die Frage auf: Was, wenn du in einen Berg oder in eine Sackgasse rennst?



  • Was, wenn du in einen Berg oder in eine Sackgasse rennst?

    kann ja garnicht passieren.
    da ich
    1. nicht mit dem fahrrad über den berg fahren kann, also sind auf dem berg keine wegpunkte.
    2. und eine sackgasse wird es auch nicht geben, wie gesagt ich nehme wege auf auf denen ich mich bewege, da wird keine sackgasse sein.

    ann liegen a) die Punkte unten weit auseinander b) die Punkte oben eng zusammen und c) die beiden Wege die nach Ziel B führen eng beieinander - deine Logik wird dich hier den Steilhang irgendwo vor Ziel B nach oben schicken! Jippie!

    Das kann garnicht passieren. völlig unmöglich. warum ? ich nehme wegpunkte zb alle 10 m auf warum sollte sich der abstand vergrößern wenn ich berg auf oder ab gehe?
    meine formel beinhaltet x y und Z.



  • kantaki schrieb:

    Das kann garnicht passieren. völlig unmöglich. warum ? ich nehme wegpunkte zb alle 10 m auf warum sollte sich der abstand vergrößern wenn ich berg auf oder ab gehe?
    meine formel beinhaltet x y und Z.

    Die 10m kamen erst nach meinem Post, vorher hieß es nur "ich fahre Rad, dabei werden Punkte aufgezeichnet". Ich ging von einer Timergesteuerten Aufzeichnung aus (ist mMn. leichter), dabei liegen die Punkte bei schnellerer Fahrt weiter auseinander als Punkte bei langsamerer Fahrt.
    Und wenn du weißt, dass du exakt alle 10m einen Messpunkt hast, warum vergleichst du mit allen Punkten?
    Und was ist, wenn du 10m vor einer exakten 60°-Kehre bist? Dann ist von dir aus die Kurve und der nächste Messpunkt nach der Kurve exakt 10m weit weg. Die Logik weiß ja nicht, ob der übersprungene Kurvenpunkt jetzt zum Weg gehört - es ist ja ein anderer Punkt ebenfalls 10m weit weg, und der Weg zum Ziel wird dadurch kürzer.

    Langer Rede kurzer Sinn: Bevor du deine Wege ausgeben kannst, musst du festlegen, welche Punkte man tatsächlich zu einem Weg verbinden kann. In einer Punktwolke können alle möglichen Punkte einen möglichen Weg bilden. Das wollen wir dir seit >3 Seiten sagen.



  • So langsam wird es ja etwas klarer was Du da machst (verstehe nicht wieso Du nicht von Anfang an sagst was Du machst. Wie soll man das mit diesem Bild http://img638.imageshack.us/img638/5426/appwb.jpg erraten. Hellsehen kann hier keiner).
    Ich denke Hauptaufgabe ist für Dich aus deinen Punkten Straßen zu bilden. Das ist an vielen Stellen einfach, etwas kniffeliger wird es an Knicken und Kreuzungen. Wenn Du das hast, hast Du Kreuzungen=Knoten und Straßen=Kanten und bewegst dich dann auf bekanntem Gebiet der Graphen. Den Graphen kannst du dann abspeichern und musst nicht jedes mal von vorne deine Straßen suchen.



  • Sabrina S. schrieb:

    kantaki schrieb:

    Das kann garnicht passieren. völlig unmöglich. warum ? ich nehme wegpunkte zb alle 10 m auf warum sollte sich der abstand vergrößern wenn ich berg auf oder ab gehe?
    meine formel beinhaltet x y und Z.

    Die 10m kamen erst nach meinem Post, vorher hieß es nur "ich fahre Rad, dabei werden Punkte aufgezeichnet". Ich ging von einer Timergesteuerten Aufzeichnung aus (ist mMn. leichter), dabei liegen die Punkte bei schnellerer Fahrt weiter auseinander als Punkte bei langsamerer Fahrt.
    Und wenn du weißt, dass du exakt alle 10m einen Messpunkt hast, warum vergleichst du mit allen Punkten?
    Und was ist, wenn du 10m vor einer exakten 60°-Kehre bist? Dann ist von dir aus die Kurve und der nächste Messpunkt nach der Kurve exakt 10m weit weg. Die Logik weiß ja nicht, ob der übersprungene Kurvenpunkt jetzt zum Weg gehört - es ist ja ein anderer Punkt ebenfalls 10m weit weg, und der Weg zum Ziel wird dadurch kürzer.

    Langer Rede kurzer Sinn: Bevor du deine Wege ausgeben kannst, musst du festlegen, welche Punkte man tatsächlich zu einem Weg verbinden kann. In einer Punktwolke können alle möglichen Punkte einen möglichen Weg bilden. Das wollen wir dir seit >3 Seiten sagen.

    das mache ich weil wenn ich auf einer kreuzung stehe muss ich zb zwichen 4-5 wegpunkten entscheiden. dabei kann natürlich der abstand varieren.

    in einer Punktwolke können alle möglichen Punkte einen möglichen Weg bilden. Das wollen wir dir seit >3 Seiten sagen.

    deswegen habe ich auch gefragt ob es eine alternative zum vector gibt, da ich beim vector jeden einzelnen wert erstmal ausgeben muss, und da ich ziemlich viele vergleiche anstellen muss, dauert es natürlich auch länger.
    eine distanz von ca 50km dauert 4-5sec mit meiner berechnung.
    es wäre natürlich ein vorteil wenn ich im vorhinein wüsste welche wegpunkte überhaupt in frage kommen, aber daran hänge ich noch 😕

    So langsam wird es ja etwas klarer was Du da machst (verstehe nicht wieso Du nicht von Anfang an sagst was Du machst. Wie soll man das mit diesem Bild http://img638.imageshack.us/img638/5426/appwb.jpg erraten. Hellsehen kann hier keiner).
    Ich denke Hauptaufgabe ist für Dich aus deinen Punkten Straßen zu bilden. Das ist an vielen Stellen einfach, etwas kniffeliger wird es an Knicken und Kreuzungen. Wenn Du das hast, hast Du Kreuzungen=Knoten und Straßen=Kanten und bewegst dich dann auf bekanntem Gebiet der Graphen. Den Graphen kannst du dann abspeichern und musst nicht jedes mal von vorne deine Straßen suchen.

    genau so mache ich das ich lasse die wegpunkte die ich nehmen soll im vorhinein berechnen, speichere die in eine .ini datei und kann diese dann einfach auf eine karte einzeichnen.



  • kantaki schrieb:

    genau so mache ich das ich lasse die wegpunkte die ich nehmen soll im vorhinein berechnen, speichere die in eine .ini datei und kann diese dann einfach auf eine karte einzeichnen.

    Nein, Du machst mit Sicherheit nicht das was da steht. Hast Du überhaupt gelesen was da steht? Der Vorschlag war deine Wegpunkte in einen Graphen mit Knoten und Kanten zu überführen, diesen zu speichern und deine blöden Wegpunkte wegzuschmeißen. Dein Programm arbeitet dann mit dem Graphen und nicht mehr mit Punkten. Der Graph wird dann nur aktualisiert, wenn Du neue Punkte aufgenommen hast.



  • brotbernd schrieb:

    kantaki schrieb:

    genau so mache ich das ich lasse die wegpunkte die ich nehmen soll im vorhinein berechnen, speichere die in eine .ini datei und kann diese dann einfach auf eine karte einzeichnen.

    Nein, Du machst mit Sicherheit nicht das was da steht. Hast Du überhaupt gelesen was da steht? Der Vorschlag war deine Wegpunkte in einen Graphen mit Knoten und Kanten zu überführen, diesen zu speichern und deine blöden Wegpunkte wegzuschmeißen. Dein Programm arbeitet dann mit dem Graphen und nicht mehr mit Punkten. Der Graph wird dann nur aktualisiert, wenn Du neue Punkte aufgenommen hast.

    okay tut mir leid, hab ich wohl falsch interpretiert.

    kannst du mir erklären was ein "Graph mit Knoten und Kanten" ist?


  • Mod

    kantaki schrieb:

    kannst du mir erklären was ein "Graph mit Knoten und Kanten" ist?

    Das versucht dir hier ein jeder im Thread seit 4 Seiten zu erklären! Wie möchtest du noch jemanden motivieren, das noch einmal zu tun, wenn du bisher nur den Eindruck erweckst, dass man gegen eine Wand anschreibt.

    Das Stichwort lässt sich aber auch hervorragend googlen.



  • Um auf Dein Problem zurück zu kommen:

    (1) Bau Dir irgendwie einen Graphen.
    (2) Nimm einen altbekannten Wegsuchealgorithmus, wie z.B. den A-Stern.

    Aber: Das ist eher ein Programmier-Problem als ein Problem mit der Sprache C++.

    Zum Implementieren der Graph-Datenstruktur empfehle ich Dir std::list als Knoten-Container. Das praktische dabei ist, dass Zeiger auf Knoten solange gültig bleiben, bis der Knoten aus der Liste wieder gelöscht wird. Wird die Liste zerstört, werden auch automatisch die gespeicherten Knoten zerstört. Um böse Überraschungen mit den Zeigern zu vermeiden, kannst Du das Kopieren der Datenstruktur unterbinden. Mal ein einfaches Beispiel ohne großartige Kapselung:

    Pseudo-Code:

    struct vec3d {
      double coeffs[3];
    };
    
    struct knoten {
      vec3d position;
      vector<knoten*> direkte_nachbarn;
    };
    
    struct graph {
      list<knoten> alle_knoten;
    
      knoten* knoten_hinzufuegen(vec3d c) {
        knoten temp = {c};
        alle_knoten.push_back(temp);
        return &alle_knoten.back();
      }
    
    private:
      // Kopieren und Zuweisen ausschalten...
      graph(graph const&);            // bleibt absichtlich undefiniert
      graph& operator=(graph const&); // bleibt absichtlich undefiniert
    };
    

    oder so ähnlich.

    Wenn Du nach 4 Seiten immer noch nicht weißt, was ein Graph ist, frag nochmal in "Rund um die Programmierung" zu dem Thema. Das hat wirklich nix mit C++ zu tun.



  • Ich hab jetzt irgendwann aufgehört zu lesen, weil zwei Seiten vergeblich versucht wurde zu erklären, was das Problem an OPs Ansatz ist.

    Nur ganz kurz. Falls das hier deine Punktewolke ist (Wege sind eingezeichnet, aber die hast du ja nicht): http://www.leda-tutorial.org/de/offiziell/Pictures/DFS_NUMDemoGraphWin.png

    Dann würde dein Algo von 1|14 zu 15|18 ja als kürzesten Weg angeben, dass er über 19|19 geht. Aber wie man sieht, gibt es dort gar keine Verbindung (Fluss dazwischen).



  • okay super vielen danke

    ich weiß zwar noch nicht was struct oder list ist, aber das lässt sich ja einfach googlen.
    ich lese nur gerade primer und bin noch nicht sehr weit (s.300).
    aber ich wollte einfach mal was programmieren, und ich muss sagen obwhol es sehr unneffizient ist, bin ich trotzdem stolz das ich es geschafft habe.

    naja ich werde mich jetzt mal in das obrige programm einlesen

    vielen dank 🙂



  • Juchu, endlich Mal jemand, der zum Einstieg ein vernünftiges Buch liest. 🙂



  • okay ich habe mich in ein paar algorithmen eingelesen.
    leider muss ich feststellen das mein grundwissen doch noch sehr viele lücken aufweist 😞
    Ich werde wohl erstmal bei meiner momentanen Version bleiben.

    Allerdings lasse ich nun die string koordinaten sofort in ein struct speichern und diesen struct speichere ich in einen vector. Das hat mir einen enormen perfomance vorteil verschafft =).
    Danke schonmal dafür.

    Ein Problem habe ich leider noch und ich kann den fehler nicht finden.
    Wenn die Distanz zu groß ist werden garbage werte ausgegeben(immer der selbe wert)

    Würde vielleicht jemand über den Code drüber schauen und mir ein paar tipps geben?

    Leider ist der Code 250Zeilen groß und ich möchte ungern das forum vollspamen.
    Dafür ist er gut Kommentiert 🙂
    Also wenn sich jemand bereiterklären würde, wäre ich sehr dankbar.
    bzw wenn sich jemand findet, dann würde ich ihn auch hier posten, wenn das in ordnung wäre.



  • Kommentare sind übrigens üblicherweise ein Zeichen von schlechtem Code.



  • 314159265358979 schrieb:

    Kommentare sind übrigens üblicherweise ein Zeichen von schlechtem Code.

    weil der code kommentare braucht um verständlich zu sein ?



  • Richtig 😉


Anmelden zum Antworten