Ich bin Debugging Optimierungsroutine. Ich produziere eine Log-Textdatei, in der ich den Zielfunktionswert bei jeder Iteration in der Optimierungsroutine nachverfolge. HierC++, sehr unerwartet -1 # INF
ist der Kontext: I mit einem Kurvenanpassung Problem zu umgehen, mit einem Modell, das linear in den vier Parametern und Polynom in den X-Daten
Y = PARAM1*X^3+PARAM2*X^2+PARAM3*X+PARAM4
ist und ich laufe Optimierungsroutine auf unnoised unvoreingenommenen Daten aus diesem Modell generiert, um den Algorithmus zu testen.
In der Protokolldatei zeigt der erste Optimierungsschritt kein Problem. Funktionsauswertungen haben einen doppelten Wert. Bei jeder Iteration werden 5 Funktionswerte berechnet (und in der Protokolldatei angezeigt). Ab einer gegebenen Iteration werden die Dinge sauer: Eine Funktionsbewertung wird -1#INF
, obwohl die objektive Funktion genau an diesem Punkt (!) Bereits erfolgreich evaluiert wurde. In den nächsten Iterationen wird der "schlechte Punkt" bei -1#INF
ausgewertet, und eins nach dem anderen werden auch am Ende bei -1 # INF ausgewertet. Die Berechnung von Y an diesen Punkten ist angesichts der Formel und angesichts der Tatsache, dass sie vorher richtig bewertet wurden, kein Problem.
Auch ich vermute eine andere Ursache, wie Speicherverwaltung. Hättest du eine Idee oder einen Ratschlag, um das Problem näher zu verfolgen?
bearbeiten
Ich sehe das erste Vorkommen von -1#INF
in Protokolldatei. Die Funktion wird bei jeder Iteration an 5 Punkten bewertet, aber nur einer dieser 5 Punkte ist ein "neuer Punkt". Wenn -1#INF
zum ersten Mal angezeigt wird, wurde die Funktion zu diesem Zeitpunkt bereits erfolgreich ausgewertet.
Es sieht aus wie
ITERATION N-1
f1 559.011
f2 560.034
f3 562.034
f4 560.342
f5 560.344
ITERATION N
f1 -1#INF
f2 560.034
f3 558.034
f4 560.342
f5 560.344
wo bei ITERATION N
nur f3
eine Funktionsauswertung an einem neuen Punkt ist, und f1 die Funktionsauswertung an der gleichen Stelle ist als f1 in ITERATION N-1
ist.
Was genau meinen Sie mit "erfolgreich evaluiert"? Sind Sie sicher, dass weder ein Überlauf noch eine Division durch Null aufgetreten ist? – celtschk
Speicherverwaltung ist zweifelhaft das Problem. Ihr iterativer Algorithmus ist divergierend. Versuchen Sie und finden Sie die erste Berechnung, die INF erzeugt. – Potatoswatter
Verwenden Sie einen Debugger (oder fügen Sie print-Anweisungen hinzu), um die genaue Codezeile aufzuspüren, die den Fehler verursacht. –