Thomas Streckenflugoptimierung

Hier findest Du ein kostenloses Programm welches aus einer IGC-Datei, die 5 besten Wegpunkte ermittelt. Eine Kurzanleitung zur Dokumentation via GPS findest Du auf einer anderen Seite.

Das Programm wurde von optigc in olc2002 umbenannt, um Verwechslungen mit dem von Segelfliegern verwendeten opti zu vermeiden. Zukünftige Versionen des Programms bei Regeländerungen werden entsprechend olc2003 usw. heißen.

Das folgende Programm ist mein geistiges Eigentum. Ich stelle es der Allgemeinheit kostenfrei zur Verfügung. Der Quellcode und Teile daraus, dürfen für eigene Entwicklungen verwendet werden, wenn die dabei enstehende Software ebenfalls kostenfrei angeboten wird. Dank an Dr.Dietrich Münchmeyer und Andreas Rieck für Anregungen!

Thomas Kuhlmann, Berlin. Kontakt: coooly @ freenet de

Benutzung (wie ist das Programm zu bedienen)

Das Programm hat keine graphische Schnittstelle. Es wird einfach von der Kommandozeile (MS-DOS-Eingabeaufforderung) mit olc2002 igc-Dateiname gestartet (und eignet sich deshalb evtl. besonders für eine Serverbasierte Optimierung, oder zum Mitnehmen auf Diskette in den Urlaub fürs Internetcafe). Trackpunkte werden aus einer vorhandenen IGC-Datei eingelesen. Das Auslesen von GPS-Loggern wird nicht unterstützt. Zum Auslesen und Erzeugen der IGC-Datei können z.B. Programme wie g7towin oder GpsDump3.23 verwendet werden.
Bei Tracks mit sehr vielen Punkten, die inhomogene Abstände aufweisen kann die Berechnung einige Minuten dauern. Durch drücken von Ctrl-C kann man bereits vor Programmende die bisher besten Zwischenergebnisse ausgeben lassen.
Das Programm hat den Anspruch eine der besten Lösungen zu finden, daher die manchmal etwas langsame Berechnung. Andere Optimierer lassen zur Einsparung von Rechenzeit Trackpunkte aus und verschenken dabei meist ein paar hunderstel Punkte, im Extremfall werden von solchen Optimieren auch FAI-Dreiecke übersehen.

Download neu: 25.07.2002Version2.03Bytes
Ausführbares Programm für Windowsolc2002.exe36751
Ausführbares Programm für Linuxolc200217488
Ausführbares Programm für Solarisolc2002.sun24420
Quellcode des C-Programmsolc2002.c26512

Sollte es beim Download Probleme geben, probiere die mirror-site: fly.united.net.kg

Ab Version2 ist die Anzahl der Trackpunkte nur durch den vorhandenen Speicher begrenzt. Der Rechenaufwand für Tracks mit besonders vielen Punkten konnte reduziert werden (ist meist kleiner n^3). Es werden Warnungen ausgegeben, wenn unrealistische Trackpunkte mit sehr hoher Geschwindigkeit zwischen zwei Punkten gefunden werden oder Zeitsprüne in die Vergangenheit im Track sind (diese sollte man aus dem Track entfernen, falls sie nicht korrekt sind, kann an GPS-Aufzeichnungsfehlern liegen).
Ab Version2 werden zusätzlich die Zeiten der Wertungspunkte ausgegeben (die man für die Meldung beim OLC gebrauchen kann).

Mit der Option -v wird der verbose mode eingeschaltet, bei dem alle eingelesenen Trackpunkte angezeigt werden (wenn man z.B. die Aufzeichnungsintervalle kontrollieren möchte).
Mit der Option -sSPEED kann man angeben, ab welcher Geschwindigkeit SPEED in km/h Warnungen ausgegeben werden sollen (Voreinstellung 90km/h über Grund).

Mit der Option -bhh:mm:ss kann man den Trackbeginn markieren (falls man ungültige Punkte am Anfang überspringen möchte. Bei der Angabe dieses Startzeitpunkts der Wertung kann man die Sekunden oder auch Sekunden und Minuten weglassen.

Mit der Option -ehh:mm:ss kann man den Trackende markieren (falls man ungültige Punkte am Ende auslassen möchte. Bei der Angabe dieses Endzeitpunkts der Wertung kann man die Sekunden oder auch Sekunden und Minuten weglassen.

Mit der Option -h bekommt man eine Kurzhilfe zu den möglichen Optionen und die Versionsnummer angezeigt (z.B. zur Mitteilung von Fehlern im Programm).


OLC-Optimierung selbstprogrammiert / Wie funktionierts?

Will man selbst eine OLC-Optimierung programmieren, wird man mit folgenden Problemen konfrontiert:

Distanz zwischen zwei GPS-Tracklogpunkten

Die Distanz zwischen 2 Punkten berechnet sich wie folgt:

s=6371km*acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon1-lon2))

