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 deDas 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.2002 | Version2.03 | Bytes |
---|---|---|
Ausführbares Programm für Windows | olc2002.exe | 36751 |
Ausführbares Programm für Linux | olc2002 | 17488 |
Ausführbares Programm für Solaris | olc2002.sun | 24420 |
Quellcode des C-Programms | olc2002.c | 26512 |
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).
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.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:
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. ...
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
5*d <= a + b + kd*2*dMax + c
d.h.: kd >= (5*d - a - b - c)/(2*dMax)
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.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).