Mathematica: Fortschritt und Restrechenzeit anzeigen



F├╝hrt man in Mathematica zeitaufw├Ąndige Berechnungen durch, so w├╝nscht man sich oft eine Fortschrittsanzeige um den Status der Berechnung zu erfahren. Eine einfache Fortschrittsanzeige kann man mit der Funktion ProgressIndicator realisieren.

Als erstes definiert man eine Variable, die den aktuellen Fortschritt beschreibt. Wird beispielsweise ein Feld durchlaufen, so gibt diese Variable die Position, an der gerade eine Berechnung durchgef├╝hrt wird an. Ich nenne sie hier iter.

Anschlie├čend benutzt man die Funktion ProgressIndicator und ├╝bergibt als Argument den Iterator (iter), wobei man angeben muss, dass er dynamisch ist.

ProgressIndicator[Dynamic[iter], {1, maxIter}]

Um jetzt den Fortschritt einer Berechnung anzuzeigen muss man in der Berechnung dem Iterator immer die aktuelle Laufvariable zuweisen.

Am Beispiel von Selectionsort k├Ânnte es so aussehen:

maxIter = 1000; (* Maximale Anzahl von Zahlenwerten *)

iter = 0; (* aktueller Fortschritt.  iter <= maxIter *)

(* Fortschrittsbalken einbauen. iter gleich maxIter ÔÇô> 100% *)
ProgressIndicator[Dynamic[iter], {1, maxIter}]  


(* Liste mit Zufallswerten *)
numb = Table[Random[Integer, {1, 10000}], {x, 1, maxIter}];

(* Selectionsort *)
For[i = 1, i < maxIter, i++,
 minpos = i;
 For[j = i + 1, j <= maxIter, j++,
  If[numb[[j]] < numb[[minpos]], 
   minpos = j, 
   ]
  ];
 temp = numb[[i]];
 numb[[i]] = numb[[minpos]];
 numb[[minpos]] = temp;
 iter = i; (* iterator aktualisieren*)
 ]

Fortschrittsbalken

Optimal w├Ąre nat├╝rlich auch eine Restrechenzeitangabe. Die einfachste M├Âglichkeit ist eine lineare Zeitinterpolation, die je nach dem wie man den Iterator setzt f├╝r eine Absch├Ątzung der Restzeit gut genug sein soll.

F├╝gt man den diesen Codeblock anstatt ProgressIndicator in dem oberen BeispielÔÇŽ

Dynamic[
 {{"Status:", 
    ProgressIndicator[iter, {0, maxIter}], (iter/maxIter)*100.0, "%"},
   {"Restzeit (min):", 
    AccountingForm[((maxIter - 
          iter)/((iter + 0.0001)/(AbsoluteTime[] - startTime)))/
      60, {Infinity, 1}], "", ""}} // MatrixForm
 ]
startTime = AbsoluteTime[];

ÔÇŽ so sieht die Aussage folgenderma├čen aus.
Fortschrittsbalken

Viel Spa├č beim Warten und Tee trinken ;)




Trackback URI | Kommentare als RSS

Einen Kommentar schreiben

XHTML: Du kannst folgende Tags verwenden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <sub> <sup>

Hinweis: Ich behalte mir das Recht vor solche Kommentare, die Beleidigungen oder rechtswidrige Inhalte beinhalten erst nach einer Editierung freizugeben oder kommentarlos zu löschen. Ähnliches gilt auch für Kommentare die offensichtlich nur der Suchmaschinenoptimierung dienen.