Dabei ist 6371km der von der FAI vorgegebene Erdradius (man könnte auch mit einem anderen Radius (siehe Lehrbücher) rechnen oder mit einer eliptischen Näherung, bekommt dann aber vom OLC-Server leicht abweichende Ergebnisse). lat1, lat2 sind die georaphischen Längen und lon1, lon2 die Breiten der Punkte 1 und 2 im Bogenmaß. Umrechnung von Winkel ins Bogenmaß: *PI/180 (zuvor Minuten und Sekunden in Grad umrechnen). sin() und cos() sind die Sinus- und Kosinusfunktionen. acos() ist die Umkehrfunktion des Kosinus: Arcuskosinus.

Es gibt auch eine andere Formel die mit Arcussinus, Sinus, Kosinus und Wurzelfunktion arbeitet:

s=6371km*asin(sqrt(sin((lat1-lat2)/2))^2+sin((lon1-lon2)/2)^2*cos(lat1)*cos(lat2))

Diese Formel ist weniger anfällig für Rundungsfehler. Da Distanzen beim OLC aber ohnehin auf 100stel Kilometer = Dezimeter gerundet werden (zumindest die Punkte), ist diese aufwändiger zu berechnende Formel nicht notwändig.

Berechnung der besten Punkte brut force

Ein stupides Rechenprogramm kann wie folgt vorgehen: Angenommen der Track hat n Logpunkte, dann ist die Rechenzeit eines solchen Programms proportional zu n*n*n*n*n=n hoch 5. In der Praxis rechnet ein Programm nach diesem Schema bei mehr als 200 Punkten auf den derzeit üblichen Rechnern mehrere Stunden, bei 1000 Punkten muß man mehrere Tagen Rechenzeit einplanen. Das ist für die Praxis nicht brauchbar, so daß man verschiedene Methoden zur Rechenbeschleunigung ansetzen kann, von denen ich im Folgenden einige beschreibe.

Berechnung der besten Punkte einfach beschleunigt

Eine einfache Art der Beschleunigung ist: man nimmt einfach nur jeden xten Punkt aus dem Track, so daß man nur noch weniger als 200 Punkte betrachten muß. Dann kann man nach obigem brut force Ansatz alle Möglichkeiten ausprobiern. Nachteil: man findet nicht mehr garantiert die allerbeste Lösung. In der Praxis findet man ganz gute Lösungen die nur selten um mehr als einen Punkt von der besten Lösung abweichen. Dabei kann man aber auch Pech haben, und bei ungünstigem Trackverlauf insbesondere bei Dreiecken, z.B. ein FAI-Dreieck übersehen und dann nur den Wichtungsfaktor für ein flaches Dreieck bekommen, so daß man evtl. doch mehr als einen Punkt je Flug weniger bekommt.

Folgende Beschleunigungsmöglichkeiten haben nicht den Nachteil, daß man die beste Lösung evtl. übersieht:

Alle diese Beschleunigungen bringen aber maximal den Faktor 10, was in Anbetracht eines Aufwandes von n hoch 5 nicht allzuviel ist (bei großen Tracks).

Berechnung der besten Wegpunkte stark beschleunigt

Man teilt die Strecke wie folgt in Teilstrecken auf, die man unabhängig und getrennt voneinander optimieren kann.

Ich wähle Wegpunkte 1WP und 3WP fest und kann nun unabhängig voneinander die 3 Teilstrecken e=SP-1WP, a=1WP-2WP + b=2WP-3WP, f=3WP-EP optimieren. Das macht Aufwand in der Größenordnung von 3*n/3=n. Dann variere ich über alle 1WP und 3WP mit Aufwand n*n. Macht insgesamt Aufwand in der Größenordnung von n hoch 3.

Dabei muß man jedoch beachten, daß man für freie Strecke Start- und Endpunkt so optimiert, daß die Strecken e und f jede für sich maximal wird. Damit man das nicht innerhalb der n^3 Schleife immer wieder machen muß, macht man es vorab, und speichert die besten Startpunkte für jeden ersten Wendepunkt und die besten Endpunkte für jeden dritten Wendepunkt in Vektoren ab.

