performance frage
-
Ohne ernsthaft Ahnung davon zu haben, würde ich sagen, die Aufgabe ist nicht sinnvoll, solange man keine definierten Verbindungen zwischen den Koordinaten hat. Denn so gilt:
brotbernd schrieb:
die kürzeste Distanz ist doch einfach Start mit Endpunkt verbunden
..?
-
okay beispiel

ich stehe vor einem berg. natürlich ohne tunnel....
und mein ziel liegt hinter dem berg.der kürzeste weg ist natürlich start-end aber dann würde mich mein navi direkt durch den berg leiten

so leitet mich mein navi um den berg herum, anhand meiner aufgenommenen kooridnaten.
-
Ist aber immer noch Käse. Berg ist schön, aber Bäume kennt der immer noch nicht. Was, wenn zwischen deinen Koordinaten plötzlich ein Baum wächst? Musst du dann deine Koordinaten anpassen?
Was du eigentlich willst, wäre deine Punkte in Listen zu speichern, jede Liste markiert einen Weg. Da nicht jeder Punkt mit einem Nachbarpunkt wirklich eine Teilstrecke eines Weges markiert, musst du wohl schon beim SPeichern der Daten deine Wege berücksichtigen. Eine (bessere) Alternative wäre, wenn für jeden Punkt die direkt erreichbaren Punkte (weg-Knick, Kreuzung, ...) abgespeichert würden.
-
ich möchte das als app fürs handy benutzen, da ich gerne fahrrad fahre habe ich die koordianten natürlich nur auf befahrbaren wegen aufgenommen. und falls ein baum kommt muss ich nicht unbedingt dagegen fahren

