performance frage
-
Verwandle zuerst die Zeilen in double-Triplets, danach vergleichst du. Geht viel schneller als string-Vergleiche. Und natürlich kannst du dann anhand der einzelnen Koordinaten schon Vorauswahlen treffen, welche der Punkte überhaupt in Frage kommen. Dadurch sparst du dir dann eine Menge Vergleiche.
-
pumuckl schrieb:
Verwandle zuerst die Zeilen in double-Triplets, danach vergleichst du. Geht viel schneller als string-Vergleiche. Und natürlich kannst du dann anhand der einzelnen Koordinaten schon Vorauswahlen treffen, welche der Punkte überhaupt in Frage kommen. Dadurch sparst du dir dann eine Menge Vergleiche.
ja sowas ähnliches hatte ich am anfang auch
zb wenn ich die differenz von start und ende nehme, das nur wegpunkte ausgesucht werden die in dieser range liegen.
das problem ist das ich auch umwege gehen muss, die straßen sind ja nicht alle gerade =).
naja ich muss wohl noch ein wenig grübeln.
-
Ich hab jetzt die Regel nicht wirklich verstanden (die kürzeste Distanz ist doch einfach Start mit Endpunkt verbunden
..?), aber scheinbar spielt der nächstgelegende Wegpunkt immer eine Rolle. Um sowas zu beschleunigen kannst du deinen Raum in kleinere Unterräume unterteilen, so dass Du viele Wegpunkte von vornerein ausschließen kannst. Im einfachsten Fall, legst du einfach ein gleichmäßiges Gitter über deinen Raum und sortierst deine Wegpunkte da ein. Wenn das mnoch nicht reicht gibt es eine ganze Reihe bekannter Strukturen (http://en.wikipedia.org/wiki/Space_partitioning#Types_of_space_partitioning_data_structures)
-
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?