Die so optimierten Start- und Endpunkte kann man für Dreiecke nicht verwenden, den für Dreiecke gilt es bei festem ersten und dritten Wegpunkt (unabhängig von der Lage des zweiten Wendepunktes), Start- und Endpunkt so zu wählen, daß die Strecke d zwischen Start- und Endpunkt minimal wird. Dabei können Start- und erster Wendepunkt, sowie End- und dritter Wendepunkt jeweils zusammenfallen, in diesem Fall entspricht d dem dritten Dreiecksschenkel c.

Das Finden eines minimalen d für alle 1WP und 2WP kann man auch ausserhalb der n^3-Schleife vorab mit quadratischem Aufwand machen und das Ergebnis in einer dmin(WP1, WP3)-Matrix abspeichern. Dabei kann man sich zu Nutze machen, daß man nicht alle Kombinationen von SP, EP, WP1, WP3 durchrechnen muß, sondern sich die Ergebnisse sukksessive aus vorherigen Ergbnissen berechnen lassen. Beispiel: Man wählt den Startpunkt ganz vorne und den Endpunkt ganz hinten (nun hat man für WP1=erster Punkt, WP3=letzter Punkt) bereits das beste d gefunden. Nun erhöht man den Startpunkt um einen Trackpunkt und falls dabei ein kleiners d ensteht hat man sofort den Matrixeintrag für dmin(2ter Punkt, letzter Punkt) gefunden. Wenn man alle Möglichkeiten für den Startpunkt durch ist, legt man den Endpunkt einen Trackpunkt weiter nach vorne, und macht das gleiche nochmals, wobei man auf die bereits gefundenen besten Lösungen für den Endpunkt ganz hinten zurückgreifen kann. Dann schiebt man den Endpunkt noch ein Stück nach vorne usw. ...

Zusätzliche Beschleunigung durch Auslassen von Punkten die keine bessere Lösung liefern (in Version2 umgesetzt)

Ein weiterer Lösungsinvarianter Ansatz macht sich zu Nutze, daß wir mit einer gewissen, Minimal bzw. Maximalgeschwindigkeit fliegen. Das bedeutet, daß bei festem Aufzeichnungsintervall die zurückgelegte Strecke zwischen zwei aufeinanderfolgenden Trackpunkten einen bestimmten Maximalwert nicht überschreitet. Selbt wenn das Aufzeichnungsintervall variabel ist, gibt es eine maximale Entfernung zwischen zwei aufeinanderfolgenden Trackpunkten, die man bereits beim Einlesen der Punkte bestimmen kann.

Angenommen die bisher beste gefundene Gesamtstrecke sei 20km. Seien erster und dritter Wendepunkt schon fest gewählt und die besten Start- und Endpunkte vorab berechnet. Wir haben also die Teilstrecken e, f, d und c schon bestimmt. Nun probieren wir einen zweiten Wendepunkt aus, so daß man die Strecken a und b berechnen kann. Es ergibt sich für freie Strecke eine Streckensumme von e+a+b+f von z.B. 18km. Dieser zweite Wendepunkt ist also nicht besser als das bisherige Maximum. Wenn wir aber wissen, daß der nächst Punkt maximal z.B. 100m entfernt liegt, können wir uns sparen, den nächsten Punkt auszuprobieren, da die Gesamtstrecke maximal 200m größer sein kann (a und b könnten bestenfalls jeweils um diesen Wert wachsen). Wir können sogar noch weiter gehen und die nächsten 20km-18km/200m=10 Punkte überspringen, da auch die keine bessere freie Strecke liefern werden.

Es ist zu prüfen, ob durch das Überspringen von Punkten nicht Dreiecke ausgelassen werden. Für Dreiecke muß gelten: d*5 <= a+b+c. Angenommen c=10km, a=6km, b=6km, d=9km, damit ein Dreieck ensteht muß gelten: a+b >= d*5 - c = 45km - 10km = 35km. Um eine solche Summe a+b zu erreichen müßten a+b von derzeit jeweils 6km auf 17.5km anwachsen. Bei einem maximalen Punkteabstand von 100m können wir also die nächsten 17.5km-6km/100m=115 Punkte für Dreiecke überspringen. Nicht nur diese auch die 115 Punkte davor! Man könnte also Stichprobenweise im Track Punkte ausprobieren und dadurch ganze Bereiche als nicht besser markieren.

Für Version2 wurde folgendes Verfahren umgesetzt:

In der innersten Programmschleife wird der 2te Wendepunkt variiert um bessere Lösungen zu finden. Für Freie Strecke ist die Wertungsstrecke:

w = e + a + b + f

