Generierung lokaler Optimierungen - IPD Snelting

Generierung lokaler Optimierungen - IPD Snelting Generierung lokaler Optimierungen - IPD Snelting

pp.info.uni.karlsruhe.de
von pp.info.uni.karlsruhe.de Mehr von diesem Publisher
25.10.2012 Aufrufe

4 Implementierung Für die Durchführung bestehen unterschiedliche Möglichkeiten, die sich im Zeitpunkt der Ausführung, sowie in der Zusammensetzung der Testvektoren unterscheiden. Variante 1 Für jeden Vergleich zwischen einem neu erzeugten Muster m und einem bestehenden optimalen Muster m ′ werden die Ergebnisse neu berechnet und verglichen (vgl. Listing 4.2). Dies hat den Vorteil, dass keine Ergebnisse zwischengespeichert werden müssen, allerdings auch den Nachteil, dass die Berechnung der Ergebnisse für bereits bekannte Muster ständig wiederholt wird. Da die Ergebnisse für jeden Vergleich neu bestimmt werden, besteht bei dieser Variante die Möglichkeit, die Testvektoren bei jedem Vergleich zu variieren. Listing 4.2 Vorabtest – Variante 1 1: function Vorabtest1(m, MOpt) 2: MCand ← CreateEmptyList() ⊲ Liste für Erfüllbarkeitstest Kandidaten 3: T V ← GetTestvectors() ⊲ Liste der Testvektoren 4: 5: for all m ′ ∈ MOpt do 6: equal ← true 7: for all t ∈ T V do 8: if Result(m, t) �= Result(m ′ , t) then ⊲ Ergebnisse unterschiedlich? 9: equal ← false ⊲ ⇒ m ′ kein Kandidat 10: break 11: end if 12: end for 13: if equal then 14: StorePatternInto(MCand, m ′ ) ⊲ m ′ ist Kandidat 15: end if 16: end for 17: 18: return MCand 19: end function Variante 2 Eine weitere Möglichkeit zeigt Listing 4.3. Die Idee dieser Variante besteht darin, die Ergebnisse für jedes neu erzeugte Muster m nur einmal zu berechnen und anschließend zu speichern (Zeile 6–11), so dass sie für spätere Vergleiche immer wieder verwendet werden können (Zeile 17). Dies spart Rechenzeit, benötigt jedoch Speicher. Zudem müssen die Testvektoren zu Beginn des Generierungsvorgangs festgelegt sein und können dann 40

4 Implementierung nicht mehr verändert werden, da andernfalls die zu vergleichenden Ergebnisse auf unterschiedlichen Testvektoren beruhen würden und somit nicht mehr vergleichbar sind. Listing 4.3 Vorabtest – Variante 2 1: function Vorabtest2(m, MOpt) 2: MCand ← CreateEmptyList() ⊲ Liste für Erfüllbarkeitstest Kandidaten 3: T V ← GetTestvectors() ⊲ Liste aller Testvektoren 4: n ← Count(TV) ⊲ Anzahl der Testvektoren 5: 6: i ← 0 7: for all t ∈ T V do 8: res ← Result(m, t) ⊲ wird für jedes Muster nur einmal bestimmt 9: m.results[i] ← res 10: i ← i + 1 11: end for 12: 13: for all m ′ ∈ MOpt do 14: i ← 0 15: equal ← true 16: while i < n do 17: if m.results[i] �= m ′ .results[i] then ⊲ Ergebnisse unterschiedlich? 18: equal ← false ⊲ ⇒ m ′ kein Kandidat 19: break 20: end if 21: i ← i + 1 22: end while 23: if equal then 24: StorePatternInto(MCand, m ′ ) ⊲ m ′ ist Kandidat 25: end if 26: end for 27: 28: return MCand 29: end function Verwendete Variante Im Rahmen dieser Arbeit wird eine Kombination aus beiden Varianten verwendet, die zusätzlich durch den Einsatz einer Hash-Funktion ergänzt wird. Listing 4.4 stellt den konkreten Ablauf dar. Um das Problem des höheren Speicherverbrauchs von Variante 2 gegenüber Variante 1 zu vermeiden, werden nicht die Ergebnisse gespeichert, sondern es wird aus ihnen ein Hashwert gebildet. Die hierzu verwendete Hashfunktion h besteht aus einer einfachen Gewichtung der Ergebnisse, die in der Reihenfolge in der sie berech- 41

4 Implementierung<br />

Für die Durchführung bestehen unterschiedliche Möglichkeiten, die sich im Zeitpunkt<br />

der Ausführung, sowie in der Zusammensetzung der Testvektoren unterscheiden.<br />

Variante 1<br />

Für jeden Vergleich zwischen einem neu erzeugten Muster m und einem bestehenden optimalen<br />

Muster m ′ werden die Ergebnisse neu berechnet und verglichen (vgl. Listing 4.2).<br />

Dies hat den Vorteil, dass keine Ergebnisse zwischengespeichert werden müssen, allerdings<br />

auch den Nachteil, dass die Berechnung der Ergebnisse für bereits bekannte Muster<br />

ständig wiederholt wird. Da die Ergebnisse für jeden Vergleich neu bestimmt werden,<br />

besteht bei dieser Variante die Möglichkeit, die Testvektoren bei jedem Vergleich zu<br />

variieren.<br />

Listing 4.2 Vorabtest – Variante 1<br />

1: function Vorabtest1(m, MOpt)<br />

2: MCand ← CreateEmptyList() ⊲ Liste für Erfüllbarkeitstest Kandidaten<br />

3: T V ← GetTestvectors() ⊲ Liste der Testvektoren<br />

4:<br />

5: for all m ′ ∈ MOpt do<br />

6: equal ← true<br />

7: for all t ∈ T V do<br />

8: if Result(m, t) �= Result(m ′ , t) then ⊲ Ergebnisse unterschiedlich?<br />

9: equal ← false ⊲ ⇒ m ′ kein Kandidat<br />

10: break<br />

11: end if<br />

12: end for<br />

13: if equal then<br />

14: StorePatternInto(MCand, m ′ ) ⊲ m ′ ist Kandidat<br />

15: end if<br />

16: end for<br />

17:<br />

18: return MCand<br />

19: end function<br />

Variante 2<br />

Eine weitere Möglichkeit zeigt Listing 4.3. Die Idee dieser Variante besteht darin, die<br />

Ergebnisse für jedes neu erzeugte Muster m nur einmal zu berechnen und anschließend<br />

zu speichern (Zeile 6–11), so dass sie für spätere Vergleiche immer wieder verwendet werden<br />

können (Zeile 17). Dies spart Rechenzeit, benötigt jedoch Speicher. Zudem müssen<br />

die Testvektoren zu Beginn des <strong>Generierung</strong>svorgangs festgelegt sein und können dann<br />

40

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!