-
Du hast da wohl trotzdem einen Denkfehler. Du bewegst Dich auf Wegen, nicht von Punkt zu Punkt. Die Frage lautet "Über welche Wege ist die Strecke A nach B am kürzesten". Wenn Du einfach sagst, dass zwischen jedem Punkt ein Weg liegt der einfach die Luftlinie lang ist, dann ist der kürzeste Weg einfach der Weg von A direkt nach B, das hatten wir schon.
Der Witz am Navi ist ja, dass Du nicht nicht einfach überall bewegen kannst. Du musst also erstmal auf deiner Karte (http://img638.imageshack.us/img638/5426/appwb.jpg) noch Wege einzeichnen und deren Länge bestimmen.
-
Was Du da hast, ist ein Haufen von "Knoten" (mit Koordinaten). Wegsuchealgorithmen wollen mehr als das. Neben einem Haufen von Knoten, wollen sie auch wissen, welche Verbindungen es zwischen den Knoten gibt ("Kanten"). Das zusammen dennt man das dann "Graph".
Bei den Graphen für Routenplaner sind "Knoten" Kreuzungen (oder zumindest Punkte auf der Karte) und "Kanten" die Straßen, die die Punkte direkt verbinden.
Die Koordinaten der Knoten kann zusätzlich nutzen, um den Mindestabstand zwischen aktueller Position und Ziel abzuschätzen (Luftlinie). Sowas nennt man dann "informierte Suche". Bekannter Algorithmus dafür: A*.
-
Wenn ich das jetzt richtig verstanden habe, müsstest du doch zu jeder Koordinate Infos speichern, welche anderen Koordinaten ohne Probleme direkt zu erreichen sind, und dann wird das Ganze zu einem Problem ähnlich des "Handelsreisenden"(Traveling Salesman Problem)
Gruss
-
CatDog11 schrieb:
Wenn ich das jetzt richtig verstanden habe, müsstest du doch zu jeder Koordinate Infos speichern, welche anderen Koordinaten ohne Probleme direkt zu erreichen sind, und dann wird das Ganze zu einem Problem ähnlich des "Handelsreisenden"(Traveling Salesman Problem)
Hast du offenbar nicht richtig verstanden. Er will nur von A nach B kommen, nicht N Punkte erreichen.
-
okay ich hatte sowieso einen logik fehler in meinem code =(.
jetzt filtere ich die 10 nächsten wegpunkte in einen anderen vector und lass die kürzeste distanz zum endpunkt errechnen.
funktionieren tut es relativ gut nur es braucht leider noch länger =(.
hat jemand vielleicht optimierungsvorschläge?
for (vector<string>::size_type index = 0; index!=svec.size(); ++index) { int max = 0; if(tenwps.size()< 10) { tenwps.push_back(svec[index]); } if(tenwps.size()==10) { for(vector<string>::size_type st = 0; st!=tenwps.size(); ++st) { //some code if(lengthStart>max) { max=lengthStart; stsave=st; } } //////////ERASE LONGEST WP///////// tenwps.erase(tenwps.begin()+stsave);
-
kantaki schrieb:
hat jemand vielleicht optimierungsvorschläge?
Du musst dich immer noch auf Straßen fortbewegen! (Jede Kreuzung ist dann ein Punkt.)
-
cooky451 schrieb:
kantaki schrieb:
hat jemand vielleicht optimierungsvorschläge?
Du musst dich immer noch auf Straßen fortbewegen! (Jede Kreuzung ist dann ein Punkt.)
nein, jede koordinate liegt auf einem weg.
das einzige problem ist das es nicht den kürzesten weg nimmt, sondern immer nur den zielwegpunkt mit der luftdistanz zum ziel berechnet.
Naja zumindest kommt man zum Ziel.
aber die berechnung dauert schon sehr sehr lange
gibt es vielleicht eine alternative zum vector?
-
kantaki schrieb:
gibt es vielleicht eine alternative zum vector?
vector ist die mit Abstand schnellste Datenstruktur überhaupt. Wie wäre es stattdessen mal damit, auf die vielen guten Tipps zu hören die dir hier gegeben wurden, anstatt auf deiner Vorgehensweise zu beharren?
-
Du zeigst immer nur irgendwelche uusammenhangslosen Codefetzen und erklärst überhautp nicht was Du da überhaupt machst.
Auch wenn es mit Sicherheit ziemlich Quatsch ist, erklär doch bitte mal nach welchen Regeln Du den nächsten WP suchst.
http://img17.imageshack.us/img17/5426/appwb.jpgWieso nimmst Du da WP1 und nicht direkt WP5 (oder noch besser direkt WP6). Das ist doch dann ein viel kürzerer Weg. Das ist in Realität natürlich totaler Blödsinn, weil es mit Sicherheit keine direkte Straße von WP0 nach WP5 gibt. Aber die gibt es wahrscheilich genauso wenig von WP0 nach WP1. Aber das scheinst Du ja einfach ignorieren zu wollen.
Frage: Wieso gibt es eine Straße von WP0 nach WP1, aber keine Straße von WP0 nach WP3 (Auf dieser wärst du dann nämlich wohl scheinbar schneller).Erklär mal in deutschen Sätzen, wie Du versucht den nächsten WP zu finden.
-
kantaki schrieb:
nein, jede koordinate liegt auf einem weg.
Ja, das ist einfach ein Designfehler. Was versuchst du zu erreichen?
kantaki schrieb:
ich möchte das als app fürs handy benutzen, da ich gerne fahrrad fahre habe ich die koordianten natürlich nur auf befahrbaren wegen aufgenommen. und falls ein baum kommt muss ich nicht unbedingt dagegen fahren

Aha. Du bewegst dich also auf Straßen/Wegen/Whatever, aber nicht (wie in deinem Programm) auf einem freien Feld, denn da ist der Kürzeste weg von A nach B die Gerade AB!
Speichere bei jeder Krezung bzw. überall dort, wo die Möglicheit besteht abzubiegen, eine Koordinate und dazu zu welchen anderen Kreuzungen du von dort aus gelangen kannst.
Wenn du das für eine Stadt machst, kannst du effizient ausrechnen, welcher der schnellste Weg von A nach B ist.
-
kantaki schrieb:
cooky451 schrieb:
kantaki schrieb:
hat jemand vielleicht optimierungsvorschläge?
Du musst dich immer noch auf Straßen fortbewegen! (Jede Kreuzung ist dann ein Punkt.)
nein, jede koordinate liegt auf einem weg.
Und woher weißt Du, welche Koordinaten direkt von einer bestimmten Koordinate aus erreicht werden können? Wo steht diese Information?
Dein Ziel ist doch, eine "Route" zu berechnen, die an einem bestimmten Punkt S (wie Start) anfängt und an einem bestimmten Punkt E (wie Ende) aufhört. Die Route wäre eine Folge von Punkten [S ? ? ... ? ? E], richtig? Es fehlt jetzt irgendwie die Information, welche Punkte hintereinander in dieser Folge auftauchen dürfen. Gegeben zwei Punkte, P und Q: Woher weiß ich, dass eine Route [... P Q ...] gültig ist? Mit anderen Worten: Gibt es einen direkten Weg von P nach Q? Wo steht diese Information?
Du hast bisher Dein Problem "unterspezifiziert". Da fehlt was. Denk da nochmal drüber nach. Und schau Dir nochmal diese Wikipediaseite an.
-
okay tut mir leid, ich habe noch nie wirklich programmiert und ich finde es sehr schwer ein programm zu designen. ich habe mir einfach überlegt wie ich es anstellen könnte und es umgesetzt.
und vielleicht war mein bild ein wenig unpassend. ich versuche nochmal zu erklären was ich eigentlich erreichen wollte =(.
http://imageshack.us/f/607/nav1.jpg/
ich will:
-mich auf den Wegpunkten bewegen und diese nicht verlassen.
-keine Wegpunkte überspringen.
-möglichst kurzen Weg (start A- Ziel
-nich durch Berge laufen.Meine Überlegung war, dass ich den Wegpunkt nehme der:
1. ...die kürzeste Entfernung zu meiner momentanen Position hat.
2. ...die geringste Entfernung zum Ziel hat.War meine Überlegung so verkehrt?
Entweder meine Überlegung ist total falsch oder meine Programmumsetzung ist einfach nur schlecht.
-
Vielleicht solltest du erst einmal klären, wie du als Mensch das Problem mittels Zettel, Stift, Zollstock und Taschenrechner lösen würdest. Und vor allem, denk mal darüber nach, was deine Aussagen wirklich bedeuten:
-mich auf den Wegpunkten bewegen und diese nicht verlassen.
Häh? Nonsensaussage, du kannst keine Strecke aus endlich vielen Punkten zusammenbauen. Was meinst du wirklich?
-keine Wegpunkte überspringen.
Häh? Nonsensaussage. Wie ordnest du Punkte auf einer Fläche? Wie definierst du überspringen? Was meinst du wirklich?
-möglichst kurzen Weg (start A- Ziel

Ok, das ist eine konkrete Aussage.
-nich durch Berge laufen.
Ist auch ok.
Meine Überlegung war, dass ich den Wegpunkt nehme der:
1. ...die kürzeste Entfernung zu meiner momentanen Position hat.
2. ...die geringste Entfernung zum Ziel hat.Häh? Diese beiden Bedingungen sind im Allgemeinen vollkommen inkompatibel. Was meinst du wirklich?
-
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!