Probiert man nun für WP2 einen Nachbartrackpunkt, so ändern sich dadurch nur die Teilstrecken a + b. Sei dMax die maximale Distanz zwischen zwei beliebigen Trackpunkten, dann werden durch Verschieben von WP2 um einen Trackpunkt a+b je maximal um dMax größer. Verschiebt man um k Trackpunkte, so ist die neue Wertungsstrecke dann:

w' <= e + a + b + k*2*dMax +f = w + k*2*dMax

Daraus kann man die Schrittweite k berechnen, wieviele direkte Nachbarpunkte man auslassen kann, wenn man mindestens die Wertungsstrecke w' erreichen möchte.

k >= (w' - w)/(2*dMax)

Nimmt man für w' die beste bisher gefundene Wertungsstrecke, so berechnet man also wieviele Trackpunkte man mindestens weitergehen muß um eine noch bessere Lösung zu finden (dann muß k sogar echt größer als der angebene Term sein).

Man muß dabei natürlich aufpassen, keine Dreicke zu überspringen, für die gelten muß:

d <= 20% (a+b+c)
d.h.: 5*d <= a + b + c

Durch verschieben von WP2 verändern sich wieder nur a+b, c und d bleiben unberührt. Angenommen diese Dreiecksbedingung war gerade nicht erfüllt, wieviele Trackpunkte kdsollte man dann mindestens weitergehen, damit sie erfüllt wird?:

5*d <= a + b + kd*2*dMax + c
d.h.: kd >= (5*d - a - b - c)/(2*dMax)

Um keine Dreiecke und keine besseren Freien Strecken zu überspringen, geht man also:

MIN( k, kd )

Trackpunkte weiter (d.h. man läßt genau diese Punkte aus).

Allerdings kann man u.U. doch weitere Punkte auslassen, wenn man nälich keine besseren Dreiecke als bereits gefunden, zu erwarten hat. Für die Wertungsstrecke beim Dreieck gilt:

w = a + b + c - d

Wie bei Freier Stecke ergibt sich daraus für ein flaches Dreieck kflach:

kflach >= (w' - w)/2*dMax

wenn man für w' das beste bisherige flache Dreieck nimmt. Analog berechnet man für das FAI-Dreick eine Schrittweite kfai. Die tatsächliche Schrittweite ist dann:

MAX(1,MIN(k,MAX(kd,MIN(kflach,kfai))

Diesen Ansatz kann man auch für die zweitinnerste Schleife verfolgen in der der dritte Wendepunkt WP3 variiert wird. Dabei ist jedoch zu beachten, daß sich nun mehr Teilstrecken ändern können (also andere Faktoren als 2*dMax). Ausserdem muß man zur Berechnung der aktuellen Wertungsstrecke w die beste Wertungsstrecke für den zuletzt betrachteten WP3 ansetzten. Die Details entnehme man dem getesteten Quellcode.

Auch für die Schleife die über die erste Wende WP1 variiert, kann man jeweils wieder neue variable Schrittweiten berechnen. Allerdings muß man dazu die lokalen Maxima für den letzten Schleifendurchlauf für w berechnen. Dies ist in Version2 noch nicht implementiert.

Bewertung der letzten Beschleunigungsmethode (variable Schrittweite)

Die Methode erzeugt zunächst einmal zusätzlichen Berechnungsaufwand in allen Schleifen (auch der innersten), da die adaptiven Schrittweiten k... berechnet werden müssen. Für ungünstige Tracks kann sich also sogar eine längere Berechnung ergeben. Dies ist genau dann der Fall, wenn die Maximale Distanz zwischen 2 benachbarten Punkten gegenüber der Wertungsstrecke w nicht klein genug ist. Beispielsweise ein Track mit maximal 50km freier Strecke, aber es gibt zwei Punkte mit 5km Abstand. In der Regel deutet sowas auf variierende Aufzeichnungsintervalle oder Aufzeichnungsfehler des GPS hin (Zwischenpunkte liegen vollkommen neben der Route). Diese Punkte sollte man aus dem Track entfernen. Sie werden durch die Warnungen (übergroße Geschwindigkeiten) entdeckt.

Für Tracks mit durchweg kleinen Aufzeichnungsintervallen und vielen Trackpunkten wird eine deutliche Beschleunigung erreicht, da zwischen benachbarten Trackpunkten meist nur eine kleine Distanz liegt, so daß man sehr viele Trackpunkte für die nächstbeste Lösung überspringen kann. (Ein Track mit 6800 Punkten im Sekundenabstand wurde in wenigen Minuten Optimiert).


Falls jemand einen Fehler entdeckt bitte bei mir melden: coooly @ freenet . de