Laufzeitüberlegungen

Centurion ist ein ausgefeilter Optimierer. Er reduziert die Anzahl der theoretischen Möglichkeiten entsprechend Deiner Angaben auf intelligente Art und Weise, um schnell zur Antwort zu gelangen. Dennoch gibt es Situationen, in denen die Laufzeit groß ist, insbesondere bei Mehrwellen-Optimierungen und wenn sehr viele verschiedene Truppenarten zur Verfügung stehen.

Diese Seite diskutiert einige Möglichkeiten, als Anwender die Laufzeit des Centurion unter Kontrolle zu halten.

## Truppenvielfalt und Bereiche begrenzen

Wenn Du einen Optimierungsauftrag qualifizierst, denke darüber nach, welche Truppen und wieviele von ihnen Du wirklich erlauben willst.:

* Wenn Du zwei Wellen optimierst, brauchst Du wirklich R-K in beiden Wellen? Vielleicht reicht es, bei der ersten Welle \*B;\*LB oder nur eines von beiden zu setzen.
* Brauchen alle Truppen wirklich die Wildcard \*, also die volle Spanne bzw. 0-MAX? Vielleicht ist weniger auch sinnvoll. Eine erste Welle kann vielleicht statt \*RIT auch 0-50RIT haben.
* Hast Du vielleicht schon eine Ahnung, was für die Hauptwelle sinnvoll ist? Anstatt dann B-K oder SK-BEL zu sagen reicht vielleicht auch ein \*R;\*M;\*K oder \*BSK;\*RIT;\*BSS. Dabei lande ich jedenfalls oft. Der Suchraum für Centurion wird damit drastisch begrenzt.

## Iterationen begrenzen

Während der Optimierer verschiedene Angriffskonfigurationen durchgeht, werden diese jeweils 1000x simuliert um eine Aussage darüber treffen zu können, wie die Konfiguration zu bewerten ist. Die Zahl 1000 ist einstellbar, und zwar mit einem Eingabefeld bzw. Köpfen oder direkt in der Kommandozeile als „-Iterations=n“.

Eine geringere Iterationszahl sorgt dafür, dass das Ganze schneller geht. Bei einer höheren dauert es länger. Man kann also versuchen, den Optimierungsvorgang zu beschleunigen, indem man die Iterationszahl vorsichtig absenkt.
Ich sage vorsichtig, denn hohe Iterationszahlen sind eigentlich eine gute Sache. Je öfter eine Angriffskonfiguration simuliert wird, umso verlässlicher und belastbarer sind die Bewertungen.

*Beispiel: Man optimiert einen Lock und Centurion simuliert eine bestimmte Konfiguration um zu sehen, was sie leistet. Bei 500x kommt heraus, dass sie mindestens 120s Sekunden hält. Es könnte aber sein, dass es bei 1000x eine Simulation gibt, die doch nur 100s hält. Dann geben wir uns bei 500x der Illusion hin wir hätten eine “sichere“ Lösung gefunden, die garantiert 120s hält. Vielleicht hält diese Lösung in 99.9% der Fälle 120s oder länger, aber es kann passieren, dass sie nur 100s hält.*

Bei kritischen Optimierungen, etwa knappen Locks, würde ich niemals die Itera¬tions¬zahl senken, sondern eher auf 10000x hochgehen. Bei weniger kritischen Opti¬mie¬rungen oder wenn man nur eine grobe Vorhersage will, in welche Trup¬pen-rich¬tung die Lösung geht, kann man auch mal senken.

## Zielgitter („TargetGrid“)

Am Anfang der Optimierung beginnt Centurion, sich im Suchraum mit allen möglichen Angriffskonfigurationen auf einem 64er Gitter umzusehen. Das bedeutet, dass die einzelnen Truppenstärken zunächst probeweise nur mit vielfachen von 64 belegt werden. Diese Belegungen werden simuliert und dann zum 32er Gitter übergegangen, wobei die Grenzen des Suchraums auch sinnvoll verengt werden. Danach weiter zu einem 16er, 8er, 4er, 2er, 1er Gitter. 1 ist der Standard als „Zielgitter“, außer bei UsefulGenerals, da geht es nur bis 16.

Muss man nun wirklich bis runter zum 1er Gitter? Reicht nicht vielleicht auch 8 oder 4? Oft ist die 4er Lösung nicht so viel schlechter als die 1er Lösung. Das Zielgitter kann man in der Kommandozeile spezifizieren, indem man angibt:

```
-TargetGrid=<n>

```

wobei <n> 16 oder 8 oder 4 oder 2 oder 1 ist.

## Nutze Zwischenergebnisse

Während Dein Optimierungsauftrag abgearbeitet wird sieht man in der Spalte “Current Best” das aktuell beste Zwischenergebnis. Beobachte dieses Zwischenergebnis! Vielleicht ist es ja bereits für Dich akzeptabel. Dann kann man auch das spielen. Zwischenergebnisse sind genauso verlässlich wie Endergebnisse, nur eben vielleicht nicht ganz optimal.

## Thread Priority

Jeder Optimierungsauftrag läuft in einem eigenen Thread innerhalb des Centurion Prozesses. Thread ist ein Begriff aus der Windows Welt und jeder Thread hat eine Eigenschaft „Thread Priority“. Je höher diese Priority ist umso mehr CPU Zeit bekommt ein Thread, d.h. umso schneller ist er fertig. Optimierungs-Threads in Centurion laufen mit der Priority “BelowNormal”, was relativ gering ist. Das wurde aus folgenden Gründen so gemacht:

* Man startet wahrscheinlich eine ganze Reihe von Optimierungsaufträgen in einer Centurion Sitzung. Würde jeder dieser Threads mit einer hohen Prio laufen, würde sich das aufaddieren und Deine CPU ziemlich böse beschäftigen.
* Niedrige Thread Priority führt dazu, dass andere Programme nicht ausgebremst werden. Vielleicht spielst Du ja nebenher auf DSO und eine hohe Centurion Thread Prio würde nichts Gutes bedeuten für die Reaktionszeit des Spiels…

In zukünftigen Versionen wird man vielleicht die Thread Priority setzen können, im Moment ist das nicht der Fall.
Hinweis: Zwei Centurion Sessions mit je 10 laufenden Jobs arbeiten schneller als eine Session mit 20 Jobs.